2016-05-05 58 views
1

我有6个立方体加入如下面的图片:openGL的:绘制多个立方体GL_CULL_FACE问题

before rotation

但是,当我旋转。问题的背后立方体不包括在前面立方体

after rotation

虽然我使用:

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

这是我的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; 
} 

回答

4

Backeface剔除不不是保证一个正确的深度排序,除非整个场景由一个单一的opaqu e,凹面物体。

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

处理不透明物体的可见性的标准方法是使用Z buffer algorithm,GPU具有硬件支持,并且在OpenGL中作为depth test提供。

+0

你拯救了我的生命@derhass。非常感谢! 只需使用:gl.glEnable(GL10.GL_DEPTH_TEST);它的功能就像一个魅力! :) –