ScreenPocket - 画面の隙間

Unityエンジニアの日々の雑記。たまにpython3、DirectX、PhotoshopScript(JavaScript)も触ります

ユニティちゃんモデルをベースに作ったモデルをRenderTextureにキャプチャした時にほっぺたが黒ずむ問題の解決法

Twitterで最近作っているゲームの進捗を上げているのですが、


購入したアセットの女騎士モデルのほっぺたが黒ずんでしまっていました
f:id:ScreenPocket:20191008233634p:plain
右下がキャプチャ画像

こちらのモデルはユニティちゃんモデルをベースに作られているようなので、
解決法がブログに書けそうかなーと思いましたので記載します。

結論から書くと、頬の赤らみのアルファ値がRenderTextureに書き込まれてしまって、背景の色と合成されているので、赤らみ側のアルファ値を除去します。

  1. 新しい「ほっぺた用のシェーダ」を追加する
  2. 元の「ほっぺた用シェーダ」は「Unlit/Transparent」なのでbuiltInShaderをユニティ公式からDLしてUnlit-Alpha.shaderの内部を「自分が追加したほっぺた用シェーダ」にコピーする
  3. ブレンド係数の末尾に、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
			}
	}

}

f:id:ScreenPocket:20191008234353p:plain
という事で、解決しました。