はじめに
Unity で Plane やポリゴンに対して Transparent なシェーダを設定した時に、下図のように描画順が崩れてしまうことがあります。
Transparent/Diffuse なシェーダで alpha = 1 な時と、Diffuse が一致して欲しかったのですが、何故かこういった現象が起きてしまったので調べてみました。
対処法
上記フォーラムにも書かれている通り、通常の Transparent なシェーダではデプスバッファに書き込みをしないため、単純に描画順によって物体の前後が決まってしまうからのようです。そこで以下のようにデプスバッファに書き込む Transparent なシェーダを代わりに用意することで、これを回避できるようです。
Shader "Transparent/Diffuse ZWrite" { Properties { _Color ("Main Color", Color) = (1,1,1,1) _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {} } SubShader { Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} LOD 200 // extra pass that renders to depth buffer only Pass { ZWrite On ColorMask 0 } // paste in forward rendering passes from Transparent/Diffuse UsePass "Transparent/Diffuse/FORWARD" } Fallback "Transparent/VertexLit" }
結果
iTween とかでアニメーションしても綺麗にフェードイン/アウトするようになります。
おわりに
シェーダを使えるようになると Unity で出来ることの幅が広がりそうなので勉強したいと思います。