これは、頂点シェーダーとフラグメントシェーダーを使用して行いました。
テクスチャ内の各ピクセルのポイント頂点を宣言し、それらをレンダリングします。
1Dで、必要なバケット数の長さであるオフスクリーンレンダリングテクスチャを宣言します。この1つのバケットを作成することもできますが、各フラグメントが同じピクセルへの書き込みを待機している間は速度が低下します。私は32が通常私にとってかなりうまくいくことを発見しました。
ブレンドモードを加法に設定します。
頂点シェーダーで、バケットの数でgl_VertexIDを変更し、その範囲を-1<->1の間に設定します。
各頂点(実際には各ピクセルに等しい)のテクスチャをサンプリングし、有効なピクセルの場合はgl_Colorを白に設定し、そうでない場合は黒(基本的に1または0)に設定します。
1Dテクスチャでリードバックを実行し、値を合計します。これはピクセル数になります。
私が過去に行った2番目の方法は、入力と同じサイズのオフスクリーンテクスチャに最初のパスを実行し、入力を1または0に分類することです。次に、幅の半分のテクスチャにレンダリングし、高さとサンプルを4回追加して書き込みます。1x1に到達し、値を読み戻すまで、これを繰り返します。