14

わかりました、私の GLSL フラグメント シェーダーでは、空間内の特定の線からフラグメントまでの距離を計算できるようにしたいと考えています。

この結果、最初に頂点シェーダーでさまざまな vec2 セットを使用して、最終的な結果をミラーリングしようとしていますgl_FragCoord

varying vec2 fake_frag_coord;
//in vertex shader:
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
fake_frag_coord=(gl_ModelViewProjectionMatrix * gl_Vertex).xy;

今私が期待するフラグメントシェーダーで:

gl_FragCoord.xy==fake_frag_coord

しかし、そうではありません。パイプラインは、私が怠っているgl_Positionものに変えるためにどのような操作を行いますか?gl_FragCoordfake_frag_coord

4

4 に答える 4

11

gl_FragCoord は画面座標なので、位置に基づいて生成するには画面サイズなどの情報が必要です。あなたが作成した fake_frag_coord は、正規化されたデバイス座標 (-1 から 1) の画面内のポイントに対応します。したがって、特定の寸法で画面サイズの半分を掛けてから、そのサイズを加算すると、実際の画面ピクセルが得られます。

于 2009-08-17T15:19:10.733 に答える
0

問題は、シェーダーで計算されたgl_ModelViewProjectionMatrix * gl_Vertexが、固定関数パイプラインが生成するものとは限らないことです。同じ結果を得るには、fake_frag_coord = ftransform()を実行します。

編集:

次に、画面のサイズに合わせて拡大縮小します。

于 2009-09-07T21:59:09.693 に答える
0

私もニックピックできるように、もっと担当者がいたらいいのにと思います。これが私が知っていることです。OpenGL は自動的に Divide-By-W を実行するため、位置がフラグメント シェーダーに到達するまでに、それは既に NDC 座標にあり、それまでに W は 1.0 になります。W で除算する必要があるのは、次の場合のみです。 CPU 側で同じ計算を行い、同じ結果を得たい場合、または何らかの奇妙な理由で、頂点シェーダー内で NDC 座標を取得したい場合。

于 2015-07-08T16:26:09.693 に答える
-2
varying vec2 fake_frag_coord;
//in vertex shader:

fake_frag_coord=(gl_ModelViewMatrix * gl_Vertex).xy
于 2010-04-07T13:36:26.733 に答える