java - Android OpenGL ES 2.0 多个对象

标签 java android opengl-es opengl-es-2.0

我们使用适用于 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/

相关文章:

跨 Java 虚拟机实现的 Java toString 表示?

java - 外部库会使应用变慢吗?

ios - 在 iOS/Swift 中,MatrixHelper 属于哪个模块?

javascript - 如何在 Eclipse 中使用 Phonegap 在移动目录中创建简单的文本文件

android - ActionBar 项目总是出现在溢出菜单中

java - 哪个更适合 OpenGL ES——使用模型 View 调用或动画进行转换?

ios - OpenGL iOS 2d 4 英寸显示器

java - 如何解决android studio中构建gradle中的重复条目

java - 将复杂的 JSON 反序列化为 Java,类嵌套多层

android - 另一个 fragment 内的谷歌地图 fragment