2009-08-17 19 views
14

私のGLSLフラグメントシェーダでは、スペース内の特定のラインからのフラグメントの距離を計算できるようにしたいと考えています。glslでgl_FragCoordを計算する方法

この結果は、私が最初gl_FragCoordで終わるものをミラーリングするために、私の頂点シェーダに設定された様々なVEC2を使用しようとしていますということです。

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_FragCoordに変換しますか?

答えて

11

gl_FragCoordは画面座標なので、Positionに基づいて画面サイズなどの情報を生成する必要があります。あなたが作成したfake_frag_coordは、私が思うに標準化されたデバイス座標の画面内のポイントに対応します(-1対1)。そのため、特定のディメンションで画面のサイズの半分を乗算してそのサイズを追加すると、実際の画面ピクセルが得られます。

+1

私はあなたが間違っていると間違っていましたが、gl_ModelViewProjectionMatrix * gl_Vertexを使用すると、計算エラーが発生する可能性があります。 – karx11erx

+2

Nitpick:ラスタライズ処理中(頂点シェーダとフラグメントシェーダの間)に発生するパースペクティブ分割を実行していないので、実際には正規化されたデバイス座標ではなくクリップ空間座標が与えられます。 http://www.glprogramming.com/red/chapter03.html#name1 – Pike65

+0

@ Pike65これは単なるニックピックではなく、透視投影のために全く異なる値になるはずです。 –

0

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

編集:

次に、画面の寸法で拡大縮小します。

+0

ftransformは、断片を生成するのではなく、位置を生成します。問題は、ポジションを取る方法を尋ねることではありません。 –

+0

私の答えは完全に間違っていませんでした。 fake_frag_coordを画面の大きさに合わせて縮尺する必要がありますが、fake_frag_coord = gl_ModelViewProjectionMatrix * gl_Vertexまたは= ftransform()を使用するかどうかによって、結果が異なる場合があります。 – karx11erx

-2
varying vec2 fake_frag_coord; 
//in vertex shader: 

fake_frag_coord=(gl_ModelViewMatrix * gl_Vertex).xy 
0

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

+1

'gl_FragCoord'はNDCでは**ありません**。それはウィンドウの座標です。 –

関連する問題