当前位置:   article > 正文

[UnityShader]多Pass处理透明度_unity 多pass

unity 多pass

shader中想让物体出现透明的地方有两种思路。

  • 把物体的渲染队列设置为transparent,此时的物体将会在所有不透明物体之后渲染,从而保证正确的渲染结果。然后我们使用Blend指令来把原颜色缓冲区的颜色乘上当前物体的a通道值,来进行混合。
  • 使用Clip指令来对物体的像素进行裁剪。

Blend指令

每经过一个pass物体就会产生一个临时颜色缓冲区(假设当前为M,上一个颜色缓冲区为N)。
Blend A B,C D 的含义就是混合后新的颜色缓冲区为 float4(AM.rgb+BN.rgb,CM.a+DN.a)
ABCD有许多可取的值,可取值中src含义为来自M值,而dst含义为来自N的值。
如srcalpha意思是M区域的a通道值。

blendop指令是指两个缓冲区的算术,有add(默认) sub revsub max min这些取值。

Clip指令

需要注意的是Clip指令是逐像素操作,所以只能在像素着色器中使用。
Clip(x)如果x<0则当前像素舍弃。

复杂shader(多pass)下的处理

思路一:使用Clip指令。
我们就拿三渲二来说,我们一般会有一个Pass要用来生成描边,所以这个pass会剔除掉正面。如果我们在最后一个pass中去clip会发现,描边产生的背面仍然存在,因为clip只是把当前pass的临时缓冲区的像素给裁剪掉了,所以如果想要达到溶解效果我们需要在每一个pass中去进行clip操作,这是十分麻烦的。同时也十分消耗性能。

思路二:使用Blend指令。
传递缓冲区的alpha信息,在第一个描边pass中使用blend srcalpha oneminusalpha,one zero来覆盖缓冲区的alpha信息,同时可以将上一个缓冲区的颜色通过alpha信息传递。在之后的pass中为了传递alpha信息 我们都可以使用blend dstalpha oneminusdstalpha,dstalpha zero来传递。这样我们就可以用第一个pass中的透明度来处理整个模型了。在这里插入图片描述上图中我是使用了当前顶点的屏幕空间坐标来作为贴图采样uv值。你也可以使用顶点空间的uv来采样贴图获取沿模型的透明度变化,不过需要注意的是,如果是三渲二,如果第一个pass使用的是正面剔除,那么传递过来的透明通道值将会是采样的背面顶点的值,这样产生的效果好像模型凹进去了一样,所以建议可以使用一个pass,来传递alpha信息,而不传递color值。

思路三:制造透明的假象。grabpass
在最后一个pass处理前,使用grabpass来抓取屏幕的颜色信息,这样,就只需要对最后一个pass做clip或blend混合操作。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/96753
推荐阅读
相关标签
  

闽ICP备14008679号