質問

[OK]を、私のGLSLフラグメントシェーダでIは、空間内の特定の行からのフラグメントの距離を計算することができるようにしたい。

この結果は、私が最初に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にそれを回すために?

fake_frag_coordにどのような操作をしますか
役に立ちましたか?

解決

gl_FragCoordは、スクリーン座標であるので、あなたは、画面のサイズと位置に基づいて、それを生成するために、このような情報を持っている必要があるでしょう。あなたが生産しましたfake_frag_coordは、正規化されたデバイスで画面にポイントに対応させていただきます私は思う(-1 1)座標。あなたが特定の次元で画面の半分のサイズで乗算し、そのサイズを追加していたのであれば、あなたは、実際の画面ピクセルを取得したい。

他のヒント

あなたが持っている問題は、シェーダで計算gl_ModelViewProjectionMatrix * gl_Vertexはいつも何の固定機能パイプラインの利回りはないということです。同じ結果を得るために、DO fake_frag_coord = ftransform()。

編集ます:

そして、あなたの画面サイズでそれをスケーリングます。

私はあまりにもnitpickことができるように、私はより多くの担当者があればいいのに。 ここで私は知っているものです。 位置は、フラグメントシェーダに到着した時点で、それはNDC座標ですでにだし、それまでにWが1.0になり、あなたがWで分割する必要がある唯一の時間はあなたの場合であるので、OpenGLは、あなたのために自動的に割る-Wを行い、あなたには、いくつかの奇妙な理由のために、NDCは、あなたの頂点シェーダ内の座標を取得したい場合は、CPU側で同じ数学をやってみたい、と同じ結果を得る、ORます。

varying vec2 fake_frag_coord;
//in vertex shader:

fake_frag_coord=(gl_ModelViewMatrix * gl_Vertex).xy
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top