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

opengl模具缓冲区多个同时使用,opengl,stencil-buffer,Opengl,Stencil Buffer,我成功地将OpenGL的模具缓冲区用于场景中的单个实例。但是,我不确定如何在同一场景中的两个不同地方使用它。按顺序定义两个模具形状会使其中一个无法工作,而我试图将一个模具形状嵌套在另一个模具形状中的尝试也无法工作。我见过在同一场景中多次使用模具缓冲区的例子,但我无法理解或修改代码。这是我到目前为止能够得到的工作 void display(void) { // store floor shape in stencil buffer glClearStencil(0); gl

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

什么代码不起作用?链接到一些截图也会很有帮助。对不起,我应该说得更清楚。我标记的五行代码显示了模具缓冲区选择多个区域的一次尝试。这不管用,但我正在寻找一种可行的方法。屏幕截图显示程序正在运行,没有添加额外的行。场景在地面上反射,因为“地板->绘制”为模具缓冲区定义了该多边形,但我需要能够保持这种效果,同时使用其他多边形(例如新线中定义的多边形)创建另一个反射曲面。您定义的多边形与地板在同一平面上吗?如果没有,您必须添加另一个具有不同变换矩阵的渲染过程。谢谢您,Nico。这解决了问题。