シェーダーは、シェーディングされたメッシュが占めるピクセルを超えて、スクリーンピクセルをペイントできますか?


8

ジオメトリとコンピューティングシェーダーのプログラミングの経験はありますが、フラグメントシェーダーを実際に使ってみたことはありません。現在、私はそれらがどのように機能するか、そしてそれらの可能性をよりよく理解しようとしています。私が複数の場所で読んだことの1つは、フラグメント(スクリーンピクセル)がフラグメントシェーダー内でそれ自体を超えて拡張できないことです。つまり、反復される特定のフラグメントは、それ自体にのみ影響を与えることができます。

したがって、私は学習のために、次のことが可能かどうか(可能であれば、一般的にはどのようにして達成できるか)を知りたいと思います。簡単にするために、2つの頂点のみからなるポイントメッシュ(3Dワールド空間に配置)があるとします。これらの2つの頂点のそれぞれが画面上のWorldToViewportの正確な位置に描画されるようにシェーダーをプログラムできますか。また、radius = Rの各頂点を囲む円も、それらが延長されている場合でも周囲のピクセルに描画されます。シェーダーがアタッチされている元のメッシュを超えていますか?下の図のように(円の中心にある赤い四角形が画面に描かれた頂点を表します):

ここに画像の説明を入力してください

それが可能であれば、頂点を超えて延びるこれらの円が互いの色(RGBA)に影響を与えるように、シェーダーをプログラムすることもできますか?下の図のように:

ここに画像の説明を入力してください

私が言ったように、これらが可能であるなら、私はそのようなことを達成する方法の少しを概念的または実際的な面で聞きたいです。フラグメントシェーダーで行われますか、それとも頂点シェーダーまたはジオメトリシェーダーで前に計算する必要がありますか?メッシュボディが占めるフラグメントを超えて「追加のフラグメント」を計算して渡す方法は?


ジオメトリシェーダーは、元のメッシュのプリミティブよりも多くのプリミティブを追加する場合があります。これはあなたのためにそれをしますか?
Andreas

回答:


6

線幅または線のアンチエイリアシングまたはポイント幅またはポイントスプリットを使用すると、OpenGLは、線または点の代わりに、テクスチャ座標を持つ小さな長方形を作成します。現在では、テッセレーターやジオメトリシェーダーを使用して、これを自分でプログラムすることもできます。

まったく異なるアプローチは、遅延シェーディングを使用することです。1つの幾何学的パスを使用して情報をRGBAZバッファーに格納し、次に2番目のパスで画面のすべてのピクセルを実行して処理を行います。(すべてのピクセルに作用するには、1つのフルスクリーンの長方形を描きます)。今日では、最初のパスを1つまたは複数の「テクスチャーへのレンダリング」として実行し、次にこれらのテクスチャーをMIPmapして、最後のパスがより少ないローカル値に簡単にアクセスできるようにすることもできます。


ありがとう!私は最初にあなたが言ったことをやっていて、ジオメトリシェーダーを使用してポイントの周りにジオメトリを作成し、ポイントの周りにピクセルを描画できるようにしました。もちろん機能しますが、より厄介なソリューションです。私はあなたが言ったことの最後の部分に特に興味を持ちました:私が正しく理解していれば、シーン全体をレンダリングしてから、関心のある領域に向けられたスクリーンシェーダーを使用してから、中心のポイントの周りに必要なピクセル数を処理するためにレンダリングされたフレーム?
AndrewSteer 2016年

テクスチャの最初のパスをレンダリングできます。次に、全画面の2番目のパスで、各ピクセルで、ピクセルの周りのディスクのテクスチャコンテンツを検査して、必要な処理を実行できます(たとえば、最も近い塗りつぶされたピクセルに従って色を付けるか、距離がしきい値未満の場合にのみ白くペイントします)。 。もちろん、単にディスクを描画するだけの場合、これは最も効率的な方法ではあり
ません

確かに、私が考えることができる単純な例を挙げただけです。しかし、はい、私はあなたが言うことは私が考えていたものと一致していると思います。つまり、あるパスでテクスチャにレンダリングし、その後、他のパスで、周囲のピクセルにあるものに関連してピクセルを変更するための情報を得ます。どうもありがとう。
AndrewSteer 2016年

3

メッシュ内の各頂点に対して描画される円(またはその他の形状)を調整できる1つの良い方法は、ジオメトリインスタンスを使用することです。これは、メッシュの複数のインスタンス(コピー)を一度に描画できるGPU機能であり、1組のバッファーによって与えられたメッシュの頂点/インデックスと、インスタンスごとに追加のデータを提供できる別の頂点バッファーを備えています。頂点シェーダーを使用して、選択した方法で両方のバッファーのデータを組み合わせることができます。

具体的に言うと、あなたの場合、希望する半径の円を表すメッシュを作成し、その頂点を画面空間座標で直接指定し、原点を中心にできます。次に、インスタンス化を使用して、GPUに元のポイントメッシュのすべての頂点の円メッシュの新しいコピーをレンダリングさせます。頂点シェーダーでは、ポイントのスクリーンスペースの位置を計算し(通常のようにワールドビュープロジェクション変換を使用)、円メッシュを移動してその位置を中心にします。

質問の2番目の部分については、円がお互いの色にどのように影響を与えるかについてです。具体的には、何をしたいかによって異なります。ハードウェアブレンディングは、色の追加や乗算、アルファブレンディングなどの単純なケースを処理するために使用できます。それよりも複雑なものが必要な場合は、マルチパスアルゴリズムまたは(最新のGPUでは)プログラム可能なブレンディングを使用してそれを実行できる可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.