Hi,
I’ve some trouble using the early Z culling in my program. I’ve tried this test acoording to this topic to see if early Z culling run on my Quadro FX 3450/4000 SDI and it works fine.
I’ve builded this test to try enabling early Z culling in my program
This is render function
static bool dbgInit = false, dbgZPass = false, dbgCompute = true;
/******** Init pass ********/
testFBOTarg->beginDraw();
testShaderInitPass.enableShader();
glEnable(GL_TEXTURE_RECTANGLE_NV);
glBindTexture(GL_TEXTURE_RECTANGLE_NV, testSrcBufferID);
glBegin(GL_QUADS);
glTexCoord2i(gridX, 0);
glVertex3f(0.0f, 0.0f, 0.0f);
glTexCoord2i(gridX, gridZ);
glVertex3f(0.0f, 0.0f, 1.0f);
glTexCoord2i(0, gridZ);
glVertex3f(1.0f, 0.0f, 1.0f);
glTexCoord2i(0, 0);
glVertex3f(1.0f, 0.0f, 0.0f);
glEnd();
glDisable(GL_TEXTURE_RECTANGLE_NV);
testShaderInitPass.disableShader();
testFBOTarg->endDraw();
/***************************/
if(dbgInit)
{
float *tmpD = new float[testFBOTarg->getWidth() * testFBOTarg->getHeight() * 4];
glBindTexture(GL_TEXTURE_RECTANGLE_NV, testFBOTarg->getTexAttach(GL_COLOR_ATTACHMENT0_EXT));
glGetTexImage(GL_TEXTURE_RECTANGLE_NV, 0, GL_RGBA, GL_FLOAT, tmpD);
imdebug("rgba b=32f w=%d h=%d %p", testFBOTarg->getWidth(), testFBOTarg->getHeight(), tmpD);
dbgInit = false;
delete[] tmpD;
}
/******** Switch FBO ********/
PXVFramebufferObject *tmpFBO = testFBOSrc;
testFBOSrc = testFBOTarg;
testFBOTarg = tmpFBO;
GLuint tmpID = testSrcBufferID;
testSrcBufferID = testTargBufferID;
testTargBufferID = tmpID;
/****************************/
/******** Early Z-Culling init pass ********/
testFBOTarg->beginDraw(false);
testShaderZPass.enableShader();
glEnable(GL_TEXTURE_RECTANGLE_NV);
glBindTexture(GL_TEXTURE_RECTANGLE_NV, testSrcBufferID);
glBegin(GL_QUADS);
glTexCoord2i(gridX, 0);
glVertex3f(0.0f, 0.0f, 0.0f);
glTexCoord2i(gridX, gridZ);
glVertex3f(0.0f, 0.0f, 1.0f);
glTexCoord2i(0, gridZ);
glVertex3f(1.0f, 0.0f, 1.0f);
glTexCoord2i(0, 0);
glVertex3f(1.0f, 0.0f, 0.0f);
glEnd();
glDisable(GL_TEXTURE_RECTANGLE_NV);
testShaderZPass.disableShader();
testFBOTarg->endDraw();
/*******************************************/
if(dbgZPass)
{
testFBOTarg->bindFBO();
imdebugDepthf(0, 0, testFBOTarg->getWidth(), testFBOTarg->getHeight());
dbgZPass = false;
testFBOTarg->unbindFBO();
}
/******** Switch FBO ********/
tmpFBO = testFBOSrc;
testFBOSrc = testFBOTarg;
testFBOTarg = tmpFBO;
tmpID = testSrcBufferID;
testSrcBufferID = testTargBufferID;
testTargBufferID = tmpID;
/****************************/
/******** Compute pass ********/
testFBOTarg->beginDraw(false, false);
testShaderComputePass.enableShader();
glEnable(GL_TEXTURE_RECTANGLE_NV);
glBindTexture(GL_TEXTURE_RECTANGLE_NV, testSrcBufferID);
glBegin(GL_QUADS);
glTexCoord2i(gridX, 0);
glVertex3f(0.0f, 0.0f, 0.0f);
glTexCoord2i(gridX, gridZ);
glVertex3f(0.0f, 0.0f, 1.0f);
glTexCoord2i(0, gridZ);
glVertex3f(1.0f, 0.0f, 1.0f);
glTexCoord2i(0, 0);
glVertex3f(1.0f, 0.0f, 0.0f);
glEnd();
glDisable(GL_TEXTURE_RECTANGLE_NV);
testShaderComputePass.disableShader();
testFBOTarg->endDraw();
/******************************/
if(dbgCompute)
{
float *tmpD = new float[testFBOTarg->getWidth() * testFBOTarg->getHeight() * 4];
glBindTexture(GL_TEXTURE_RECTANGLE_NV, testFBOTarg->getTexAttach(GL_COLOR_ATTACHMENT0_EXT));
glGetTexImage(GL_TEXTURE_RECTANGLE_NV, 0, GL_RGBA, GL_FLOAT, tmpD);
imdebug("rgba b=32f w=%d h=%d %p", testFBOTarg->getWidth(), testFBOTarg->getHeight(), tmpD);
dbgCompute = false;
delete[] tmpD;
}
/******** Switch FBO ********/
tmpFBO = testFBOSrc;
testFBOSrc = testFBOTarg;
testFBOTarg = tmpFBO;
tmpID = testSrcBufferID;
testSrcBufferID = testTargBufferID;
testTargBufferID = tmpID;
/****************************/
Here prototype for beginDraw FBO function
inline void beginDraw(bool clearColor = true, bool clearDepth = true);
And differents fragment program used in test
Init pass
uniform samplerRect src;
void main()
{
vec4 outputVal = vec4(0.15, 0.15, 0.75, 1.0);
gl_FragColor = outputVal;
}
Z pass
uniform samplerRect src;
void main()
{
vec4 inputVal = textureRect(src, gl_TexCoord[0].st);
vec4 outputVal = inputVal;
discard;
gl_FragColor = outputVal;
}
Compute pass
uniform samplerRect src;
void main()
{
vec4 inputVal = textureRect(src, gl_TexCoord[0].st);
vec4 outputVal = inputVal;
for(int i = 0; i < 100; i++)
{
outputVal.r = ((int)gl_TexCoord[0].s % 2 == 0) ? 1.0 : 0.0;
}
gl_FragColor = outputVal;
}
Init pass stand only because in real program I have an init pass
Un/commented “discard” in Z pass allow to control fragment proceed in compute pass.
Compute pass only make a time consuming operation for test.
I use Fraps to measure performance and I note no difference between test with discard commented an discard uncommented (22fps). If somebody have an idea on my trouble?