当前位置:   article > 正文

Shader-Blend_shader blend

shader blend

前面a测试时用到过Blend命令,这里博主解释一下,Blend的意思是说如果要渲染的像素在GBuffer中已经有缓存,那么应该渲染哪一个像素?是GBuffer中的像素?还是原游戏物体的像素?还是说两个做一些操作后再去渲染?这里就要用到Blend。

Blend共分为两个指令,Blend scr(原像素)*factor dst(GBuffer中的像素)*factor,和BlendOp Operation(哪种操作),如果用到了BlendOp,那么Unity会自动忽略Blend指令。factor共分为以下几种,博主这里尽可能的写的详细些:

One:就是数字1,例如:Blend One One,就是说让原像素和GBuffer中的像素原样混合渲染。

Zero:就是数字0,例如Blend One Zero就是只渲染原像素

SrcColor:原像素的颜色值

SrcAlpha:原像素的a值

DstColor:GBuffer中的颜色值

DstAlpha:GBuffer中的a值

OneMinusSrcColor:1-原像素的颜色值

OneMinusSrcAlpha:1-原像素的a值

OneMinusDstColor:1-GBuffer的颜色值

OneMinusDstAlpha:1-GBuffer的颜色值

下面用代码来测试一下吧,比如说要渲染的像素是原像素*GBuffer中的a值与GBuffer*原像素的a值,那么我们就可以这样写:

  1. Shader "Custom/BlendTest"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Texture", 2D) = "white" {}
  6. }
  7. SubShader
  8. {
  9. Blend DstAlpha SrcAlpha
  10. Pass
  11. {
  12. CGPROGRAM
  13. #pragma vertex vert
  14. #pragma fragment frag
  15. #include "UnityCG.cginc"
  16. struct appdata
  17. {
  18. float4 vertex : POSITION;
  19. float2 uv : TEXCOORD0;
  20. };
  21. struct v2f
  22. {
  23. float2 uv : TEXCOORD0;
  24. float4 vertex : SV_POSITION;
  25. };
  26. v2f vert (appdata v)
  27. {
  28. v2f o;
  29. o.vertex = UnityObjectToClipPos(v.vertex);
  30. o.uv = v.uv;
  31. return o;
  32. }
  33. sampler2D _MainTex;
  34. fixed4 frag (v2f i) : SV_Target
  35. {
  36. fixed4 col = tex2D(_MainTex, i.uv);
  37. return col;
  38. }
  39. ENDCG
  40. }
  41. }
  42. }

对比原图,我们会发现渲染的图片比原图更亮了。

这里博主就不在一一测试了,有兴趣的读者可以尝试各种各样的效果。 这里篇幅原因,下一篇再来说一下BlendOp。

 

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

闽ICP备14008679号