好吧,我有一个非常简单的例子:只是一个三角形,其z坐标等于1(无视图或投影矩阵).坐标是:
0.0, 0.6, 1.0 -0.5, -0.4, 1.0 0.5, -0.4, 1.0
所以三角形位于最远的平面上.DEPTH_TEST已禁用.三角形是可见的,因为-1 <= z <= 1.但是当我启用DEPTH_TEST时:
gl.enable(gl.DEPTH_TEST); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
三角形不再可见.当我将所有z坐标更改为-1(因此它位于最近的平面上)时,它再次变为可见.
那为什么在最远的飞机上看不到它?1)是webgl bug 2)它是webgl/opengl功能吗?3)如果它是一个功能,为什么它以这种方式工作?
glDepthFunc
is 的初始值GL_LESS
,因此即使设置glClearDepthf
为1.0,比较1.0 <1.0也会产生错误,因此片段将被丢弃.
你可以尝试设置glDepthFunc(GL_LEQUAL)
.
请注意,您还应该了解浮点问题.比较确切的相等总是有问题的.即使你没有变换对象空间坐标并在顶点着色器中传递它们,z值也会从NDC范围[-1,1]变换到窗口空间范围[0,1](或者你设置glDepthRangef
).但是,对于-1和1输入情况,这不应该是一个问题,因为中间结果应该可以精确表示而不会损失精度.