Webgl:写入gl_FragDepth的替代方法

时间:2014-06-07 19:52:48

标签: glsl webgl raytracing fragment-shader depth-buffer

在WebGL中,是否可以写入片段的深度值或以其他方式控制片段的深度值?

据我所知,glgFragDepth在webgl 1.x中不存在,但我想知道是否还有其他方法(扩展,浏览器特定支持等)。

我想要存档的是让光线跟踪对象与使用通常模型,视图,投影绘制的其他元素一起播放。

2 个答案:

答案 0 :(得分:4)

有扩展名EXT_frag_depth

因为它是一个扩展,它可能无处不在,所以你需要检查它是否存在。

var isFragDepthAvailable = gl.getExtension("EXT_frag_depth");

如果isFragDepthAvailable没有假,那么您可以使用

在着色器中启用它
#extension GL_EXT_frag_depth : enable

否则你可以操纵顶点着色器中的gl_Position.z,但我怀疑这对大多数需求来说并不是一个可行的解决方案。

答案 1 :(得分:2)

Brad Larson有一个聪明的解决方法,他在分子中使用(full blog post):

  

要解决这个问题,我使用a实现了我自己的自定义深度缓冲区   框架缓冲区对象绑定到纹理的大小   屏幕。对于每一帧,我首先做一个只有渲染的渲染   输出的值是与深度at对应的颜色值   那一点。为了处理可能的多个重叠对象   写入相同的片段,我启用颜色混合并使用   GL_MIN_EXT混合方程。这意味着颜色成分   用于该片段(R,G和B)是所有片段中的最小值   对象试图写入该片段的组件(在我的   坐标系,0.0的深度在观察者附近,1.0是远   远)。为了增加写入的深度值的精度   这个纹理,我用深度来编码深度到颜色   值增加,红色先填充,然后是绿色,最后是蓝色。   这给了我768个深度级别,效果相当不错。

编辑:刚刚意识到WebGL不支持min混合,所以不是很有用。遗憾。