前提
Unityで3D空間に設置したSpriteが、Transparentと重なった時に描画順が崩れます(Transparentが必ず前面に来る)。
以前質問したもの(Unity3Dで描画順を設定できるSpriteをSkyboxより手前に表示したい)と同じで、キャラクターとして表示しているSpriteのため、同じマテリアルを持つオブジェクトを複数重ねて配置しています。
そのため、パーツ毎に描画順を設定する必要があります。
同じシェーダーに関する質問なので、コピペみたいな内容になってしまいますがお許しください。
実現したいこと
- 3D空間に配置されたSpriteが
- 他オブジェクトの影や光の影響を受け
- 同一のシェーダーを持った他Spriteとの表示順を設定でき
- Transparentと干渉しない
という状況を作りたいです。
発生している問題
ZwriteをOffにすることでOrder in Layerから表示順を設定していましたが、Transparentのオブジェクトを配置した際に題目の問題が発生しました。
該当のソースコード
Spriteのシェーダーは以下です。
HLSL
1Shader "Custom/Character" 2{ 3 Properties{ 4 _Cutoff("Cutoff", Range(0,1)) = 0.5 5 _Color("Color", Color) = (1,1,1,1) 6 _MainTex("Albedo (RGB)", 2D) = "white" {} 7 _Glossiness("Smoothness", Range(0,1)) = 0.5 8 _Metallic("Metallic", Range(0,1)) = 0.0 9 } 10 11 SubShader{ 12 Tags { "Queue" = "AlphaTest" "RenderType" = "TransparentCutout" } 13 LOD 200 14 Cull Off 15 ZWrite Off 16 17 CGPROGRAM 18 #pragma surface surf Standard alphatest:_Cutoff addshadow fullforwardshadows 19 #pragma target 3.0 20 21 sampler2D _MainTex; 22 23 struct Input 24 { 25 float2 uv_MainTex; 26 }; 27 28 half _Glossiness; 29 half _Metallic; 30 fixed4 _Color; 31 32 void surf(Input IN, inout SurfaceOutputStandard o) 33 { 34 fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; 35 o.Albedo = c.rgb; 36 o.Metallic = _Metallic; 37 o.Smoothness = _Glossiness; 38 o.Alpha = c.a; 39 } 40 ENDCG 41 } 42 FallBack "Diffuse" 43}
正確には裏面の陰影を表示するため、以下のコードも含まれています。
HLSL
1Cull Front 2 3CGPROGRAM 4 5#pragma surface surf Standard alphatest:_Cutoff fullforwardshadows vertex:vert 6#pragma target 3.0 7 8sampler2D _MainTex; 9 10struct Input 11{ 12 float2 uv_MainTex; 13}; 14 15void vert(inout appdata_full v) 16{ 17 v.normal.xyz = v.normal * -1; 18} 19 20half _Glossiness; 21half _Metallic; 22fixed4 _Color; 23 24void surf(Input IN, inout SurfaceOutputStandard o) 25{ 26 fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; 27 o.Albedo = c.rgb; 28 o.Metallic = _Metallic; 29 o.Smoothness = _Glossiness; 30 o.Alpha = c.a; 31} 32ENDCG
Transparent側はUnityChanShaderのToonColor_DoubleShadeWithFeather_Transparentですが、他のTransparent系シェーダーでも同様の問題が発生しました。
試したこと
ZwriteをOnにすることで回避できますが、表示順が距離依存になってしまうので、この方法だと正確な描写は難しいと判断しました。
Skyboxと干渉した時のように、カメラを複数配置することで解決を試みましたが無理でした。
Problem with ZWrite and sorting objects - Unity Forum
上記のページも参考にしましたが、シェーダーの知識が足りず、解決には至りませんでした。
SpriteのZwriteをOnにしたものでも一応実装はできているので、よほど難解だと判明した場合に諦める準備はできました。
補足情報(FW/ツールのバージョンなど)
Unity 2021.2.8f1

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/29 14:35