1

フラグメントシェーダーを使用して生成された2つのテクスチャがあります。ある色の強度を超えている各テクスチャのテクセルの数を数えることができるようにしたいと思います。

これはどのように行うことができますか?

私の最初の考えは、テクスチャを生成する前に、フラグメントシェーダーを使用してこれらのテクセルをカウントすることです。ただし、これにはある種のグローバルカウンターが必要になります。テクスチャは他のテクスチャから作成されているため、オクルージョンクエリを使用できません。OpenGL2.1を使用しています。

4

3 に答える 3

2

アイデアのおかげで、
私は私が最も効率的だと思う簡単な方法を見つけました。当初、オクルージョンクエリはジオメトリでのみ使用できると思っていましたが、テクスチャでも使用できます。

  1. オクルージョンクエリをオンにする
  2. フラグメントシェーダーとdiscardテクセルを使用して、必要な色の強度より下で画像をレンダリングします
  3. クエリから描画テストに合格したテクセルの数を取得します
于 2010-04-14T10:36:55.633 に答える
0

しきい値を超えるすべてのピクセルを白に設定し、残りを黒に設定するピクセルシェーダーをフレームバッファーでいつでも実行できます。次に、フレームバッファの画像を取得し、白いピクセルの数を数えます...

フレームごとにこれを行う必要はないと思います。もしそうなら、あなたはおそらくあなたの要件を変更する必要があるでしょう...

于 2010-04-13T14:15:01.010 に答える
0

これは、頂点シェーダーとフラグメントシェーダーを使用して行いました。

テクスチャ内の各ピクセルのポイント頂点を宣言し、それらをレンダリングします。

1Dで、必要なバケット数の長さであるオフスクリーンレンダリングテクスチャを宣言します。この1つのバケットを作成することもできますが、各フラグメントが同じピクセルへの書き込みを待機している間は速度が低下します。私は32が通常私にとってかなりうまくいくことを発見しました。

ブレンドモードを加法に設定します。

頂点シェーダーで、バケットの数でgl_VertexIDを変更し、その範囲を-1<->1の間に設定します。

各頂点(実際には各ピクセルに等しい)のテクスチャをサンプリングし、有効なピクセルの場合はgl_Colorを白に設定し、そうでない場合は黒(基本的に1または0)に設定します。

1Dテクスチャでリードバックを実行し、値を合計します。これはピクセル数になります。

私が過去に行った2番目の方法は、入力と同じサイズのオフスクリーンテクスチャに最初のパスを実行し、入力を1または0に分類することです。次に、幅の半分のテクスチャにレンダリングし、高さとサンプルを4回追加して書き込みます。1x1に到達し、値を読み戻すまで、これを繰り返します。

于 2010-04-13T15:20:12.547 に答える