绘制调用之间的深度缓冲区清除行为?

时间:2018-02-08 19:16:25

标签: webgl depth-buffer batching

我一直在测试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设置和形状,我的测试是否有效,这只是巧合吗? 我可以澄清一下,以便确认我的方法是否可行? 谢谢。

1 个答案:

答案 0 :(得分:1)

由于WebGL基于OpenGL ES,请参阅OpenGL ES 1.1 Full Specification, 4.1.6 Depth Buffer Test, page 104

  

如果深度比较失败,深度缓冲测试会丢弃传入的片段。

     

...

     

比较用

指定
void DepthFunc( enum func );
     

此命令采用单个符号常量:NEVERALWAYSLESSLEQUALEQUALGREATER之一{ {1}},GEQUAL。因此,如果输入片段的zw值小于,小于或等于,等于,大于,大于或等于,或者不等于存储在该位置的深度值,则深度缓冲测试始终不会通过。由传入片段的(xw,yw)坐标给出。


这意味着,如果深度缓冲区glClearDepth的清除值是1.0(1.0是初始值)

NOTEQUAL

并清除深度缓冲区

gl.clearDepth(1.0);

,深度函数glDepthFuncgl.clear(gl.DEPTH_BUFFER_BIT); LESSLEQUAL为初始值)

LESS

然后绘制到任何(xw,yw)坐标的下一个片段将通过深度测试并覆盖存储在(xw,yw)位置的片段

(当然必须禁用gl.enable(gl.DEPTH_TEST); gl.depthFunc(gl.LEQUAL); 并且片段必须位于剪辑空间中)