ShaderLab 定義済みの値と座標空間とその変換について - イラスト、モデリング、Unity、VR関連
の記事のプロジェクション変換についての追加情報を書く。
++w除算が行われるタイミング
Unityの場合、w除算はvertexシェーダ終了後に、返り値となる構造体の変数の内、SV_POSITIONのセマンティクスが与えられた変数に行われ、これはビューポートの座標となる。
(TEXCOORD0を付けた場合は、ラスタライザを経由し、[0,1]のスクリーン座標になる)
++w除算を明示的に行う場合
GrabPass等でテクスチャマッピングをする場合に使用
例えば、
【Unity】【シェーダ】GrabPassを使って屈折シェーダを作る - LIGHT11
では、
(samplingScreenPos.xy / samplingScreenPos.w) * 0.5 + 0.5;
という処理が行われている。w除算はビューポート座標(プロジェクション座標をw除算した後の空間をビューポートと呼ぶ)にするため、
*0.5+0.5は-1~1で表されるビューポート座標から0~1で表されるテクスチャ座標へと変換している
(屈折シェーダの場合は問題ないが、これだけでは上下が逆転するので注意)
☆PROJECT ASURA☆ [OpenGL] 『射影テクスチャリング』