【发布时间】:2018-02-08 19:16:24
【问题描述】:
我一直在测试 WebGL,看看我是否可以以特定方式批量绘制多边形。我将简化用例,但大致如下:
首先,我的顶点很简单:
vertices[v0_xy0, v1_xyz, ... vn_xyz]
在我的例子中,每个顶点的 z 值必须在 (0 - 100) 范围内(我任意选择 100),因为我希望使用这些 z 值对所有这些顶点进行深度测试。在批次 N + 1 上,我再次被限制为深度值 (0 - 100),但我需要保证这批中的顶点被绘制在所有先前批次(顶点层)的顶部。换句话说,每个批次中的顶点都针对每个批次进行了深度测试,但每个批次都只是在前一个批次之上绘制,就好像没有深度测试一样。 起初我打算尝试使用帧缓冲区和深度缓冲区附件绘制到纹理,绘制到画布,重复下一组顶点,但我意识到我可能能够做到这一点:
// pseudocode
function drawBuffers()
// clear both the color and the depth
gl.clearDepth(1.0);
gl.clear(gl.CLEAR_COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
// iterate over all vertex batches
for each vertexBatch in vertexBatches do
// draw the batch with depth testing
gl.draw(vertexBatch);
// clear the depth buffer
/* QUESTION: does this guarantee that subsequent batches
will be drawn atop previous batches, or will the pixels be written at
random (sometimes underneath, sometimes above)?
*/
gl.clearDepth(1.0);
gl.clear(gl.DEPTH_BUFFER_BIT);
endfor
end drawBuffers
我通过绘制两个重叠的四边形、清除深度缓冲区、向左和在负 z 方向平移(试图“进入”前一批)并再次绘制两个重叠的四边形来测试上述内容。我认为这是可行的,因为我看到第二对四边形绘制在第一对的前面,即使它们的 z 值落后于前一对的 z 值;
我不确定我的测试是否可靠。可能涉及一些未定义的行为吗?我的测试由于 clearDepth 设置和形状而起作用,这只是巧合吗? 我可以澄清一下,以便我可以确认我的方法是否确实有效? 谢谢。
【问题讨论】:
-
很抱歉,我不确定你是否理解这个问题,但也许我写得不好。向后工作,是的,我需要测试。我分别绘制不同基元的大缓冲区,但 z 值不是严格线性的。解释起来很棘手,但是是的,我需要深度测试,因为它不是真正的线性绘图。为了澄清我的主要问题,清除深度缓冲区是否保证所有新像素都将绘制在旧像素之上?我的想法是清除缓冲区基本上会使“到目前为止绘制的内容”成为扁平背景。
-
哦,好吧。我想我有点(双关语?)困惑。对于那个很抱歉。是的,1.0 是默认值,因为深度介于 0 和 1 之间。感谢您的澄清。我建议写一个实际的答案,以便我可以将其标记为解决方案。
标签: webgl depth-buffer batching