【问题标题】:OpenGL depth buffer on AndroidAndroid上的OpenGL深度缓冲区
【发布时间】:2010-04-29 15:28:20
【问题描述】:

我目前正在学习 Android (2.1) 上的 OpenGL ES 编程。我从强制性的旋转立方体开始。它旋转得很好,但我无法让深度缓冲区工作。多边形总是按照 GL 命令渲染它们的顺序显示。我在 GL 初始化期间这样做:

gl.glClearColor(.5f, .5f, .5f, 1);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glClearDepthf(1f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);

在表面变化我这样做:

gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f, 100f);

当我启用背面剔除时,一切看起来都是正确的。但是背面剔除只是一种速度优化,所以它也应该只与深度缓冲区一起工作吗?那么这里缺少什么?

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

    自己找到的。不是 GL 代码,是 android 代码:

    view.setEGLConfigChooser(false);
    

    这一行中的“false”明确表示不应分配 Z-Buffer。将其切换为“true”后,它工作得很好。

    【讨论】:

      【解决方案2】:

      我使用的是 NDK r10 中 hello-gl2 示例中提供的 GL2JNIView, 我也遇到了这个问题。

      问题是在创建 GL2JNIView 对象时,我没有在构造函数上指定深度大小,以便私有类 ConfigChooser 可以找到正确的 EGL 配置。

      public GameJNIView(Context context, boolean translucent, int depth, int stencil){...}
      public GameJNIView(Context context){...}
      
      myView = new GL2JNIView(this, false, 16, 0);
      

      而不是

      myView = new GL2JNIView(this);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-04
        • 1970-01-01
        • 1970-01-01
        • 2015-12-13
        • 1970-01-01
        相关资源
        最近更新 更多