赞
踩
前面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值,那么我们就可以这样写:
- Shader "Custom/BlendTest"
- {
- Properties
- {
- _MainTex ("Texture", 2D) = "white" {}
- }
- SubShader
- {
- Blend DstAlpha SrcAlpha
- Pass
- {
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
-
- #include "UnityCG.cginc"
-
- struct appdata
- {
- float4 vertex : POSITION;
- float2 uv : TEXCOORD0;
- };
-
- struct v2f
- {
- float2 uv : TEXCOORD0;
- float4 vertex : SV_POSITION;
- };
-
- v2f vert (appdata v)
- {
- v2f o;
- o.vertex = UnityObjectToClipPos(v.vertex);
- o.uv = v.uv;
- return o;
- }
-
- sampler2D _MainTex;
-
- fixed4 frag (v2f i) : SV_Target
- {
- fixed4 col = tex2D(_MainTex, i.uv);
- return col;
- }
- ENDCG
- }
- }
- }
对比原图,我们会发现渲染的图片比原图更亮了。
这里博主就不在一一测试了,有兴趣的读者可以尝试各种各样的效果。 这里篇幅原因,下一篇再来说一下BlendOp。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。