quatsch273 score 8
2016/09/04 13:00 投稿
Toonレンダリングでのテクスチャの透過について |
###前提・実現したいこと |
3DのキャラクターをUnity上に配置して、シェーダを設定しています。 |
一部テクスチャが透過pngで設定されていて、透過部分のメッシュは何もないものとして奥にあるものが描画されるようになってほしいです。 |
###発生している問題・エラーメッセージ |
いろいろなサイトでやり方を探してみましたが、いずれもうまくいかず。。。 |
特に標準のToonShaderを少し書き換えた以下のソースでアルファが反映されないのはなぜなのかがわからず困っています。 |
###該当のソースコード |
ader "Custom/ToonAlpha" { |
Properties{ |
_Color("Main Color", Color) = (0.5,0.5,0.5,1) |
_OutlineColor("Outline Color", Color) = (0,0,0,1) |
_Outline("Outline width", Range(.002, 0.03)) = .005 |
_MainTex("Base (RGB) Alpha (A)", 2D) = "white" {} |
_Ramp("Toon Ramp (RGB) Alpha(A)", 2D) = "gray" {} |
} |
CGINCLUDE |
`#include "UnityCG.cginc"` |
struct appdata { |
float4 vertex : POSITION; |
float3 normal : NORMAL; |
}; |
struct v2f { |
float4 pos : SV_POSITION; |
UNITY_FOG_COORDS(0) |
fixed4 color : COLOR; |
}; |
uniform float _Outline; |
uniform float4 _OutlineColor; |
v2f vert(appdata v) { |
v2f o; |
o.pos = v.vertex; |
o.pos.xyz += v.normal.xyz *_Outline * 0.2; |
o.pos = mul(UNITY_MATRIX_MVP, o.pos); |
o.color = _OutlineColor; |
return o; |
} |
ENDCG |
SubShader{ |
Tags{ "RenderType" = "Transparent" } |
Blend SrcAlpha OneMinusSrcAlpha |
LOD 200 |
CGPROGRAM |
`#pragma surface surf ToonRamp` |
sampler2D _Ramp; |
// custom lighting function that uses a texture ramp based |
// on angle between light direction and normal |
`#pragma lighting ToonRamp exclude_path:prepass` |
inline half4 LightingToonRamp(SurfaceOutput s, half3 lightDir, half atten) |
{ |
`#ifndef USING_DIRECTIONAL_LIGHT` |
lightDir = normalize(lightDir); |
`#endif` |
half d = (dot(s.Normal, lightDir)*0.5 + 0.5) * atten; |
half3 ramp = tex2D(_Ramp, float2(d,d)).rgb; |
half4 c; |
c.rgb = s.Albedo * _LightColor0.rgb * ramp * 2; |
c.a = s.Alpha; |
return c; |
} |
sampler2D _MainTex; |
float4 _Color; |
struct Input { |
float2 uv_MainTex : TEXCOORD0; |
}; |
void surf(Input IN, inout SurfaceOutput o) { |
half4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; |
o.Albedo = c.rgb; |
o.Alpha = c.a; |
} |
ENDCG |
// UsePass "Toon/Basic Outline/OUTLINE" |
Pass{ |
Name "OUTLINE" |
Tags{ "LightMode" = "Always" } |
Cull Front |
ZWrite On |
ColorMask RGB |
Blend SrcAlpha OneMinusSrcAlpha |
CGPROGRAM |
`#pragma vertex vert` |
`#pragma fragment frag` |
`#pragma multi_compile_fog` |
fixed4 frag(v2f i) : SV_Target |
{ |
UNITY_APPLY_FOG(i.fogCoord, i.color); |
return i.color; |
} |
ENDCG |
} |
} |
Fallback "Diffuse" |
} |
###試したこと |
課題に対してアプローチしたことを記載してください |
`c.a = s.Alpha;` |
の部分でアルファの適用ができると思っていたのですが、なぜか適用されなくて困っています。。。 |
お願いします。 |