Android OpenGL ES 2.0 多个对象

Android OpenGL ES 2.0 multible objects

我们为 android 使用 Opengl ES 2.0,并试图显示两个相互堆叠的立方体。为此,我们有两个顶点缓冲区(mCubePositions1 和 mCubePositions2),它们存储立方体数据(顶点组合成三角形)并为它们中的每一个调用单独的绘制方法:

    GLES20.glVertexAttribPointer(mPositionHandle, mPositionDataSize, GLES20.GL_FLOAT, false,0, mCubePositions1); //the second time mCubePositions2
    GLES20.glEnableVertexAttribArray(mPositionHandle);
    //some Code concerning lightning and textures
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 36);

结果是显示了两个立方体,但是如果我们让它们旋转,第二个绘制的立方体总是显示在最上面(第二个立方体通过第一个立方体发光)。 在 onSurfaceCreated 方法中,我们初始化深度缓冲区:

    // Set the background clear color to black.
    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    GLES20.glClearDepthf(1.0f);
    // Use culling to remove back faces.
    GLES20.glEnable(GLES20.GL_CULL_FACE);
    // Enable depth testing
    GLES20.glEnable(GLES20.GL_DEPTH_TEST);
    GLES20.glDepthFunc(GLES20.GL_LEQUAL);
    GLES20.glDepthMask(true);

有一个解决方案将两个缓冲区合并为一个,而不是只调用一个绘制方法,但这不是我们的解决方案,因为我们想单独移动立方体。

如果这不是足够的代码来回答请询问更多。

感谢您的每一个回答:)

如果您启用了深度测试,但它仍然不起作用,这通常意味着您没有深度缓冲区。

当在 Android 中使用 GLSurfaceView 时,您可以通过调用 setEGLConfigChooser 方法请求初始化视图时需要的缓冲区。此方法有一些重载。最常用的是为每个缓冲区取一个大小(位数)。典型的调用如下所示:

setEGLConfigChooser(8, 8, 8, 0, 16, 0);

这意味着您需要 RGB 每个 8 位,不需要 alpha,需要 16 位深度缓冲区,并且不需要模板。

请注意,不能保证您会得到完全指定的尺寸,但会得到可用配置中可能的最佳匹配。