我们使用适用于 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
来请求初始化 View 时所需的缓冲区。方法。此方法有一些重载。最常用的是每个缓冲区的大小(位数)。典型的调用如下所示:
setEGLConfigChooser(8, 8, 8, 0, 16, 0);
这意味着您需要 RGB 每个 8 位,不需要 Alpha,需要 16 位深度缓冲区,并且不需要模板。
请注意,我们不保证您会获得完全指定的尺寸,但会获得可用配置中的最佳匹配。
关于java - Android OpenGL ES 2.0 多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34816110/