这周我浪费了大约 30 个小时来编写和重写代码,我认为我误解了 OpenGL 深度缓冲区的工作原理。我尝试的一切,都失败了。现在,我通过查找 OpenGL 的 Android 实现中可能存在的错误解决了我的问题。
请参阅此 API 条目:
http://www.opengl.org/sdk/docs/man/xhtml/glClearDepth.xml
void glClearDepth(GLclampd 深度);
指定清除深度缓冲区时使用的深度值。初始值为 1。
Android 的实现有两个版本的这个命令:
glClearDepthx采用整数值,钳位为 0-1
glClearDepthf采用浮点值,钳位为 0-1
如果你使用glClearDepthf(1)那么你会得到你期望的结果。如果您像我一样使用glClearDepthx(1),那么您会得到不同的结果。(请注意,1 是默认值,但是使用参数 1 调用命令会产生与根本不调用它不同的结果。)我不知道到底发生了什么,但是深度缓冲区被清除为一个与实际不同的值我已经指定了。