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

时间:2016-05-05 10:08:18

标签: opengl

我有6个立方体连接如下图所示:

before rotation

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

after rotation

虽然我使用:

    @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;
}

这是我的onDrawFrame覆盖函数:

FancyURLOpener

1 个答案:

答案 0 :(得分:4)

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

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

处理不透明对象可见性的标准方法是使用Z buffer algorithm,这些GPU具有硬件支持,并且在OpenGL中可用作depth test