Renderingカメラ空間からプロジェクション空間に座標変換する過程の理解が曖昧だったので、それに関する記事です。プロジェクション座標変換とは?そもそもプロジェクション座標変換とは、カメラに映る視錐台の領域を、xyzがぞれぞれ-1から1に収まるような領域に変換することです。この結果を使って、xとyが共に-1の部分をディスプレイの右下に、xとyが共に1の部分をディスプレイの右上に描画すれば、カメラで映した3D空間をディスプレイに投影できたことになります。プロジェクション座標変換はこのような意味を持つ行列です。ちなみに正確には上述のz値の範囲はプラットフォームにより異なりますが、目的は同じです。この辺りは下の記事が詳しいです。株式会社ロジカルビートプロジェクション行列掛けるだけじゃダメこのプロジェクション座標変換の手順を見ていきます。前提として、プロジェクション座標変換を行う前の座標はカメラ空間にある座標です。これはローカル座標をいわゆるMV行列に掛けて算出しますが、詳細は割愛します。座標変換の行列は4x4なので、上記で得られる座標は3次元の座標(xyz)にw値が1としてくっついている4次元の値となっています。P行列)にこの座標を掛けます。これは頂点シェーダで行う処理です。UnityObjectToClipPos(v.vertex)とかやってるアレです。注意しなければいけないのは、これだけではプロジェクション座標変換は完了していないという点です。ここまでで求められた座標の各成分をこの座標のw値で除算することで初めて座標変換は完了します。このw除算の部分だけは頂点シェーダに記述せずGPU側で暗黙的に行われる処理であるため非常に認識しづらいですが、そういう処理になっています。このような仕組みになっているのかは下のサイトで分かりやすく説明されています。完全ホワイトボックスなパースペクティブ射影変換行列Unityで確認する上記の挙動を簡単にUnity上で確認してみます。確認手順は下記の通り。カメラの視錐台と同じ形のメッシュをレンダリングするP行列で座標変換するw値で除算するこの結果、xyzが-1から1の立方体がレンダリングされれば座標が正常に変換されたことになります。次の節から上記の手順を順番に確認していきます。視錐台と同じ形のメッシュカメラの視錐台と同じ形のメッシュを生成します。}}マテリアルには頂点カラーを出力するだけのシンプルなシェーダをアサインしておきます。視錐台と同じ大きさのオブジェクトが生成されました。P行列で座標変換する次にこれにP行列を適用します。UpdateVertices()内で頂点座標を求めた後にVP行列を掛けます。vertex;}結果は次のようになります。想定する結果が得られていないことが確認できます。ちなみに上記ではCamera.projectionMatrixを使用していますが、プラットフォームごとに適したP行列を得るにはGL.GetGPUProjectionMatrix()を使うようです。GPUにP行列を渡すときにはこっちを使います。今回はCPU計算かつ確認するだけが目的なので使いません。詳細が知りたい方は下の記事へ。w値で除算する最後に、先ほど得られた頂点座標をw値で除算してみます。一行追加しただけですが、最終的なソースコードになるので全文記載します。}}レンダリング結果はこのようになります。大きさはわかりづらいですが、目的の立方体が得られ、プロジェクション座標変換が行えたことが確認できました。»プロフィールUnityエンジニア。グラフィックスへの興味が強めです。Blur(渦巻ブラー)のポストエフェクトを実装する月別アーカイブはてなブログをはじめよう!halya_11さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。