为什么我的OpenGL反射无法剪切到模板区域?

时间:2013-07-19 00:49:24

标签: opengl reflection

以下代码与从this NeHe tutorial检索到的代码几乎完全相同。我的代码和教程中的代码之间的唯一区别是我使用SFML用于窗口上下文,这应该不相关。要查看整个源代码,go here。下面是相关代码的片段(评论来自NeHe):

// Clip Plane Equations
double eqr[] = {0.0f,-1.0f, 0.0f, 0.0f};            // Plane Equation     glColorMask(0,0,0,0);                             // Set Color Mask
glEnable(GL_STENCIL_TEST);                          // Enable Stencil Buffer For "marking" The Floor
glStencilFunc(GL_ALWAYS, 1, 1);                     // Always Passes, 1 Bit Plane, 1 As Mask
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);          // We Set The Stencil Buffer To 1 Where We Draw Any Polygon
                                                    // Keep If Test Fails, Keep If Test Passes But Buffer Test Fails
                                                    // Replace If Test Passes
glDisable(GL_DEPTH_TEST);                           // Disable Depth Testing
DrawFloor();                                        // Draw The Floor (Draws To The Stencil Buffer)
                                                    // We Only Want To Mark It In The Stencil Buffer
glEnable(GL_DEPTH_TEST);                            // Enable Depth Testing
glColorMask(1,1,1,1);                               // Set Color Mask to TRUE, TRUE, TRUE, TRUE
glStencilFunc(GL_EQUAL, 1, 1);                      // We Draw Only Where The Stencil Is 1
                                                    // (I.E. Where The Floor Was Drawn)
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);             // Don't Change The Stencil Buffer
glEnable(GL_CLIP_PLANE0);                           // Enable Clip Plane For Removing Artifacts
                                                    // (When The Object Crosses The Floor)
glClipPlane(GL_CLIP_PLANE0, eqr);                   // Equation For Reflected Objects
glPushMatrix();                                     // Push The Matrix Onto The Stack
    glScalef(1.0f, -1.0f, 1.0f);                    // Mirror Y Axis
    glLightfv(GL_LIGHT0, GL_POSITION, LightPos);    // Set Up Light0
    glTranslatef(0.0f, height, 0.0f);               // Position The Object
    DrawObject();                                   // Draw The Sphere (Reflection)
glPopMatrix();                                      // Pop The Matrix Off The Stack
glDisable(GL_CLIP_PLANE0);                          // Disable Clip Plane For Drawing The Floor
glDisable(GL_STENCIL_TEST);                         // We Don't Need The Stencil Buffer Any More (Disable)

glLightfv(GL_LIGHT0, GL_POSITION, LightPos);        // Set Up Light0 Position
glEnable(GL_BLEND);                                 // Enable Blending (Otherwise The Reflected Object Wont Show)
glDisable(GL_LIGHTING);                             // Since We Use Blending, We Disable Lighting
glColor4f(1.0f, 1.0f, 1.0f, 0.8f);                  // Set Color To White With 80% Alpha
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  // Blending Based On Source Alpha And 1 Minus Dest Alpha
DrawFloor();                                        // Draw The Floor To The Screen
glEnable(GL_LIGHTING);                              // Enable Lighting
glDisable(GL_BLEND);                                // Disable Blending
glTranslatef(0.0f, height, 0.0f);                   // Position The Ball At Proper Height
DrawObject();

此代码的最终结果如下所示:Picture

如何更改上面的代码,使底部(反射)球体仅出现在平面上而不是在平面之外。

1 个答案:

答案 0 :(得分:2)

那么,你真的用模板缓冲区创建一个GL上下文吗?代码中唯一相关的上下文创建行似乎是

f::RenderWindow window(sf::VideoMode(800, 600, 32), "Test");

这不是很具体。我不知道SFML,但为什么你认为更改上下文创建的代码在这里不相关?