0

www.songho.caで、射影行列が次のように定義されていることを示す記事を読みました。

[2n/(r-l) 0        (r+l)/(r-l)  0            ]
[0        2n/(t-b) (t+b)/(t-b)  0            ]
[0        0        -(f+n)/(f-n) -2*n*f/(f-n) ]
[0        0        -1           0            ]

どこ:

n: near
f: far
l: left
r: right
t: top
b: bottom

また、 www.geeks3d.comで次の別の定義を読みました。

[w 0 0  0]
[0 h 0  0]
[0 0 q -1]
[0 0 qn 0]

どこ:

w=(2*near)/(width * aspect)
h = 2near/height
q=-(far+near)/(far-near)
qn=-2*(far*near) / (far-near)

M[0][2]とに違いがあるのはなぜですかM[1][2](一方を除いて、他方は転置されています)。それらは同じ結果を生成しますか? 転置せずにGLSLで使用できるのはどれですか?

4

1 に答える 1

1

最初のマトリックスを使用すると、クリッププレーンの左、右、上、下の位置を任意に配置できます。2つ目は、常に中心にある対称錐台を提供しますが、これは一種の制限です。たとえば、立体視レンダリングを行う場合、左右の平面をわずかにシフトする必要があります。

ところで、転置なしでGLSLで使用できるのはどれですか?

これはGLSLとは何の関係もありません。どちらでも使用できます。参照している転置は、行列がOpenGLで内部的に表現され、外部とのインターフェースをとる方法に由来します。

とにかく、マトリックスをシェーダーソースコードにハードコーディングするのではなく、Uniformを介して提供する必要があります。

アップデート

OpenGLは、その行列列をメジャーに並べ替えます。

0 4 8 c
1 5 9 d
2 6 a e
3 7 b f
于 2012-06-18T07:52:00.607 に答える