2

glViewport: 幅/高さは整数 (ピクセル) です。

ただし、glViewportIndexed にはこれらの値が float で含まれています。それらをフロートにする利点は何ですか。私の理解は、ピクセルは常に整数であるという事実に基づいています。

4

2 に答える 2

1

コメントであなたの新しい質問に答えるのは難しいことがわかったでしょう.


@ AndonM.Coleman、わかりました。しかし、なぜglViewportは整数でx、y、w、hを持っているのですか?

おそらく、glViewport (...)が作成された当時、プログラム可能なパイプラインがなかったためです。当時でさえ、サブピクセル オフセットが使用されることがありましたが (特に、 や などのラスタライズ カバレッジ ルールを一致させようとする場合GL_LINES) GL_TRIANGLES、変換マトリックスに適用する必要がありました。

mat4代わりにビューポート変換を使用して同じことを行うことができます。これは、巨大な(16 スカラー) をジオメトリ シェーダーに渡すよりもはるかに簡単です (ビューポートに 4 つのスカラーが必要です) 。


ビューポート変換をすべてのビューポートに適用するか、最初のビューポートのみに適用しますか。

GL_ARB_viewport_array拡張仕様から:

glViewportすべてのビューポートのパラメーターを同じ値に設定し、(エラーが生成されないと仮定して) 以下と同等です。

  for (GLuint i = 0; i < GL_MAX_VIEWPORTS; i++)
    glViewportIndexedf(i, 1, (GLfloat)x, (GLfloat)y, (GLfloat)w, (GLfloat)h);

@ AndonM.Coleman、2 番目の質問: VIEWPORT_SUBPIXEL_BITS が値 4 を返す場合、gl_FragCoord.xy はオフセット (0,0) (0.5, 0) (0, 0.5) および (0.5, 0.5) を持つ値を持ちますか?

サブピクセル精度が 4 ビットの場合、変換後の頂点位置がピクセル幅の 1/16 の位置にスナップされること意味ます。GL は実際にはここでサブピクセル ビットを必要としません。このような場合、ウィンドウ スペースに変換した後の頂点の位置は、一度に 1 ピクセルの距離だけジャンプし、シーン内で何かを移動すると、多くの「キラキラ」が表示されます。

このアニメーションは「キラキラ」を示しています。それはここから生まれました:

       

カメラが動くと白い点が見えますか? 頂点を変換するときに十分なサブピクセル精度がない場合、ラスタライザーは隣接していると思われるエッジを適切に処理することが困難になります。これの専門用語は T-Junction Error ですが、私は「キラキラ」という言葉がとても好きです ;)

に関してはgl_FragCoord.xy、実際には頂点変換中のサブピクセル精度の影響を受けません。これは、フラグメント内のサンプルの場所です (通常、指摘したように... + 0.5に配置されます)、頂点処理とは関係ありません。

于 2014-06-13T18:06:58.410 に答える