Android OpenGL ES 渲染复杂对象不正确

标签 android opengl-es culling

我正在尝试编写绘制复杂非凸对象的程序。但我有问题 - 有些面孔看起来是透明的。我通过添加部分解决了这个问题 GLES20.glEnable(GLES20.GL_CULL_FACE);

但在那之后我发现如果有两个法线方向相同并且一个放在另一个后面的面是行不通的。在这种情况下,Open GL 渲染不正确。 我也尝试添加 GLES20.glEnable(GLES20.GL_DEPTH_TEST)

但我没有达到目的。而且,那东西消失了一半。你能解释一下吗,我哪里错了?

附言为了获取对象顶点,我使用了 Blender(我将其数据导出到 obj 文件中)。我还检查了这个数据 - 顶点顺序正确(CCW)。

最佳答案

我遇到了同样的问题。问题是您没有在 configAttribslist 中为深度和模板分配缓冲区的大小。因此,即使您指定了 DepthTest,它也不会计算深度。

解决方案:将以下行添加到 eglChooseConfig 属性列表。 EGL10.EGL_DEPTH_SIZE, 8, EGL10.EGL_STENCIL_SIZE, 8,这解决了我的问题。

代码:

private static int[] s_configAttribs2 = { 
   EGL10.EGL_RED_SIZE, 4, 
   EGL10.EGL_GREEN_SIZE, 4, 
   EGL10.EGL_BLUE_SIZE, 4, 
   EGL10.EGL_DEPTH_SIZE, 8, 
   EGL10.EGL_STENCIL_SIZE, 8, 
   EGL10.EGL_SAMPLE_BUFFERS, 1,
   EGL10.EGL_RENDERABLE_TYPE, 
   EGL_OPENGL_ES2_BIT, 
   EGL10.EGL_NONE 

};

egl.eglChooseConfig(display, s_configAttribs2, configs, numConfigs, num_config);

关于Android OpenGL ES 渲染复杂对象不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688461/

相关文章:

opengl-es - 将 glReadBuffer()/glDrawBuffer() 调用转换为 OpenGL ES

android - 获取连接的智能 watch 的电池电量

java - 旋转后保持TextView文本、大小、可见性

android - 解析一对多关系

android - 着色器在平板电脑上产生错误的结果

ios - 在 openGLES IOS 中加载 3D 模型

android - gradle 2.2.1 错误

c++ - 截锥体和球体相交

c++ - C/C++ OpenGL 遮挡剔除

math - 提取视锥体平面(Gribb 和 Hartmann 方法)