Android OpenGL ES 1.0:六色立方体自动旋转,但某些面丢失,是否我(取消)注释某些代码!

Android OpenGL ES 1.0:六色立方体自动旋转,但某些面丢失,是否我(取消)注释某些代码!,android,opengl-es,cube,Android,Opengl Es,Cube,我试图在AndroidAPI3OpenGL(所以OpenGLES1.0)中构建一个不同颜色的人脸立方体。(我是OpenGL编程的初学者)。我设法使它在一个恒定的周期内旋转,但最大的问题是我无法绘制所有的面 事实上,缺失的面孔将不再相同 我绕x轴或y轴旋转 我在onSurfaceCreated方法中使用或不使用GL10#glEnable(GL10.GL#u DEPTH_TEST)命令 那么,最简单的纠正方法是什么?(我曾想过使用glClearDepth()和glCullFace(),但没有成功

我试图在AndroidAPI3OpenGL(所以OpenGLES1.0)中构建一个不同颜色的人脸立方体。(我是OpenGL编程的初学者)。我设法使它在一个恒定的周期内旋转,但最大的问题是我无法绘制所有的面

事实上,缺失的面孔将不再相同

  • 我绕x轴或y轴旋转
  • 我在onSurfaceCreated方法中使用或不使用GL10#glEnable(GL10.GL#u DEPTH_TEST)命令
那么,最简单的纠正方法是什么?(我曾想过使用glClearDepth()和glCullFace(),但没有成功)

以下是从GLSurfaceView.Renderer继承的我的类的代码:

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLU;
import android.opengl.GLSurfaceView.Renderer;

public class MyGLRenderer implements Renderer {

