【问题标题】:Android OpenGL ES 2.0 multible objectsAndroid OpenGL ES 2.0 多对象
【发布时间】:2016-01-18 04:34:37
【问题描述】:

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

    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);

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

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

感谢您的每一个回答:)

【问题讨论】:

  • 在初始化GLSurfaceView 时是否有setEGLConfigChooser() 调用?如果是,您是否在那里请求深度缓冲区?
  • 非常感谢。我们因为教程而调用了该方法,但不知道所有参数的含义。为深度缓冲区添加一个值解决了我们的问题:)

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


【解决方案1】:

如果您启用深度测试,但仍然无法正常工作,这通常意味着您没有深度缓冲区。

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

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

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

请注意,不能保证您将获得完全指定的尺寸,但在可用配置中尽可能匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多