質問編集履歴

1 タグ変更

quatsch273

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;`
の部分でアルファの適用ができると思っていたのですが、なぜか適用されなくて困っています。。。
お願いします。
  • C#

    14230 questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity3D

    3344 questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

  • Unity

    10078 questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る