1

下面的代码与从这个 NeHe 教程中检索到的代码几乎相同。我的代码和教程中的代码之间的唯一区别是我使用 SFML 作为窗口上下文,这不应该是相关的。要查看整个源代码,请转到此处。相关代码片段如下(评论来自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();

这段代码的最终结果如下所示:图片

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

4

1 回答 1

2

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

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

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

于 2013-07-19T20:31:22.457 回答