Jump to content
  • Advertisement
Sign in to follow this  
Verideth

Voxel engine not drawing chunks? glDrawArrays not working?

This topic is 542 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.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!