ユニティちゃんモデルをベースに作ったモデルをRenderTextureにキャプチャした時にほっぺたが黒ずむ問題の解決法
Twitterで最近作っているゲームの進捗を上げているのですが、
今日の進捗その2。
— MIYAKE (@ScreenPocket) October 8, 2019
・戦闘の邪魔にならないようにキャラのキャプチャの横側をアルファで消した
・勝利時の演出(カメラワーク)仮組み pic.twitter.com/uDhUyhYjBw
購入したアセットの女騎士モデルのほっぺたが黒ずんでしまっていました
右下がキャプチャ画像
こちらのモデルはユニティちゃんモデルをベースに作られているようなので、
解決法がブログに書けそうかなーと思いましたので記載します。
結論から書くと、頬の赤らみのアルファ値がRenderTextureに書き込まれてしまって、背景の色と合成されているので、赤らみ側のアルファ値を除去します。
- 新しい「ほっぺた用のシェーダ」を追加する
- 元の「ほっぺた用シェーダ」は「Unlit/Transparent」なのでbuiltInShaderをユニティ公式からDLしてUnlit-Alpha.shaderの内部を「自分が追加したほっぺた用シェーダ」にコピーする
- ブレンド係数の末尾に、Zero Oneを追加(描画元のアルファ値を0にし、描画済みのアルファ値を尊重するように)する
ということでコードは下記
Shader "ScreenPocket/3D/Character/Cheek" { Properties{ _MainTex("Base (RGB) Trans (A)", 2D) = "white" {} } SubShader{ Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent"} LOD 100 ZWrite Off //////////////////////////////////////////////////////////↓ここ! Blend SrcAlpha OneMinusSrcAlpha, Zero One Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 2.0 #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata_t { float4 vertex : POSITION; float2 texcoord : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct v2f { float4 vertex : SV_POSITION; float2 texcoord : TEXCOORD0; UNITY_FOG_COORDS(1) UNITY_VERTEX_OUTPUT_STEREO }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert(appdata_t v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); o.vertex = UnityObjectToClipPos(v.vertex); o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; } fixed4 frag(v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.texcoord); UNITY_APPLY_FOG(i.fogCoord, col); return col; } ENDCG } } }
という事で、解決しました。