    public MyGLRenderer(){
        buildCubeBuffers();
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        gl.glRotatef(0.6f, 1.0f, 0.0f, 0.0f);
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        gl.glVertexPointer(COORDS_PER_VERTEX, GL10.GL_FLOAT, 0, cubeBuffer);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        //--- FRONT
        gl.glColor4f(1.0f, 0.0f, 0.0f, 0.0f); //RED
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, VERTICES_NUMBER);
        //--- RIGHT
        gl.glColor4f(0.0f, 1.0f, 0.0f, 0.0f); // GREEN
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, VERTICES_NUMBER);
        //--- BACK
        gl.glColor4f(0.0f, 0.0f, 1.0f, 0.0f); // BLUE
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, VERTICES_NUMBER);
        //--- LEFT
        gl.glColor4f(1.0f, 1.0f, 0.0f, 0.0f); // YELLOW
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 12, VERTICES_NUMBER);
        //--- TOP
        gl.glColor4f(1.0f, 0.5f, 0.0f, 0.0f); // ORANGE
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 16, VERTICES_NUMBER);
        //--- BOTTOM
        gl.glColor4f(1.0f, 0.0f, 1.0f, 0.0f); // PURPLE 
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, VERTICES_NUMBER);
        //--
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        if (height == 0) height = 1;
        if (width < height)
            gl.glViewport(0, 0, width, width);
        else
            gl.glViewport(0, 0, height, height);

        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        GLU.gluLookAt(gl, 0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        gl.glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
        //////////////////////////////////////
        /*
         * If i comment next line :
         * => Rotation on y axis
         * yellow face is visible, red face is invisible
         * Otherwise : yellow invisible and red visible !!!
         * => Rotation on x axis
         * purple face is visible, red face is invisible
         * Otherwise : purple invisible and red visible !!!
         * Why ???
         */
        //////////////////////////////////////
        gl.glEnable(GL10.GL_DEPTH_TEST);
    }

    private void buildCubeBuffers(){
        final float cubeVertices[] = {
            // front
            -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 0 : Left-Top-Front
            +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 1 : Right-Top-Front
            -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 3 : Left-Bottom-Front
            +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 2 : Right-Bottom-Front
            // right
            +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 1 : Right-Top-Front
            +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 5 : Right-Top-Back
            +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 2 : Right-Bottom-Front
            +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 6 : Right-Bottom-Back
            // back
            +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 5 : Right-Top-Back
            -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 4 : Left-Top-Back
            +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 6 : Right-Bottom-Back
            -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 7 : Left-Bottom-Back
            // left
            -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 4 : Left-Top-Back
            -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 0 : Left-Top-Front
            -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 7 : Left-Bottom-Back
            -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 3 : Left-Bottom-Front
            // top
            -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 4 : Left-Top-Back
            +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 5 : Right-Top-Back
            -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 0 : Left-Top-Front
            +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 1 : Right-Top-Front
            // bottom
            -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 3 : Left-Bottom-Front
            +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, +CUBE_UNITY_COORD, // point 2 : Right-Bottom-Front
            -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 7 : Left-Bottom-Back
            +CUBE_UNITY_COORD, -CUBE_UNITY_COORD, -CUBE_UNITY_COORD, // point 6 : Right-Bottom-Back
        };
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(cubeVertices.length * FLOAT_CAPACITY_BYTES);
        byteBuffer.order(ByteOrder.nativeOrder());
        cubeBuffer = byteBuffer.asFloatBuffer();
        cubeBuffer.put(cubeVertices);
        cubeBuffer.rewind();
    }

    private final static float CUBE_UNITY_COORD = 0.5f;
    private static FloatBuffer cubeBuffer;

    private final static int FLOAT_CAPACITY_BYTES = 4;
    private final static int COORDS_PER_VERTEX = 3;
    private final static int VERTICES_NUMBER = 4;

}
导入java.nio.ByteBuffer;
导入java.nio.ByteOrder;
导入java.nio.FloatBuffer;
导入javax.microedition.khronos.egl.EGLConfig;
导入javax.microedition.khronos.opengles.GL10;
导入android.opengl.GLU;
导入android.opengl.GLSurfaceView.Renderer;
公共类MyGLRenderer实现渲染器{
公共myglrender(){
buildCubeBuffers();
}
@凌驾
公共框架(GL10 gl){
gl.glRotatef(0.6f,1.0f,0.0f,0.0f);
gl.glClear(GL10.gl_颜色_缓冲_位| GL10.gl_深度_缓冲_位);
gl.glVertexPointer(每个顶点的坐标,GL10.gl\u浮点,0,立方缓冲);
gl.glEnableClientState(GL10.gl_顶点数组);
//---正面
gl.glColor4f(1.0f,0.0f,0.0f,0.0f);//红色
gl.gldrawArray(GL10.gl\u三角形\u条,0,顶点\u编号);
//---对
gl.glColor4f(0.0f,1.0f,0.0f,0.0f);//绿色
gl.gldrawArray(GL10.gl\u三角形\u条,4,顶点\u编号);
//---背
gl.glColor4f(0.0f,0.0f,1.0f,0.0f);//蓝色
gl.gldrawArray(GL10.gl\u三角形\u条,8,顶点\u编号);
//---左
gl.glColor4f(1.0f,1.0f,0.0f,0.0f);//黄色
gl.gldrawArray(GL10.gl\u三角形\u条,12,顶点\u编号);
//---顶
gl.glColor4f(1.0f,0.5f,0.0f,0.0f);//橙色
gl.gldrawArray(GL10.gl\u三角形\u条,16,顶点\u编号);
//---底部
gl.glColor4f(1.0f,0.0f,1.0f,0.0f);//紫色
gl.gldrawArray(GL10.gl\u三角形\u条,20,顶点\u编号);
//--
gl.glDisableClientState(GL10.gl_顶点数组);
}
@凌驾
表面上的公共空隙已更改(GL10 gl,整型宽度,整型高度){
如果(高度==0)高度=1;
if(宽度<高度)
gl.glViewport(0,0,宽度,宽度);
其他的
gl.glViewport(0,0,高度,高度);
gl.glMatrixMode(GL10.gl_投影);
gl.glLoadIdentity();
GLU.gluLookAt(gl,0.0f,0.0f,3.0f,0.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f);
gl.glMatrixMode(GL10.gl_MODELVIEW);
gl.glLoadIdentity();
}
@凌驾
已创建曲面上的公共void(GL10 gl、EGLConfig配置){
gl.glClearColor(1.0f、1.0f、1.0f、0.0f);
//////////////////////////////////////
/*
*如果我评论下一行:
*=>y轴上的旋转
*黄色面可见,红色面不可见
*否则:黄色不可见,红色可见!!!
*=>x轴上的旋转
*紫色的脸是可见的,红色的脸是不可见的
*否则:紫色不可见,红色可见!!!
*为什么???
*/
//////////////////////////////////////
gl.glEnable(GL10.gl_深度_试验);
}
私有void buildCubeBuffers(){
最终浮点数[]={
//正面
-CUBE_UNITY_COORD,+CUBE_UNITY_COORD,+CUBE_UNITY_COORD,//第0点:左上前方
+CUBE_UNITY_COORD,+CUBE_UNITY_COORD,+CUBE_UNITY_COORD,//第1点:右上前方
-立方体统一坐标,-立方体统一坐标,+立方体统一坐标,//第3点:左下前方
+立方体统一坐标,-立方体统一坐标,+立方体统一坐标,//第2点:右下前方
//对
+CUBE_UNITY_COORD,+CUBE_UNITY_COORD,+CUBE_UNITY_COORD,//第1点:右上前方
+CUBE_UNITY_COORD,+CUBE_UNITY_COORD,-CUBE_UNITY_COORD,//第5点:右上后卫
+立方体统一坐标,-立方体统一坐标,+立方体统一坐标,//第2点:右下前方
+立方体统一坐标,-立方体统一坐标,-立方体统一坐标,//第6点:右下背部
//背
+CUBE_UNITY_COORD,+CUBE_UNITY_COORD,-CUBE_UNITY_COORD,//第5点:右上后卫
-CUBE_UNITY_COORD,+CUBE_UNITY_COORD,-CUBE_UNITY_COORD,//第4点:左上后卫
+立方体统一坐标,-立方体统一坐标,-立方体统一坐标,//第6点:右下背部
-立方体统一坐标,-立方体统一坐标,-立方体统一坐标,//第7点:左下背部
//左
-CUBE_UNITY_COORD,+CUBE_UNITY_COORD,-CUBE_UNITY_COORD,//第4点:左上后卫
-CUBE_UNITY_COORD,+CUBE_UNITY_COORD,+CUBE_UNITY_COORD,//第0点:左上前方
-立方体统一坐标,-立方体统一坐标,-立方体统一坐标,//第7点:左下背部
-立方体统一坐标,-立方体统一坐标,+立方体统一坐标,//第3点:左下前方
//顶
-CUBE_UNITY_COORD,+CUBE_UNITY_COORD,-CUBE_UNITY_COORD,//第4点:左上后卫
+CUBE_UNITY_COORD,+CUBE_UNITY_COORD,-CUBE_UNITY_COORD,//第5点:右上后卫
-CUBE_UNITY_COORD,+CUBE_UNITY_COORD,+CUBE_UNITY_COORD,//第0点:左上前方
+CUBE_UNITY_COORD,+CUBE_UNITY_COORD,+CUBE_UNITY_COORD,//第1点:右上前方
//底部
-立方体统一坐标,-立方体统一坐标,+立方体统一坐标,//第3点:左下前方
+立方体统一坐标,-立方体统一坐标,+立方体统一坐标,//第2点:右下前方
-立方体统一坐标,-立方体统一坐标,-立方体统一坐标,//第7点:左
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    GLU.gluLookAt(gl, 0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    GLU.gluPerspective(something suitable);

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();
    GLU.gluLookAt(gl, 0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);