2011-08-23 27 views
6

私が間違っている場合は私を修正してください。 頂点シェーダとピクセルシェーダを使用する場合、通常、頂点シェーダの出力gl_positionを計算するコードを提供します。 次に、ピクセルシェーダに入力gl_FragCoordを持つ擬似オブジェクトを見つけます。 OpenGLがgl_positionからgl_FragCoordを計算するために実行する操作の名前は何ですか?それらが "投影"と "クリップ座標変換"であるのは正しいですか? 次に、これらの操作中に変換が正確に何を実行していますか? 言い換えれば、gl_FragCoordとgl_positionの間の数学的関係は何ですか?私はOpenGL関数を置き換えるために使うことができますか?glslでは、gl_positionからgl_fragCoordを計算するために使用される式は何ですか?

ありがとうございました。

+0

私は同じ問題を抱えていましたが、「OpenGL:GLSLのウインドウスペース座標から計算した視線座標を計算しますか?」という質問に答えました。右のリンクを見つけることができます。 – karx11erx

+0

申し訳ありませんkarx11erx、これは私が欲しいものではありません。実際には、私が望むのは反対です。私は "unproject"したくない、私は2次元画面の座標に私の3次元座標を投影したい。 – wil

+0

シェーダが最初に(明るいビュー空間から)プロジェクトを外してから、(ビューアの画面空間に)投影するため、そこでの操作方法を見ることができます。 – karx11erx

答えて

9

gl_Positionはポストプロジェクション同次座標です。

はgl_FragCoordが断片の(2D)の位置にある間gl_Positionは、頂点の(4D)の位置であることが注目に値します。間で起こる

操作が

  1. プリミティブアセンブリ(3つの頂点、例えばから三角形を生成する)
  2. クリッピング(すなわち、ビュー内のすべての上にある複数の三角形で三角形を切断しますそれが最初)
  3. ビューポートのアプリケーションに適合しない場合
  4. ラスタライズ(それらの三角形を取り、そこから覆われた断片を生成する)

したがって、ビューポートである2D空間の頂点位置から表現された任意の点を変換する式を見つけることはできますが、生成されたフラグメントが直接頂点の位置。頂点の2次元座標を求める式は

2d_coord_vertex = viewport.xy + viewport.wh * (1 + gl_Position.xy/gl_Position.w)/2 

です。これはやはりgl_FragCoordではありません。より深い知識が必要な場合は、GL仕様のラスタライズの詳細を確認してください。

「OpenGL関数を置き換える」という意味は正確にはわかりませんが、ラスタライズは簡単ではなく、SOの回答の範囲を超えています。

+0

あなたの答えをありがとう。私の目的は、シャドウマップライティングシェーダを実装することです。ライトの位置(ライトの「投影行列」を使用)からシーンをレンダリングすることによって、奥行きマップ(シャドウマップ)を作成しましたが、最終シーンの頂点をレンダリングするときに、シャドーデータをマップからフェッチするために使用する座標。シャドーマップを作成したときにgl_positionの値を取得し、シャドーマップを作成したときにgl_fragCoordという値を計算して、シャドーデータを正しい位置に取得することができると思いました。それは働くことができますか? – wil

+0

@wil:これを行う典型的な方法は、(別の出力で)gl_Positionと一緒にワールドを渡すか、またはスペースの位置をフラグメントシェーダに渡すことです。このように、フラグメントシェーダでは、正しい補間位置(渡されたものに応じてビューまたはワールド空間内)が行列によって変換され、それを軽い空間に戻すことができます。短い答えは、gl_FragCoordに頼らず、必要なものを渡すことです。 – Bahbar

+0

私はあなたが何をしているかは分かりませんが、シャドウマップを計算するようには聞こえません。それは私が言及していたものであり、あなた自身のものとは大きく異なっているようです。あなたが解決しようとしていることについていくつかの洞察を持って新しい質問を開くことをお勧めします – Bahbar

関連する問題