在WebGL中,是否可以写入片段的深度值或以其他方式控制片段的深度值?
据我所知,glgFragDepth在webgl 1.x中不存在,但我想知道是否还有其他方法(扩展,浏览器特定支持等)。
我想要存档的是让光线跟踪对象与使用通常模型,视图,投影绘制的其他元素一起播放。
答案 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):
编辑:刚刚意识到WebGL不支持min混合,所以不是很有用。遗憾。要解决这个问题,我使用a实现了我自己的自定义深度缓冲区 框架缓冲区对象绑定到纹理的大小 屏幕。对于每一帧,我首先做一个只有渲染的渲染 输出的值是与深度at对应的颜色值 那一点。为了处理可能的多个重叠对象 写入相同的片段,我启用颜色混合并使用 GL_MIN_EXT混合方程。这意味着颜色成分 用于该片段(R,G和B)是所有片段中的最小值 对象试图写入该片段的组件(在我的 坐标系,0.0的深度在观察者附近,1.0是远 远)。为了增加写入的深度值的精度 这个纹理,我用深度来编码深度到颜色 值增加,红色先填充,然后是绿色,最后是蓝色。 这给了我768个深度级别,效果相当不错。