イラスト、モデリング、Unity、VR関連

unityとかblenderとかvr関連の作業メモ

shader ZTestとRender Queue

++基本

・ZTestはデプステストとも呼ぶ。ZTestはその時点でデプスバッファに書き込まれている値(以降、z値)と比較することで行う

・ unityのz値はカメラに近い方が低く、遠い方が高い。

・オブジェクトはQueueの順番に処理され、Queueの値が低いほど先に処理をされる。言い換えれば、Queueの順にz値の書き込みとテストが行される

・処理時にそのオブジェクトに指定された比較方法でZTest を行う.

(言い換えれば、ztest alwaysを指定してようとそれが有効なのはそのオブジェクトの処理時のみで、別のオブジェクト処理時には無関係になる)

・ZTestはフラグメント・ピクセルごとに行われる。

・ZTestはその時点で書き込まれているZ値との比較である

・ZWriteをOnにしている場合、ZTestを指定された方法でパスした場合、そのピクセルに新たにZ値が書き込まれる。

・ZWriteをOffにしてZTestをパスした場合、既に書き込まれているz値をそのままにする

 

 

+半透明のオブジェクトのZTest

・ZWriteをオンにしている場合、半透明のアルファブレンディングを行うオブジェクトのQueueは非透明のオブジェクトより高くないと、アルファブレンドされず、後ろのオブジェクトが透過されない。

ZWriteオフの場合はQueueに関わらずブレンドされる。

当たり前の話だが、半透明であっても、Z値はそのオブジェクトのZ値が書き込まれる。ZWrite Offの場合、Z値が書き込まれない。既に書き込まれているZ値が次の処理で使用される(多分 

 

++++各手法の比較

++ZTest Equal

Z値が同じ場合に描画されるらしいのだが、よくわからない

 

++ZTest always

・ZTest alwaysはそれよりQueueが同値以下のオブジェクトにのみ有効

・ZTest always同士の場合、Queueが高い方が優先される

 

++ZTest Greater

バッファのz値と比較して、それより高い場合に描画される。

自身よりQueueの低いオブジェクトが手前にある場合に描画される。

言い換えれば、Queueが高く遠くにあるほど優先順位が高くなる。

手前のオブジェクトがZWrite Offになってる場合、もしくは何もない場合、描画されない

(描画されないのは、Queueが低い背景の、非常に高いz値が入ってるからと思われる)

 

 

++ZTest Less

デフォルトのLEquueとほぼ同じ

バッファのz値と比較して、それより低い場合に描画される。

自身がカメラに対して近いほど描画されやすい

 

++ZTest Equal

よくわからない。理屈の上ではZ値が同じであれば描画され、ピクセルにそのカラーが書き込まれるのだと思うが、

ZTest EqualのオブジェクトよりQueueの低いZWrite Onにした半透明のPlaneを通過させたりしてみたが、まったく描写されない。

(当たってる面の部分が描画されると思ったのだけど・・・)

同一座標、同一サイズのQubeを重ねると、ZTest EqualのQubeが描画される。なので、重なった場合に描画するか否かの設定、ということになるのだろうか?