Jump to content

  • Log In with Google      Sign In   
  • Create Account

Using stencil buffer to draw reflections


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 randomguy2000   Members   -  Reputation: 104

Like
0Likes
Like

Posted 25 December 2012 - 10:50 AM

Hi!

I have a bit of a problem with one of my projects. I've just recently started learning Open GL and I've hit my first major obstacle. I am making a simple 3D pong game and I want the ball to be reflected off of the walls (or leave a shadow on them - not yet sure). So I've been trying to use the stencil buffer to draw the reflections, which works. The reflection is only visible on the parts where I want it to be be visible. But there is a problem - the walls are all white now. I am using materials and lights to create that 3D feel and this works great until I try to use the stencil buffer. After that all the walls are white (without any depth or anything like that).

 

Here is the actual rendering code (it is a bit messy since I've been trying to figure out what is wrong):

 

    
    GL11.glMaterial(GL11.GL_FRONT, GL11.GL_EMISSION, allocFloats(new float[] { 0.5f, 0.0f, 0f, 1.0f}));
    //enemyBat.setPosition(0.9f, -0.5f, -30);
    enemyBat.render3D();
    GL11.glMaterial(GL11.GL_FRONT, GL11.GL_EMISSION, allocFloats(new float[] { 0.0f, 0.0f, 0f, 1.0f}));
    
    GL11.glMaterial(GL11.GL_FRONT, GL11.GL_EMISSION, allocFloats(new float[] { 0.9f, 0.9f, 0f, 1.0f}));
    GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, allocFloats(new float[] { 0.5f, 0.5f, 0.5f, 0.8f}));
    //kugla.setPosition(0, 0.6f, -20);
    kugla.render3D();
    GL11.glMaterial(GL11.GL_FRONT, GL11.GL_EMISSION, allocFloats(new float[] { 0.0f, 0.0f, 0f, 1.0f}));
    
    GL11.glMaterial(GL11.GL_FRONT, GL11.GL_EMISSION, allocFloats(new float[] { 0.0f, 0.5f, 0f, 1.0f}));
    GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, allocFloats(new float[] { 0.5f, 0.5f, 0.5f, 0.4f}));
    //playerBat.setPosition(posX, posY, -10);
    playerBat.render3D();
    GL11.glMaterial(GL11.GL_FRONT, GL11.GL_EMISSION, allocFloats(new float[] { 0.0f, 0.0f, 0f, 1.0f}));
    
    GL11.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, allocFloats(new float[] { kugla.m_nX, kugla.m_nY, kugla.m_nZ, 1.0f}));
    
    
    
    
    GL11.glEnable(GL11.GL_STENCIL_TEST); //Enable using the stencil buffer
    GL11.glColorMask(false, false, false, false); //Disable drawing colors to the screen
    GL11.glDisable(GL11.GL_DEPTH_TEST); //Disable depth testing
    GL11.glStencilFunc(GL11.GL_ALWAYS, 1, 1); //Make the stencil test always pass
    //Make pixels in the stencil buffer be set to 1 when the stencil test passes
    GL11.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_REPLACE);
    //Set all of the pixels covered by the floor to be 1 in the stencil buffer
    polje.render3D();
    
    GL11.glColorMask(true, true, true, true); //Enable drawing colors to the screen
    GL11.glEnable(GL11.GL_DEPTH_TEST); //Enable depth testing
    //Make the stencil test pass only when the pixel is 1 in the stencil buffer
    GL11.glStencilFunc(GL11.GL_EQUAL, 1, 1);
    GL11.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); //Make the stencil buffer not change
    
    //Draw the cube, reflected vertically, at all pixels where the stencil
    //buffer is 1
    GL11.glPushMatrix();
    GL11.glScalef(1, -1, 1);
    GL11.glTranslatef(0, kugla.radius, 0);
    kugla.render3D();
    GL11.glPopMatrix();
    
    GL11.glDisable(GL11.GL_STENCIL_TEST); //Disable using the stencil buffer
    
    GL11.glEnable(GL11.GL_BLEND);
    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    //GL11.glTranslatef(0, 0, -2);
    GL11.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE, allocFloats(new float[] { 0.7f, 0.7f, 1f, 1.0f}));
    //GL11.glEnable(GL11.GL_COLOR_MATERIAL);
    //GL11.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE);
    //GL11.glMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, allocFloats(new float[] { 0.0f, 0.5f,1f, 1.0f}));
    GL11.glMaterial(GL11.GL_FRONT, GL11.GL_EMISSION, allocFloats(new float[] { 0.0f, 0.1f, 0.4f, 1f}));
    //GL11.glMateriali(GL11.GL_FRONT, GL11.GL_SHININESS, 1); //med 1 in 128
    polje.render3D();
    GL11.glDisable(GL11.GL_BLEND);

    Display.sync(50);

 

 



Sponsor:

#2 BornToCode   Members   -  Reputation: 927

Like
0Likes
Like

Posted 25 December 2012 - 03:16 PM

Are you clearing your stencil buffer.

#3 randomguy2000   Members   -  Reputation: 104

Like
0Likes
Like

Posted 25 December 2012 - 03:30 PM

When should I be clearing it? If you mean before I start drawing each frame, then yes:

    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
    GL11.glClearColor(0, 0, 0, 1);

 

If you mean something else, then probably not. What is posted above is all the code that does anything with the stencil buffer.






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS