2016-01-15 90 views
0

我们使用Opengl ES 2.0 for android,并试图显示两个堆叠在一起的多维数据集。为此,我们有两个vertexbuffers(mCubePositions1和mCubePositions2),其存储Cubedata(顶点结合,三角形),并要求他们每个人一个单独的绘制方法:Android OpenGL ES 2.0多功能对象

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

有两个缓冲器合并成一个,不是要求只是一个拉法的解决方案,但这不是我们的一个解决方案,因为我们要单独移动立方体。

如果这不是答案的代码,请询问更多。

谢谢你的每一个答案:)

+0

当初始化'GLSurfaceView'时,你有'setEGLConfigChooser()'调用吗?如果是的话,你在那里请求深度缓冲区吗? –

+0

非常感谢。我们称这种方法是因为一个教程,但并不知道所有参数的含义。为depth-buffer添加一个值解决了我们的问题:) – AutomatProject

回答

2

如果启用了深度测试,它仍然无法正常工作,这通常意味着你没有一个深度缓冲。

在Android中使用GLSurfaceView时,通过调用setEGLConfigChooser方法请求初始化视图时需要的缓冲区。这种方法有一些重载。最常用的每个缓冲区都需要一个大小(位数)。一个典型的呼叫将是这样的:

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

这意味着你要各8位RGB,不需要α,想要一个16位深度缓冲,并且不需要模板。

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