2017-07-30 5 views
-1

したがって、スプライトの特定のピクセルを変更しようとしています。現在、私は自分自身を作成することによって仕事を作ったSetPixel(int x, int y, Color color)機能。これは、テクスチャの情報(RGBA値)を変更し、それをスプライトに渡すことによって機能します。しかし、これは遅いです:フラグメントシェーダ付きOpenGL SetPixel

1)(私が望むところでは)GPUの代わりにCPUを使用して、パフォーマンスを向上させるためにシェーダを使うことができました。

2)1つのピクセルを変更するたびに、修正されたテクスチャを再アップロードする必要があります。

この質問は私にとって大きなものです。特定のピクセルを変更するためにシェーダを使用するにはどうすればよいですか?私は頂点ごとに色を変更することができますが、これは私が望むものではありません。

提案がありますか?

+1

フラグメントシェーダは、単一のピクセルだけでなく、フレームバッファ内のすべてのピクセルを変更します(drawElementsまたはdrawArraysを呼び出す場合)。新しいカラー値がCPUプログラムにある場合は、GPUテクスチャにアップロードするか、フラグメントシェーダの定数変数として設定します。 –

+1

複数のピクセルを一度に変更したくないですか? 1ピクセルをGPUにアップロードすることは、1000000ピクセルをアップロードするのと同じように複雑です。 –

+1

提案:あなたの 'SetPixel'関数を削除し、あなたがそれなしで何をするかを理解してください。 – ybungalobill

答えて

0

まず、すべてのテクスチャをアップロードする必要はなく、すべてのピクセルを更新した後にアップロードする必要があります。変更をキャッシュし、最小の長方形を更新するには、glCopyTextSubImageを使用します。

本当にGPUのアップデートをしたいのであれば、計算シェーダを使用することができます(古いハードウェアではサポートしていないハードウェアもあります)。またはテクスチャデータをSSBOとしてバインドし、別のフレームバッファオブジェクトを使用せずに直接書き込みます。

関連する問題