凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

Unity で Transparent/Diffuse で描画順が崩れてしまう際の対処法

はじめに

Unity で Plane やポリゴンに対して Transparent なシェーダを設定した時に、下図のように描画順が崩れてしまうことがあります。
f:id:hecomi:20140307004205p:plain
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"
}

結果

f:id:hecomi:20140307005112p:plain
f:id:hecomi:20140307005118p:plain

iTween とかでアニメーションしても綺麗にフェードイン/アウトするようになります。

おわりに

シェーダを使えるようになると Unity で出来ることの幅が広がりそうなので勉強したいと思います。