久しぶりにUnityを触ってます。AssetStoreに出しているやつについてユーザーから問い合わせがあったので。
別にそのアセットで使っていたわけじゃないんだけど、そのユーザーにちょっとしたアイデアを試してもらったときに、僕の環境(Mac)と彼の環境(Win, DX11)との間でちょっと動作の違うことがあって、色々苦労した結果(結果だけ)をブログに残しておこうと思う。
何が違ったかというと、シェーダーでプロジェクションマトリクスを使ったときの挙動。僕のところではちゃんと深度値が書きこまれていたのだけど、彼のところでは深度値が間違っていたようで、Zテストが正しく動作しない。何でそんなことが起こったかというと、僕の書いたスクリプトが間違っていたから。
1 2 |
// 間違ったプログラム (OnWillRenderObject関数の中). Matrix4x4 mvpMatrix = Camera.current.projectionMatrix * Camera.current.worldToCameraMatrix * m_renderer.localToWorldMatrix; |
localToWorldMatrix
はTransformではなくRendererのを使うというのは前のブログで書いた。でもそれだけではなく、Camera.current.projectionMatrix
をそのまま使うのもNGだったのだ!
正しくはこう書かないといけなかった。
1 2 |
// 正しいプログラム (OnWillRenderObject関数の中). Matrix4x4 mvpMatrix = GL.GetGPUProjectionMatrix(Camera.current.projectionMatrix, false) * Camera.current.worldToCameraMatrix * m_renderer.localToWorldMatrix; |
Zテストの結果が違うからprojectionMatrixが怪しいとは思っていたんだけど、まさかGLにその関数があったとは・・・。
Pingback: それでもlocalToWorldMatrixを使うというのか!? という問題 | Nyahoon Games Pte. Ltd.