我通过将要模糊的对象绘制到离屏帧缓冲区/纹理上,然后对其进行几次过滤(在两个离屏帧缓冲区之间来回),在WebGL中生成模糊的阴影),然后将结果复制到最终输出。
然而,我只是丢弃RGB通道,用所需的投影颜色(通常是黑色)覆盖它们,同时保持alpha通道。通过让我的屏幕外帧缓冲区成为单个(alpha)通道,我似乎可以获得更好的性能。
有没有办法做到这一点,它真的有用吗?
此外,是否有更好的方法来应用过滤器的多次传递,而不仅仅是在两个帧缓冲区之间交替并使用前一个帧缓冲区的绑定纹理作为输入?
答案 0 :(得分:1)
假设WebGL遵循GLES,则按the spec(页91):
应用程序创建的帧缓冲区对象的颜色缓冲区的名称 是COLOR_ATTACHMENT0 ...颜色缓冲区由R,G,B和 可选地,无符号整数值。
因此,您不能仅附加到A,也不能只附加到任何单一颜色通道。
要探索的选项:
使用colorMask
禁用对R,G和B的写入。根据GPU内部使用的数据布局,您可以想象可以有效地实现您想要的或可能无效的任何效果。
有没有办法可以渲染到深度通道而不是alpha通道?
减少内存带宽通常很有帮助,但如果它不是瓶颈,那么最终可能会过早优化。
为了避免过多的每帧乒乓,你通常会尝试改造你的着色器,以便它能够完成所有阶段的效果。否则考虑是否有更好的线性方式来组合多次传球。而不是只知道如何从阶段n到阶段n + 1,你能从阶段n到阶段2n吗?或者甚至只是n + 2?