Hey guys,
I am having some problems getting a pixels world position from the depth buffer. I am basicly trying to render a water plane in the fragment shader. for the time being just rendering the water plane red.
I am rendering a quad over the screen and passing in the depth buffer and other params into the fragment shader.
Could you guys have a quick look and see if i am missing anything glaringly obvious?
Fragment shader
uniform sampler2D depthBuf;
uniform mat4 g_ModelViewProjectionInverseMatrix;
uniform vec4 viewport;
float waterLevel = 10.0;
void main()
{
vec3 color2 = texture2D(depthBuf, vec2( gl_FragCoord.x /600.0, gl_FragCoord.y /600.0) ).rgb; //600 screen dimensions
// Sample the depth buffer (stored as float32 data)
float rawDepth = texture2D(depthBuf, vec2( gl_FragCoord.x /600.0, gl_FragCoord.y /600.0) ).r;
// Construct clip-space position using gl_FragCoord, raw
// depth value, and the GL viewport
vec4 clipPos = vec4(
2.0 * (gl_FragCoord.x - viewport.x) / viewport.z - 1.0,
2.0 * (gl_FragCoord.y - viewport.y) / viewport.w - 1.0,
2.0 * rawDepth - 1.0,
1.0
);
// Multiply by inverse projection matrix to get
// world space position
vec4 worldPos = g_ModelViewProjectionInverseMatrix * clipPos;
worldPos.xyz /= worldPos.w;
//set original colour of pixel
gl_FragColor = vec4( color2.x, color2.y, color2.z, 1.0);
//if the position of the current pixel is under water set it to red!
if(worldPos.y < waterLevel )
{
gl_FragColor = vec4( 1.0 , 0.0, 0.0 , 1.0);
}
}
Vertex shader
void main(void)
{
gl_Position = ftransform();
}
Here is how i am calculating the matrices and stuff that i am passing in to the fragment shader. (These are called after setting up the projection etc).
glGetFloatv( GL_MODELVIEW_MATRIX, modelview );
glGetFloatv( GL_PROJECTION_MATRIX, projection );
glGetFloatv( GL_VIEWPORT, viewport );
//create hte projection matrix and pass it on to the shader!
glm::mat4 glm_ProjectionMatrix;
glm::mat4 glm_ViewMatrix;
glm_ProjectionMatrix = glm::mat4( projection[0], projection[1], projection[2], projection[3],
projection[4], projection[5] , projection[6] , projection[7],
projection[8], projection[9], projection[10],projection[11],
projection[12], projection[13], projection[14],projection[15]);
glm_ViewMatrix = glm::mat4(modelview[0], modelview[1], modelview[2], modelview[3],
modelview[4], modelview[5] , modelview[6] , modelview[7],
modelview[8], modelview[9], modelview[10],modelview[11],
modelview[12], modelview[13], modelview[14],modelview[15]);
glm::mat4 glm_PModelViewMatrix = glm_ProjectionMatrix * glm_ViewMatrix ;
glm_PModelViewMatrix = glm::gtx::inverse::affineInverse(glm_PModelViewMatrix) ;
glUniformMatrix4fv(glm_ViewProjectionMatrix_id , 1, false, &glm_PModelViewMatrix[0][0]); // set the shader value
//send int he viewport details!
glUniform3fv( viewportLoc, 4, &viewport[0]);
As a side note i am creating my texture like this:
glGenTextures(1, &depthBuf);
glBindTexture(GL_TEXTURE_2D, depthBuf);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
Any clues?
At the moment it just renders the backbuffer back at me. What i am hoping to see is a sea of red and the tops of some triangles poking out at me.
Heres an image of what i am getting back (just the normal back buffer).
Anything glaringly obvious wrong?