2012-04-30 3 views

答えて

12

GLSLとOpenGLの仕様は、この点で不必要に混乱します。 OpenGL仕様は理解しやすくなります。gl_FragCoordは、ウィンドウスペースの頂点位置のX、Y、Z成分を格納します。 X、Y、およびZの値は、ウィンドウスペースの位置を計算するために説明したように計算されます(ただし、ピクセル中心と左上の原点はXとYの値を変更できます)。これは、仕様のCoordinate Transformsセクションに記載されています。

gl_FragCoordのW成分がW Cクリップ空間頂点位置である場合、(1/C W)です。頂点シェーダのgl_Position.wです。

Wを維持するための唯一の有用な目的は、クリップスペースの位置を戻すことです。reverse-transform gl_FragCoordを返すのは、reverse-transform gl_FragCoordです。そのページに示されているように、Wで乗算する必要があります c。しかし、gl_FragCoordはこの値の逆数しか格納していないので、今度はgl_FragCoord.wで割る必要があります。

したがって、OpenGLはそれほど意味を持たないため、このようにOpenGLを格納していると見なすことができます;)OpenGL仕様のすべての部分には無意味なものがなければならないというルールがあります。 XYZコンポーネントはあまりにも意味をなさないので、実際に必要とする値の逆数を格納することに決めました。

技術的には、これは3D LabsがGLSLを作成した時代の歴史的なアーティファクトです。私は彼らが純粋に利己的なハードウェアの理由のためにそれをしたと確信していますが、私はその本当の証拠はありません。

2

座標均質で与えられます。 gl_FragCoordはこの投影を保存しますが、最後のコンポーネントには(無駄な)(w/w)=(1)を保存するのではなく、(1/w)を保存しておくと便利です。

+1

"' gl_FragCoord'はこの投影を保存します。 "いいえ、それはポストプロジェクション変換をウィンドウ空間に保存します。 –

関連する問題