1

我已经成功地将 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();
}

程序运行截图

4

0 回答 0