Sign in to follow this  
Verideth

Voxel engine not drawing chunks? glDrawArrays not working?

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this