2010-11-23 67 views
2

我繼續在OpenGL的陰影捲上工作,在finishing with volume itself之後,我需要使用模板緩衝區繪製陰影,那就是我卡住的地方:)我渲染了這個場景:http://prntscr.com/17lyr 正如你所見,球體代表光源,一個蘑菇的體積直接畫到屏幕上,一個沒有(我希望看到陰影)。它們是完全平等的,使得X軸上的一個模型翻譯成一個模型。這裏是工作的代碼IM:影子卷 - 最後階段

void Display(){ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
    glLoadIdentity(); 
    glLightfv(GL_LIGHT1,GL_POSITION,light_position[0]); 

    cam.SetPrespective(); 

    DrawDebugObject(true); 
    glTranslatef(15,0,0); 
    DrawDebugObject(false); 

    glFinish(); 
    glutSwapBuffers(); 
} 

void DrawDebugObject(bool draw_sil){ 
    glPushMatrix(); 
    glTranslatef(light_position[1][0],light_position[1][1],light_position[1][2]); 
    glColor3ub(255,255,0); 
    gluSphere(gluNewQuadric(),0.5,10,10); 
    glPopMatrix(); 

    glDisable(GL_LIGHTING); 
    glBegin(GL_QUADS); 
     glColor3f(1,1,1); 
     glVertex3f(-100,0,-100); 
     glVertex3f(-100,0,100); 
     glVertex3f(100,0,100); 
     glVertex3f(100,0,-100); 
     glEnd(); 
    glEnable(GL_LIGHTING); 
    pModel->draw(); 
    if(draw_sil) 
     pModel->markSilouette(light_position[1]); 
    castShadow(pModel,light_position[1]); 
} 

void castShadow(Model* model,float* lp){ 
     glDisable(GL_LIGHTING); 
     glDepthMask(GL_FALSE); 
     glDepthFunc(GL_LEQUAL); 

     pModel->markVisible(lp); 

     glEnable(GL_STENCIL_TEST); 
     glColorMask(0, 0, 0, 0); 
     glStencilFunc(GL_ALWAYS, 1, 0xffffffff); 

     // first pass, stencil operation decreases stencil value 
     glFrontFace(GL_CCW); 
     glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); 
     pModel->markSilouette(lp); 

     // second pass, stencil operation increases stencil value 
     glFrontFace(GL_CW); 
     glStencilOp(GL_KEEP, GL_KEEP, GL_DECR); 
     pModel->markSilouette(lp); 

     glFrontFace(GL_CCW); 
     glColorMask(1, 1, 1, 1); 

     //draw a shadowing rectangle covering the entire screen 
     glColor4f(1.0f, 0.0f, 0.0f, 0.4f); 
     glEnable(GL_BLEND); 
     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
     glStencilFunc(GL_NOTEQUAL, 0, 0xffffffff); 
     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 
     glPushMatrix(); 
     glLoadIdentity(); 
     glBegin(GL_QUADS); 
     glVertex3f(-0.1f, 0.1f,-0.10f); 
     glVertex3f(-0.1f,-0.1f,-0.10f); 
     glVertex3f(0.1f, 0.1f,-0.10f); 
     glVertex3f(0.1f,-0.1f,-0.10f); 
     glEnd(); 
     glPopMatrix(); 
     glDisable(GL_BLEND); 

     glDepthFunc(GL_LEQUAL); 
     glDepthMask(GL_TRUE); 
     glEnable(GL_LIGHTING); 
     glDisable(GL_STENCIL_TEST); 
} 

這裏是我的GL初始化函數:

void InitGL(){ 
    glEnable(GL_NORMALIZE); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_TEXTURE_2D); 
    glShadeModel(GL_SMOOTH); 
    glClearDepth(1.0f);         // Depth Buffer Setup 
    glClearStencil(0);         // Stencil Buffer Setup 
    glEnable(GL_DEPTH_TEST);       // Enables Depth Testing 
    glDepthFunc(GL_LEQUAL);        // The Type Of Depth Testing To Do 

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations 
    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); 
    glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); 
    glHint(GL_FOG_HINT, GL_NICEST); 
...nothing important after that 

在我的主要功能:

glutInit(&argc,argv); 
    glutInitDisplayMode(GLUT_RGB|GLUT_DEPTH|GLUT_DOUBLE|GLUT_STENCIL|GLUT_ACCUM); 
    glutInitWindowSize(Width,Height); 
    glutCreateWindow("Spheres"); 

    glutDisplayFunc(Display); 
    glutReshapeFunc(Reshape); 
    glutKeyboardFunc(Keyboard); 
    glutKeyboardUpFunc(KeyboardUp); 
    glutTimerFunc(TIMEOUT,Timer,TIMEOUT); 
    glutPassiveMotionFunc(MouseMove); 

一切都ok了我的代碼?因爲我沒有看到陰影,甚至不知道如何檢查模板值是否設置正確。

+0

哪裏就是你獲得你的OpenGL上下文的代碼?你可能不會要求模板緩衝區,如果你不這樣做,有些系統可能不會給你。 – genpfault 2010-11-23 16:30:09

回答

0

沒有辦法檢查模具afaik。我會假設你正在使用深度失敗。我建議像這樣使用glStencilOpSeperate。

glClear(GL_STENCIL_BUFFER_BIT); 
    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
    glEnable(GL_STENCIL_TEST); 
    glEnable(GL_POLYGON_OFFSET_FILL); 
    glDisable(GL_CULL_FACE); 
    glStencilFunc(GL_ALWAYS, 0x00, 0xFF); 
    glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_INCR_WRAP, GL_KEEP); 
    glStencilOpSeparate(GL_BACK, GL_KEEP, GL_DECR_WRAP, GL_KEEP); 
    glPolygonOffset(0.0f, 5.0f); 
    glDepthFunc(GL_LESS); 

然後當你畫的實際幾何形狀確保您要更換模板值,像這樣:

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
    glEnable(GL_CULL_FACE); 
    glDisable(GL_POLYGON_OFFSET_FILL); 
    glCullFace(GL_BACK); 
    glDepthFunc(GL_GEQUAL); 
    glStencilFunc(GL_EQUAL, 0x00, 0xFF); 
    glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);