【发布时间】:2017-04-08 10:03:48
【问题描述】:
我一直在尝试一些 WebGL,但有一个错误我似乎无法找到解决方法。
目前我有以下设置:
我有大约 100 个三角形,它们都有一个位置,并且由一个 gl.drawArrays 函数绘制。为了让它们以正确的顺序绘制,我使用了gl.enable(gl.DEPTH_TEST);,它给出了正确的结果。
我现在遇到的问题是,如果我在顶点着色器中更新三角形的gl_Position,那么深度测试中不会使用更新的 Z 值。结果是gl_Position.z 为 1 的三角形可以绘制在gl_Position.z 为 10 的三角形之上,这不是我想要的。..
我尝试了什么?
gl.enable(gl.DEPTH_TEST);
gl.depthFunc(gl.GEQUAL);
与
gl.clear(gl.DEPTH_BUFFER_BIT);
gl.clearDepth(0);
gl.drawArrays(gl.TRIANGLES, 0, verticesCount);
在渲染函数中。
以下代码用于创建缓冲区:
gl.bindBuffer(gl.ARRAY_BUFFER, dataBuffer);
gl.bufferData(gl.ARRAY_BUFFER, positionBufferData, gl.STATIC_DRAW);
const positionLocation = gl.getAttribLocation(program, 'position');
gl.enableVertexAttribArray(positionLocation);
gl.vertexAttribPointer(positionLocation, 3, gl.FLOAT, false, false, 0, 0);
z 值较高的三角形尺寸要大得多(由于透视),但小三角形仍然出现在其上(由于渲染顺序)。
在片段着色器中,我使用了gl_fragCoord.z 来查看这是否正确,并且较小的三角形(更远)接收到的 Alpha 值高于较大的三角形(近距离)。
奇怪的绘图行为可能是什么原因造成的?
【问题讨论】:
-
为什么不能在 z=10 的三角形上绘制 z=1 的三角形? 1 IS 小于或等于 10.
-
我希望更高的 Z 值位于顶部,那么实际上应该是
gl.GEQUAL,这很好。深度测试仍然无法在我更新的gl_Position上运行。 -
请在问题中发布一个有效的 sn-p。 SO 要求:“寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及重现它所需的最短代码在问题本身中.
标签: webgl depth-buffer zbuffer