Depth buffering problem

Started by
-1 comments, last by khrazymic 12 years, 6 months ago
Hi there. I have created a rendering engine using OpenGLES 2.0 and have done the following to set up depth buffering:


glGenRenderbuffers(1, &m_colorRenderbuffer);

glBindRenderbuffer(GL_RENDERBUFFER, m_colorRenderbuffer);


[m_context renderbufferStorage:GL_RENDERBUFFER fromDrawable: eaglLayer];

int width, height;

glGetRenderbufferParameteriv(GL_RENDERBUFFER,

GL_RENDERBUFFER_WIDTH, &width);

glGetRenderbufferParameteriv(GL_RENDERBUFFER,

GL_RENDERBUFFER_HEIGHT, &height);



// Create a depth buffer that has the same size as the color buffer.

glGenRenderbuffers(1, &m_depthRenderbuffer);

glBindRenderbuffer(GL_RENDERBUFFER, m_depthRenderbuffer);

glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);



// Create the framebuffer object.

GLuint framebuffer;

glGenFramebuffers(1, &framebuffer);

glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,

GL_RENDERBUFFER, m_colorRenderbuffer);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,

GL_RENDERBUFFER, m_depthRenderbuffer);

glBindRenderbuffer(GL_RENDERBUFFER, m_colorRenderbuffer);

glEnable(GL_DEPTH_TEST);




//Setting the viewport transform

glViewport(0, 0, width, height);



//Setting the projection transform

//NOTE: I just rewrote the glOrthof function as it's not availabile in ES2.0

glOrthof(-width/2.0f, width/2.0f, -height/2.0f, height/2.0f, -1.0f, 1.0f);





That is all done while initializing the renderer. In the render function I do the following:


glClearColor(1.0f, 0.5f, 0.0f, 1);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);



vector<Visual *>::const_iterator visualHolder = visuals->begin();

while (visualHolder != visuals->end())

{

Visual * visual = *visualHolder;

m_textureManager->SetTexture(visual->Texture);



// Set the diffuse color.

vec3 color = visual->Color * 1.0f;

glVertexAttrib4f(m_attributes.DiffuseMaterial, color.x, color.y, color.z, 0);




// Set the model-view transform.

mat4 scale = mat4::Scale(visual->Scale);

scale.z.z = visual->zVal;

mat4 rotation = visual->Orientation.ToMatrix();

mat4 translation = mat4::Translate(visual->Position.x, visual->Position.y, 0);



mat4 modelview = scale * rotation * translation;

glUniformMatrix4fv(m_uniforms.Modelview, 1, 0, modelview.Pointer());



// Set the normal matrix. Used for lighting

// It's orthogonal, so its Inverse-Transpose is itself!

mat3 normalMatrix = modelview.ToMat3();

glUniformMatrix3fv(m_uniforms.NormalMatrix, 1, 0, normalMatrix.Pointer());





const Drawable& drawable = m_drawables[visual->DrawablePointer];

glBindBuffer(GL_ARRAY_BUFFER, drawable.VertexBuffer);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, drawable.IndexBuffer);

glDrawElements(GL_TRIANGLES, drawable.IndexCount, GL_UNSIGNED_SHORT, 0);



++visualHolder;

}





The list of visuals contains the position, scale, zValue etc... of each instance of an object. visual->drawablePointer is a pointer to the vertex buffer, index buffer and index count of the object to be drawn. Now, when I have depth testing off it just draws in the order that the visual list is created. When I turn depth testing on, however, the list is just drawn back to front. Z values aren't being utilized. However, the zValues are still being used in the lighting equations because changing the zValues changes the intensity of the light on each object. I'm horribly confused as to why the depth buffer is ignoring my z values. Oh, and to be clear, the Orthof function that I"m using is one I wrote as 2.0 doesn't have one built in. The following is the code for the function just in case:



void RenderingEngine::glOrthof(float left, float right, float bottom, float top, float near, float far)

{

//To see whats going on here go to:

//http://www.khronos.org/opengles/documentation/opengles1_0/html/glOrtho.html

//That site orders matrices in column order, I've adjusted accordingly as I'm using row order.



float ortho[16];

//First row

ortho[0] = 2/(right-left);

ortho[1] = ortho[2] = ortho[3] = 0;



//Second row

ortho[4] = 0;

ortho[5] = 2/(top - bottom);

ortho[6] = ortho[7] = 0;



//Third row

ortho[8] = ortho[9] = 0;

ortho[10] = (-2)/(far - near);

ortho[11] = 0;



//Fourth row

ortho[12] = -(right + left)/(right - left);

ortho[13] = -(top+bottom)/(top - bottom);

ortho[14] = -(far + near)/(far - near);

ortho[15] = 1;



glUniformMatrix4fv(m_uniforms.Projection, 1, 0, &ortho[0]);

}



This topic is closed to new replies.

Advertisement