webgl 绘图顺序,模板缓冲区

Posted

技术标签:

【中文标题】webgl 绘图顺序,模板缓冲区【英文标题】:webgl drawing order, stencil buffer 【发布时间】:2014-01-18 00:01:02 【问题描述】:

我正在阅读 learningwebgl.com,令我困惑的是它绘制了我绑定为最后一个元素的第一个缓冲区?

http://jsfiddle.net/Cx8gG/1/

red triangle
green square
blue square

我希望只看到蓝色方块,因为其他所有内容都被透支了,输出似乎是相反的顺序?

我还阅读了有关模板缓冲区的信息,所以我尝试做的是创建一个蒙版(红色),然后在蓝色方块上应该有一个绿色三角形。

面具有效(http://jsfiddle.net/D3QNg/3/)但我不知道它是否正确,或者我只是幸运。

不胜感激。

【问题讨论】:

你能把模板部分拆分成一个单独的问题吗? 【参考方案1】:

这样做是因为您在第 203 行启用了深度缓冲区

gl.enable(gl.DEPTH_TEST);

深度缓冲区保存绘制的每个像素的深度。在默认模式下,当尝试绘制像素时,WebGL 会检查已经存在的像素的深度,只有当新像素的深度为LESS 时,才会绘制前一个像素。

由于所有形状的深度都是 0.0,因此第一个形状会填充深度缓冲区中具有 0.0 的像素。您绘制的下一个形状的每个像素的深度也为 0.0,不小于已经存在的 0.0,因此这些像素不会被覆盖

如果您注释掉启用深度测试的行,您将获得预期的结果。

注意,启用深度测试后,您可以通过调用函数 gl.depthFunc (docs) 来设置 WebGL 使用的比较来决定是否绘制像素

【讨论】:

以上是关于webgl 绘图顺序,模板缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

WebGL 中有没有办法快速反转模板缓冲区?

webgl绘图原理

WebGL中Stencil Buffer的运用以及ThreeJS的实现

webGL - 如何在帧缓冲区旁边设置模板缓冲区并使用它?

[笔记]《webGL编程指南》- WebGL入门

WebGL:在带有深度模板纹理附件的帧缓冲区上未清除颜色