質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.62%

Toonレンダリングでのテクスチャの透過について

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,772

quatsch273

score 8

前提・実現したいこと

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

お願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る