• Announcements

Archived

This topic is now archived and is closed to further replies.

stencil buffer

4 posts in this topic

I''ve been trying to use the stencil buffer to get a reflection but you can still see the object I''m trying to reflect below the surface. I don''t understand what is going wrong, I''ve followed the example in the OpenGL Game Programming book and NeHe''s tutorial, but I still can''t get it to work. Anyone know what''s going wrong in the following code? Thanks.
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glLoadIdentity(); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glDepthMask(GL_FALSE); glEnable(GL_STENCIL_TEST); glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFF); glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); DrawSurface(); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glDepthMask(GL_TRUE); glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glPushMatrix(); glScalef(1.0f, -1.0f, 1.0f); DrawObject(); glPopMatrix(); glEnable(GL_BLEND); DrawSurface(); glDisable(GL_BLEND); glDisable(GL_STENCIL_TEST); glPushMatrix(); DrawObject(); glPopMatrix(); 
0

Share on other sites
Well, you might try this to make it work:
disable GL_DEPTH_TEST before you draw your reflective surface (the ground) the first time. Then enable it after you draw the surface. Also, the glStencilFunc(GL_ALWAYS, 1, 1) works instead. But i think your big problem is not disabling depth testing. What happens is the reflective surface is closer than your reflected image and opengl won''t draw anything behind the surface.
0

Share on other sites
That''s why I don''t understand why it won''t work, because I tried disabling depth testing with glDisable(GL_DEPTH_TEST). Here''s the part of the code where I disable all the things including the glDisable calls:

  glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glDepthMask(GL_FALSE); glEnable(GL_STENCIL_TEST); glStencilFunc(GL_ALWAYS, 1, 1); glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); glDisable(GL_DEPTH_TEST); DrawSurface(); glEnable(GL_DEPTH_TEST); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glDepthMask(GL_TRUE);

Am I doing it in the wrong order or something? I also tried taking out the glDepthMask calls but that didn''t do anything.
0

Share on other sites
This is some code I wrote last week when I was playing around w/ the stencil buffer. It makes a window instead of the ground. I know this works... The only other thing would be you need to setup the pixel format for stencil bits and also clear it
----------------------------------------------

//set camera view point
...
glDisable(GL_DEPTH_TEST);
glEnable(GL_STENCIL_TEST);

//set up stencil buffer to replace only w/i window
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
glStencilFunc(GL_ALWAYS, 1, 1);

//draw our mirror. setts all the pixels in the stencil buffer to 1 which we
//just defined as a mask w/ stencil func()
DrawWindow(windowTexture, winSize);

glEnable(GL_DEPTH_TEST);

//draw to only where stencil buffer is equal to 1
glStencilFunc(GL_EQUAL, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

//draw the reflection
glPushMatrix();
glScalef(1, 1, -1);

glCullFace(GL_FRONT);
DrawModel();
DrawGround(groundTexture, -24.0);
glCullFace(GL_BACK);

glPopMatrix();
//end drawing reflection

glDisable(GL_STENCIL_TEST);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//draw blended texture over our window
DrawWindow(windowTexture, winSize);

//draw real ground and model now
DrawModel();
DrawGround(groundTexture, -24.0);

----------------------------------------
g''luck!
0

Share on other sites
Thanks for the help, I finally got it working.
0