2013-07-19 44 views
1

以下代碼與從this NeHe tutorial檢索到的代碼幾乎相同。我的代碼和本教程的代碼之間唯一的區別是我使用SFML作爲窗口上下文,這不應該是相關的。查看完整的源代碼,go here。相關的代碼片段是下面(的評論是從訥河):爲什麼我的OpenGL反射無法剪輯到模板區域?

// 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

如何修改上面的代碼,以使底部(反射的)球體只出現在飛機上而不是外面。

+0

爲什麼不只是展開矩形? – mr5

+0

您似乎錯過了本教程中相當重要的部分。 – Shog9

+0

@Shog9,你能詳細解釋一下這個評論嗎? – LucasS

回答

2

那麼,你真的創建一個帶有模板緩衝區的GL上下文嗎?在您的代碼中創建上下文的唯一相關行似乎爲

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

並且這不是很具體。我不知道SFML,但爲什麼你認爲改變上下文創建的代碼在這裏不相關?

相關問題