引き続きShaderの勉強をしていきます。
前回はZTestやZWrite周りを勉強したので今回はBlend周りをやってみたいと思います。
Test1(半透明用)とTest2(不透明用)シェーダーを作りました。
Test1
Shader "Custom/Test1"{
Properties {
_MainColor("MainColor" , Color) = (1,1,1,1)
}
SubShader {
Tags {"Queue" = "Transparent" "RenderType" = "Transparent"}
ZWrite Off
ZTest LEqual
Blend SrcAlpha OneMinusSrcAlpha
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
uniform float4 _MainColor;
float4 vert(float4 pos : POSITION ): SV_POSITION {
return mul(UNITY_MATRIX_MVP,pos);
}
float4 frag() : SV_TARGET {
return _MainColor;
}
ENDCG
}
}
}
Test2
Shader "Custom/Test1"{
Properties {
_MainColor("MainColor" , Color) = (1,1,1,1)
}
SubShader {
Tags {"Queue" = "Geometry" "RenderType" = "Opaque"}
ZWrite On
ZTest LEqual
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
uniform float4 _MainColor;
float4 vert(float4 pos : POSITION ): SV_POSITION {
return mul(UNITY_MATRIX_MVP,pos);
}
float4 frag() : SV_TARGET {
return _MainColor;
}
ENDCG
}
}
}
白CubeにTest1,赤CubeにTest2をつけてみたところ正常に動作しました。
###あえて描画しない
描画しない
Shader "Custom/Test3" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
}
SubShader {
Tags {"Queue" = "Geometry-1"}
Pass{
Zwrite On
ColorMask 0
}
}
}
プチ解説
完全透明Cubeの背後にあるタイルのシェーダーのQueueはGeometryが設定されています(Unlitシェーダー)
今回のシェーダーのQueueはGeometry-1が設定されているので先に描画が行われます。デプスバッファに位置情報が書き込まれますが、ColorMask 0が設定されているため何も描画されません。そのためピクセル位置にはQueue = Backgroundの背景の色がそのまま残ることになります。
次いでQueue = GeometryのタイルのZTestが行われますが、ZTest LEqualが指定してあるため、より手前にある完全透明に勝てず描画が行われません。
結果的にピクセルに残る色は背景になる、というわけです :)
シェーダー面白い :)