7

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

ありがとう

4

1 に答える 1

5

OpenGL 4.5 コア プロファイル仕様のセクション 14.4.1「Basic Point Rasterization」には、次のように記載されています。

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

そのため、ポイント サイズ > 1 の場合、複数のフラグメントが生成される可能性があります。フラグメント シェーダーは、フラグメントごとに少なくとも 1 回呼び出されます。画像からマルチサンプリングを続けると、フラグメントごとに 1 回呼び出されるため、360,000 回が正解です。

これは、FSが呼び出される前にフラグメントを破棄する可能性があるため、説明するシーンで役割を果たすかどうかにかかわらず、初期の深度テストも無視することに注意してください。

仕様の同じセクションから:

ポイント スプライトをラスタライズする際に生成されるすべてのフラグメントには、ポイントに対応する頂点のデータである同じ関連データが割り当てられます。ただし、組み込みのフラグメント シェーダーには、gl_PointCoord ポイント スプライト テクスチャ座標が含まれています。ポイント スプライト テクスチャ座標は、sポイントを水平方向に左から右に 0 から 1 まで変化します。POINT_SPRITE_COORD_ORIGINが の場合LOWER_LEFT、t 座標は垂直方向に下から上に 0 から 1 まで変化します。それ以外の場合、ポイント スプライト テクスチャ座標の原点がUPPER_LEFTの場合、t座標は垂直方向に上から下に 0 から 1 まで変化します。[...]

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

于 2015-08-24T23:15:11.337 に答える