opengl模板缓冲区多个同时使用

时间:2013-01-24 04:16:28

标签: opengl stencil-buffer

我成功地将OpenGL的模板缓冲区用于场景中的单个实例。但是,我不确定如何在同一场景中的两个不同位置使用它。按顺序定义两个模板形状可以防止工作,并且我尝试将一个用途嵌套在另一个中也不起作用。我已经看到了在同一场景中多次使用模板缓冲区的例子,但我无法理解或调整代码。这是我迄今为止能够开展的工作。

void display(void) {
    // store floor shape in stencil buffer
    glClearStencil(0);
    glClear(GL_STENCIL_BUFFER_BIT);
    glEnable(GL_STENCIL_TEST);
    glStencilMask(1);
    glStencilFunc(GL_ALWAYS, 1, 1);
    glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
    floor->draw();
            glBegin(GL_QUADS);                   //
                glVertex3f(0.0, 0.0, 0.0);       //
                glVertex3f(0.0, 100.0, 0.0);     //
                glVertex3f(0.0, 100.0, 100.0);   //
                glVertex3f(0.0, 0.0, 100.0);     //
            glEnd();                             //

    // draw scene outside floor
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    scene();

    // draw reflection of scene in floor
    glStencilFunc(GL_EQUAL, 1, 1);
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
    glPushMatrix();
    glScalef(1.0, 1.0, -1.0);
    scene();
    glPopMatrix();
    glDisable(GL_STENCIL_TEST);

    // draw translucent floor
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glColor4f(1.0, 1.0, 1.0, 0.7);
    floor->draw();
    //windowHole();
    glDisable(GL_BLEND);

    glFlush();
    glutSwapBuffers();
    glutPostRedisplay();
}

screenshot of program working

0 个答案:

没有答案