gl_FragCoord 変数は、4 つのコンポーネントを格納します: (x, y, z, 1/w )
w座標とは何ですか? なぜ1/wとして保存されるのですか?
gl_FragCoord 変数は、4 つのコンポーネントを格納します: (x, y, z, 1/w )
w座標とは何ですか? なぜ1/wとして保存されるのですか?
GLSL と OpenGL の仕様は、この点で不必要に混乱しています。OpenGL 仕様の方が理解しやすいですgl_FragCoord
。ウィンドウ空間の頂点位置の X、Y、および Z コンポーネントを格納します。X、Y、Z の値は、ウィンドウ空間の位置の計算で説明したように計算されます (ただし、ピクセルの中心と左上の原点によって X と Y の値が変更される場合があります)。これはCoordinate Transforms
、仕様のセクションで説明されています。
の W コンポーネントgl_FragCoord
は (1 / W c ) です。ここで、W cはクリップ空間の頂点位置です。それgl_Position.w
はあなたの頂点シェーダーからのものです。
W cを保持する唯一の有用な目的は、クリップ空間の位置を元に戻すために逆変換することです。gl_FragCoord
そのページが示すように、これには W cを掛ける必要があります。ただし、gl_FragCoord
この値の逆数のみを格納するため、 で割る必要がありgl_FragCoord.w
ます。
したがって、OpenGL はあまり意味を成すことが許可されていないため、OpenGL はこのように格納していると想定できます ;) ほら、OpenGL 仕様のすべての部分に少し無意味な何かがなければならないというルールです。XYZ コンポーネントは非常に理にかなっているため、実際に必要な値の逆数を格納することにしました。
OK、技術的には、これは 3D Labs が GLSL を作成した時代の歴史的なアーティファクトです。彼らが純粋に利己的なハードウェア上の理由でそれを行ったと確信していますが、その本当の証拠はありません。
同次座標は(x, y, z, w)で与えられ、 (x/w, y/w, z/w)に射影されます。はこの射影を保存しますが、最後のコンポーネントの (役に立たない) (w/w) = (1)gl_FragCoord
を保存するのではなく、(1/w)を保存して有用な情報を保存します。