【问题标题】:Webgl: alternative to writing to gl_FragDepthWebgl:替代写入 gl_FragDepth
【发布时间】:2014-07-28 20:33:15
【问题描述】:

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

据我所知,gl_FragDepth 在 webgl 1.x 中不存在,但我想知道是否有任何其他方式(扩展、特定于浏览器的支持等)可以做到这一点。

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

【问题讨论】:

  • 您可以像这样在gl_Position.z = x * 2.0 - 1.0 中操作顶点着色器中的深度值,其中x[0,1] 中(或[-1,1] 没有* 2.0 - 1.0)...但是如果gl_Position.w=1.0 这将有效...
  • @andre 还没有解决方案吗?
  • @ViktorSehr 看起来有些浏览器现在实现了扩展。查看接受的答案。

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


【解决方案1】:

有分机EXT_frag_depth

因为它是一个扩展,它可能并非在任何地方都可用,因此您需要检查它是否存在。

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

如果isFragDepthAvailable 不是假的,那么您可以在着色器中启用它

#extension GL_EXT_frag_depth : enable

否则,您可以在顶点着色器中操作 gl_Position.z,尽管我怀疑这对于大多数需求来说并不是真正可行的解决方案。

【讨论】:

    【解决方案2】:

    Brad Larson 有一个巧妙的解决方法,他在 Molecules (full blog post) 中使用了这个解决方法:

    为了解决这个问题,我使用 绑定到纹理大小的帧缓冲区对象 屏幕。对于每一帧,我首先做一个渲染通道,其中唯一的 输出的值是对应于深度的颜色值 那一点。为了处理多个重叠的对象,可能 写入同一个片段,我启用颜色混合并使用 GL_MIN_EXT 混合方程。这意味着颜色分量 用于该片段(R、G 和 B)是所有片段中的最小值 对象试图写入该片段的组件(在我的 坐标系,0.0的深度是靠近观察者,1.0是远 离开)。为了提高写入深度值的精度 这个纹理,我将深度编码为颜色,以这样的方式作为深度 值增加,首先填充红色,然后是绿色,最后是蓝色。 这给了我 768 个深度级别,效果还不错。

    编辑:刚刚意识到 WebGL 不支持最小混合,所以不是很有用。对不起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多