1. ホーム
  2. opengl

[解決済み] gl_PointSizeの動作について

2022-02-17 15:33:46

質問事項

DXのバックグラウンドを持つ私は、gl_PointSizeとgl_PointCoordがどのように機能するのか、正確に理解しようとしているところです。私はオンラインとマニュアルページを探しましたが、それらについて本当に良い説明を持っていませんでした。例えば、300x300 の出力バッファがあり、300x300 バッファの各位置に対応する 90,000 点のバーテックスシェーダを定義したとします(各次元で 1 ずつ増加します)。ここで、頂点シェーダで gl_PointSize を 2 と定義すると、フラグメントシェーダは 90,000 回呼び出されるのでしょうか、それとも 360,000 回呼び出されるのでしょうか?360,000回であれば、gl_PointCoordが何を表しているのか理解できるのですが。しかし、もし90,000回だけなら、各フラグメント出力は4ピクセルを表すということになるのでしょうか?そしてこの場合、gl_PointCoordは何を表しているのでしょうか?常に0.5,0.5となり、あまり意味がないのでしょうか?

ありがとうございます。

解決方法は?

の14.4.1 "基本的なポイントラスタライズ"セクションを参照してください。 OpenGL 4.5コアプロファイル仕様 が記載されています。

ポイントラスタライズは、フレームバッファの各ピクセルにフラグメントを生成します。 その点の(xw; yw)を中心とする正方形の中に中心がある。 一辺の長さは現在のポイントサイズと同じです。

そのため、ポイントサイズ > 1 の場合、複数のフラグメントが生成される可能性があります。フラグメントシェーダーはフラグメントごとに最低1回起動されます。マルチサンプリングを除けば、フラグメントごとに1回起動されるので、36万回が正解となります。

これは、FS が起動される前にフラグメントを破棄するかもしれないので、あなたが説明しているシーンで役割を果たすかもしれないし、そうでないかもしれない初期の深度テストも無視することに注意してください。

仕様書の同項目より。

<ブロッククオート

点スプライトのラスタライズで生成されたフラグメントには、すべて 同じ関連データ、すなわち、その頂点に対応するデータである。 点です。ただし、フラグメントシェーダー内蔵の gl_PointCoord には、ポイント・スプライト・テクスチャ座標が含まれます。そのため s 点スプライト テクスチャ座標は、ポイント 水平に左から右へ もし POINT_SPRITE_COORD_ORIGINLOWER_LEFT このとき、t座標は垂直方向に0から1まで変化します。 から上へ。それ以外の場合は、点スプライトテクスチャ座標原点 は UPPER_LEFT は、その t 座標は、垂直方向に0から1まで変化します。 上から下へ [...]

つまり、点座標は、あなたが期待するものを正確に表しているのです。ただし、この定義は、ポイントサイズが1でマルチサンプリングが使用されていない場合でも、ポイント座標が必ずしも0.5になるとは限らないことを意味します。その場合、フラグメントシェーダが起動されるのは ピクセルセンター そのため、1x1 ピクセルの大きな点のどこをサンプリングしているかがわかります。