openGL:绘制多个立方体GL_CULL_FACE问题

Bố *_*itu 2 opengl

我有 6 个立方体连接在一起,如下图所示:

旋转前

但是当我旋转它时。问题是后面的立方体没有被前面的立方体覆盖

旋转后

虽然我使用:

    gl.glEnable(GL10.GL_CULL_FACE); // Enable cull face
    gl.glCullFace(GL10.GL_BACK); // Cull the back face (don't display)
Run Code Online (Sandbox Code Playgroud)

这是我的 onDrawFrame 重写函数:

    @Override
public void onDrawFrame(GL10 gl) {
    // Clear color and depth buffers
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);        

    gl.glFrontFace(GL10.GL_CCW); // Front face in counter-clockwise
    gl.glEnable(GL10.GL_CULL_FACE); // Enable cull face
    gl.glCullFace(GL10.GL_BACK); // Cull the back face (don't display)
    gl.glEnable(GL10.GL_TEXTURE_2D);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // Enable texture-coords-array (NEW)



    // ----- Render the Cube -----
    update();
    if (currentTransperent != newTransperent) {
        cube.loadTexture(gl, context, newTransperent);
        currentTransperent = newTransperent;
    }
    gl.glLoadIdentity(); // Reset the current model-view matrix
    gl.glTranslatef(xPosition, yPosition, zPosition); // Translate into the screen
    gl.glRotatef(angleCube, xAxis, yAxis, zAxis); // Rotate

    gl.glPushMatrix();
    gl.glRotatef(90.0f, 1, 0, 0);
    gl.glTranslatef(0.0f, 0.0f, 1.0f);
    cube.draw(gl);
    gl.glPopMatrix();

    gl.glPushMatrix();
    gl.glTranslatef(0.0f, 0.0f, -1.0f);
    cube.draw(gl);
    gl.glPopMatrix();

    gl.glPushMatrix();
    gl.glRotatef(270.0f, 0, 1, 0);
    gl.glTranslatef(0.0f, 0.0f, -1.0f);
    cube.draw(gl);
    gl.glPopMatrix();

    gl.glPushMatrix();
    gl.glTranslatef(0.0f, 0.0f, 1.0f);
    cube.draw(gl);
    gl.glPopMatrix();

    gl.glPushMatrix();
    gl.glRotatef(270.0f, 0, 1, 0);
    gl.glTranslatef(0.0f, 0.0f, 1.0f);
    cube.draw(gl);
    gl.glPopMatrix();

    gl.glPushMatrix();
    gl.glRotatef(90.0f, 1, 0, 0);
    gl.glTranslatef(0.0f, 0.0f, -1.0f);
    cube.draw(gl);
    gl.glPopMatrix();

    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // Disable texture-coords-array
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisable(GL10.GL_CULL_FACE);

    angleCube += rotateSpeed;
}
Run Code Online (Sandbox Code Playgroud)

der*_*ass 5

背面剔除不能保证正确的深度排序,除非整个场景由单个不透明的凹面对象组成。

如果您绘制单个立方体,背面剔除将保证仅绘制这些(最多 3 个)面向观察者的面。但是,当您绘制两个立方体时,GL 将按照您绘制它们的顺序渲染它们,并且如果没有其他方法,绘制第二个立方体将覆盖颜色缓冲区中先前的内容,即第一个立方体。事实上,它只会绘制第二个立方体的正面,而忽略其背面,这一事实不会改变出现在第一个立方体前面的第二个立方体的每个绘制面。

处理不透明对象可见性的标准方法是使用Z 缓冲区算法,GPU 对此有硬件支持,并且可在 OpenGL 中用作深度测试