版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/coolbeliever/article/details/82013183
前面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。