我一直在测试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设置和形状,我的测试是否有效,这只是巧合吗? 我可以澄清一下,以便确认我的方法是否可行? 谢谢。
答案 0 :(得分:1)
由于WebGL基于OpenGL ES,请参阅OpenGL ES 1.1 Full Specification, 4.1.6 Depth Buffer Test, page 104:
如果深度比较失败,深度缓冲测试会丢弃传入的片段。
...
比较用
指定void DepthFunc( enum func );
此命令采用单个符号常量:
NEVER
,ALWAYS
,LESS
,LEQUAL
,EQUAL
,GREATER
之一{ {1}},GEQUAL
。因此,如果输入片段的zw值小于,小于或等于,等于,大于,大于或等于,或者不等于存储在该位置的深度值,则深度缓冲测试始终不会通过。由传入片段的(xw,yw)坐标给出。
这意味着,如果深度缓冲区glClearDepth
的清除值是1.0(1.0是初始值)
NOTEQUAL
并清除深度缓冲区
gl.clearDepth(1.0);
,深度函数glDepthFunc
为gl.clear(gl.DEPTH_BUFFER_BIT);
或LESS
(LEQUAL
为初始值)
LESS
然后绘制到任何(xw,yw)坐标的下一个片段将通过深度测试并覆盖存储在(xw,yw)位置的片段
(当然必须禁用gl.enable(gl.DEPTH_TEST);
gl.depthFunc(gl.LEQUAL);
并且片段必须位于剪辑空间中)