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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity3D

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1832閲覧

【Unity】自作の一部が透過するシェーダーで非透過部分のみ影を描画するようにしたい

Y0241-N

総合スコア1066

Unity3D

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2022/06/03 06:54

実現したいこと

タイトル通りです、高さによって一部を透過するシェーダーを作ったのですが、非透過部分のみ影が描画さえるようにしたいです。具体的にはStandardシェーダーのCutoutや以下の画像の左側のようにしたいです。
イメージ説明

該当のソースコード

cgprogram

1Shader "Custom/PartialTransparency-Height" 2{ 3 Properties 4 { 5 _UpperColor ("Upper Color", Color) = (1,1,1,0) 6 _UnderColor ("Under Color", Color) = (1,1,1,1) 7 _MainTex ("Albedo (RGB)", 2D) = "white" {} 8 _Glossiness ("Smoothness", Range(0,1)) = 0.5 9 _Metallic ("Metallic", Range(0,1)) = 0.0 10 _SeparationHeight ("Separation Height", Float) = 0.0 11 } 12 13 SubShader 14 { 15 Tags { "RenderType"="TransparentCutout" "Queue" = "AlphaTest" } 16 LOD 200 17 18 CGPROGRAM 19 20 #pragma target 3.0 21 #pragma surface surf Standard fullforwardshadows alpha:fade 22 23 sampler2D _MainTex; 24 25 struct Input { 26 float2 uv_MainTex; 27 float3 worldPos; 28 }; 29 30 fixed4 _UpperColor; 31 fixed4 _UnderColor; 32 half _Glossiness; 33 half _Metallic; 34 float _SeparationHeight; 35 36 void surf (Input IN, inout SurfaceOutputStandard o) 37 { 38 fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * lerp(_UnderColor, _UpperColor, step(_SeparationHeight, IN.worldPos.y)); 39 o.Albedo = c.rgb; 40 o.Metallic = _Metallic; 41 o.Smoothness = _Glossiness; 42 o.Alpha = c.a; 43 } 44 ENDCG 45 } 46 Fallback "Transprent/Cutout/Diffuse" 47}

試したこと

http://tsumikiseisaku.com/blog/shader-tutorial-transparent/
このサイトを見て真似してみましたが上手くいきませんでした。

補足情報

Unity2019.1.4f1

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

そのような影を作るとなると、ShadowCasterパスもカスタマイズしてやる必要がありそうですね。
下記のような形はいかがでしょうか?

ShaderLab

1Shader "Custom/PartialTransparency-Height" 2{ 3 Properties 4 { 5 _UpperColor ("Upper Color", Color) = (1,1,1,0) 6 _UnderColor ("Under Color", Color) = (1,1,1,1) 7 _MainTex ("Albedo (RGB)", 2D) = "white" {} 8 _Glossiness ("Smoothness", Range(0,1)) = 0.5 9 _Metallic ("Metallic", Range(0,1)) = 0.0 10 _SeparationHeight ("Separation Height", Float) = 0.0 11 } 12 13 SubShader 14 { 15 Tags { "RenderType" = "TransparentCutout" "Queue" = "AlphaTest" } 16 LOD 200 17 18 CGPROGRAM 19 20 #pragma target 3.0 21 #pragma surface surf Standard fullforwardshadows alpha:fade 22 23 sampler2D _MainTex; 24 25 struct Input { 26 float2 uv_MainTex; 27 float3 worldPos; 28 }; 29 30 fixed4 _UpperColor; 31 fixed4 _UnderColor; 32 half _Glossiness; 33 half _Metallic; 34 float _SeparationHeight; 35 36 void surf(Input IN, inout SurfaceOutputStandard o) 37 { 38 fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * lerp(_UnderColor, _UpperColor, step(_SeparationHeight, IN.worldPos.y)); 39 o.Albedo = c.rgb; 40 o.Metallic = _Metallic; 41 o.Smoothness = _Glossiness; 42 o.Alpha = c.a; 43 } 44 ENDCG 45 46 Pass 47 { 48 Name "ShadowCaster" 49 Tags { "LightMode" = "ShadowCaster" } 50 51 ZWrite On 52 53 CGPROGRAM 54 #pragma vertex vert 55 #pragma fragment frag 56 57 struct appdata 58 { 59 float4 vertex : POSITION; 60 float2 uv : TEXCOORD0; 61 }; 62 63 struct v2f 64 { 65 float4 pos : SV_POSITION; 66 float2 uv : TEXCOORD0; 67 float3 worldPos : TEXCOORD1; 68 }; 69 70 v2f vert(appdata v) 71 { 72 v2f o; 73 o.pos = UnityObjectToClipPos(v.vertex); 74 o.uv = v.uv; 75 o.worldPos = mul(unity_ObjectToWorld, v.vertex); 76 return o; 77 } 78 79 sampler3D _DitherMaskLOD; 80 sampler2D _MainTex; 81 fixed4 _UpperColor; 82 fixed4 _UnderColor; 83 float _SeparationHeight; 84 85 fixed4 frag(v2f i) : SV_Target 86 { 87 // メイン描画部分と同様に透明度を求め... 88 float alpha = tex2D(_MainTex, i.uv).a * lerp(_UnderColor.a, _UpperColor.a, step(_SeparationHeight, i.worldPos.y)); 89 90 // 透明度に応じて_DitherMaskLODから網掛け模様をサンプリングし... 91 float alphaRef = tex3D(_DitherMaskLOD, float3(i.pos.xy * 0.25, alpha * 0.9375)).a; 92 93 // シャドウマップを網掛け模様にすることで透明度に応じた影を作らせる 94 clip(alphaRef - 0.01); 95 96 // ShadowCasterパスではデプスがどうなるかが重要で、返す色はなんでもいい 97 return 0.0; 98 } 99 ENDCG 100 } 101 } 102 Fallback "Transprent/Cutout/Diffuse" 103}

図

投稿2022/06/03 22:19

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y0241-N

2022/06/06 00:13

完璧に理想通りです、Shadow Casterの部分が全く分からなかったので助かりました、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問