Jump to content
  • Advertisement
Sign in to follow this  
Verideth

Voxel engine not drawing chunks? glDrawArrays not working?

This topic is 397 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I've recently been working on a voxel engine, but I've ran into a small problem. My voxel engine chunks, will not draw for some odd reason. I've been having trouble with this for a few hours now. I've debugged in RenderDoc, everything seems fine. I'm starting to think somethings wrong with how I setup my functions. Here is the code:
 
void Chunk::createMesh()	
{
	int i = 0;
	this->shader.loadShader("chunk.vs", "chunk.fs");

	for (int x = 0; x < CHUNK_SIZE; x++) 
	{
		for (int y = 0; y < CHUNK_HEIGHT; y++)
		{
			for (int z = 0; z < CHUNK_SIZE; z++)
			{
				GLuint currentBlock = this->blockCur[x][y][z];

				this->vertex[i++] = byte4(x, y, z, currentBlock);
				this->vertex[i++] = byte4(x, y, z + 1, currentBlock);
				this->vertex[i++] = byte4(x, y + 1, z, currentBlock);
				this->vertex[i++] = byte4(x, y + 1, z, currentBlock);
				this->vertex[i++] = byte4(x, y, z + 1, currentBlock);
				this->vertex[i++] = byte4(x, y + 1, z + 1, currentBlock);

				// View from positive x
				this->vertex[i++] = byte4(x + 1, y, z, currentBlock);
				this->vertex[i++] = byte4(x + 1, y + 1, z, currentBlock);
				this->vertex[i++] = byte4(x + 1, y, z + 1, currentBlock);
				this->vertex[i++] = byte4(x + 1, y + 1, z, currentBlock);
				this->vertex[i++] = byte4(x + 1, y + 1, z + 1, currentBlock);
				this->vertex[i++] = byte4(x + 1, y, z + 1, currentBlock);

				currentBlock++;
			}
		}
	}

	this->elements = i;
	
	glGenVertexArrays(1, &this->vao);

	glBindVertexArray(this->vao);
	glGenBuffers(1, &this->vbo);
	glBindBuffer(GL_ARRAY_BUFFER, vbo);
	glBufferData(GL_ARRAY_BUFFER, this->elements * sizeof(this->vertex), this->vertex, GL_STATIC_DRAW);

	glGenBuffers(1, &cubeColor);
	glBindBuffer(GL_ARRAY_BUFFER, cubeColor);
	glBufferData(GL_ARRAY_BUFFER, sizeof(color), color, GL_STATIC_DRAW);

	this->attribCoord3dChunk = glGetAttribLocation(this->shader.program, "coord3d");
	this->attribMVPChunk = glGetUniformLocation(this->shader.program, "mvp");
	this->attribColor = glGetUniformLocation(this->shader.program, "f_color");

	if (this->attribCoord3dChunk < 0)
	{
		std::cout << "attribCoord3dChunk was negative!" << std::endl;
	}

	std::cout << this->attribMVPChunk << std::endl;

	glBindBuffer(GL_ARRAY_BUFFER, this->vbo);
	glVertexAttribPointer(
		this->attribCoord3dChunk, // attribute
		3,                 // number of elements per vertex, here (R,G,B)
		GL_FLOAT,          // the type of each element
		GL_FALSE,          // take our values as-is
		0,                 // no extra data between each position
		(GLvoid*)0                  // offset of first element
	);
	glEnableVertexAttribArray(this->attribCoord3dChunk);
	
	glBindBuffer(GL_ARRAY_BUFFER, this->chunkColor);
	glVertexAttribPointer(
		this->attribColor, // attribute
		3,                 // number of elements per vertex, here (x,y,z)
		GL_FLOAT,          // the type of each element
		GL_FALSE,          // take our values as-is
		0,                 // no extra data between each position
		(GLvoid*)0                  // offset of first element
	);
	glEnableVertexAttribArray(this->attribColor);

	glBindVertexArray(0);

	this->loaded = true;
}

void Chunk::render()
{
	glBindVertexArray(this->vao);
	glEnableVertexAttribArray(this->attribCoord3dChunk);
	glEnableVertexAttribArray(this->attribColor);

	model = glm::translate(glm::mat4(1.0f), glm::vec3(1, 1, 1));
	glm::mat4 mvp = gameManager->projection * gameManager->view * model;
	glUniformMatrix4fv(this->attribMVPChunk, 1, GL_FALSE, glm::value_ptr(mvp));

	glBindBuffer(GL_ARRAY_BUFFER, this->vbo);
	glDrawArrays(GL_TRIANGLES, 0, this->elements);

	glDisableVertexAttribArray(this->attribCoord3dChunk);
	glDisableVertexAttribArray(this->attribColor);
	glBindVertexArray(0);
}
 
Where byte4's typedef is
 
typedef glm::tvec4<GLbyte> byte4;
 
I call createMesh once, before the render loop.
And I also call render, every frame.
 
Thanks!! All help is appreciated :)

Share this post


Link to post
Share on other sites
Advertisement
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!