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

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

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

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

Unity

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

Q&A

解決済

1回答

1454閲覧

Transparent かつ Unlit なシェーダ と 最前面用シェーダの併用で不具合

lamp

総合スコア41

C#

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

Unity

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

0グッド

0クリップ

投稿2018/08/22 09:28

編集2018/08/22 09:34

こちらのサイトや
リンク内容
こちらの
リンク内容
を参考に、
①常に最前面に表示されるエフェクト用シェーダ
②キャラクター用に使う UnlitかつTransparentなシェーダを使用していますが
各々のシェーダが適用されてるオブジェクトが2つが同時に表示されると透明にしたくないとこが透明になるなど不具合が起きてしまいます。

//アルファ付きUnlit用シェーダ Shader "Unlit/UnlitShadow" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags {"Queue"="Transparent" } LOD 100 //ZWrite Off Blend SrcAlpha OneMinusSrcAlpha // Pass { SetTexture [_MainTex] { } } UsePass "Legacy Shaders/VertexLit/SHADOWCASTER" } }
//エフェクト用シェーダ Shader "Effect" { Properties { [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} _Color ("Tint", Color) = (1,1,1,1) [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0 } SubShader { Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" "CanUseSpriteAtlas"="True" } Cull Off Lighting Off ZTest Always Blend One OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile _ PIXELSNAP_ON #include "UnityCG.cginc" struct appdata_t { float4 vertex : POSITION; float4 color : COLOR; float2 texcoord : TEXCOORD0; }; struct v2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; half2 texcoord : TEXCOORD0; }; fixed4 _Color; v2f vert(appdata_t IN) { v2f OUT; OUT.vertex = UnityObjectToClipPos(IN.vertex); OUT.texcoord = IN.texcoord; OUT.color = IN.color * _Color; #ifdef PIXELSNAP_ON OUT.vertex = UnityPixelSnap (OUT.vertex); #endif return OUT; } sampler2D _MainTex; fixed4 frag(v2f IN) : SV_Target { fixed4 c = tex2D(_MainTex, IN.texcoord) * IN.color; c.rgb *= c.a; return c; } ENDCG } } }

どちらを改良したら良いのでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

多分、Queueが同順位なので、次はカメラからの距離によって両オブジェクトの描画順が決定されることになるかと思います。

もしここで手前に表示されるべきEffectが先に描画されてしまうと、Effectが先にZバッファに深度を書き込んでしまい、後に描画されるUnlitShadowのEffectと重なった部分に描画不具合が生じるのではないでしょうか?

EffectのZWriteをOffにすれば変な部分が透明になってしまう現象はなくなるとは思いますが、やはり描画順は変わらないため、今度は常に全面に表示されるべきEffectがUnlitShadowの背後に隠れてしまう症状が起こると予想されます。

そこでQueueをもっと細かく調整して、EffectのQueueをUnlitShadowのTransparent(3000)より後(たとえば3001)に設定してみてはいかがでしょう。

HLSL

1//エフェクト用シェーダ 2Shader "Effect" 3{ 4 // 省略 5 6 SubShader 7 { 8 Tags 9 { 10 "Queue"="Transparent+1" // 描画順序を他のTransparentより少し後にし、たとえEffectマテリアルのオブジェクト座標がUnlitShadowより奥にあろうが、後に描画させる 11 "IgnoreProjector"="True" 12 "RenderType"="Transparent" 13 "PreviewType"="Plane" 14 "CanUseSpriteAtlas"="True" 15 } 16 17 // 省略 18 19 } 20}

投稿2018/08/22 11:58

Bongo

総合スコア10807

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

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

lamp

2018/08/22 21:18

回答ありがとうございます。 望んでいた挙動になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問