あなたができることはいくつかありますが、それらからどれだけの利益を得ることができるかは状況によって異なります。
まず、ピクセルのアップロード形式がドライバーのニーズに合っていることを確認します。あなたはそれをで処理しているようです。これはおそらく画像フォーマットGL_BGRA, GL_UNSIGNED_BYTE
に対してドライバーが好むフォーマットです。GL_RGBA8
ただし、OpenGL 4.3またはARB_internalformat_query2を実装するドライバにアクセスできる場合は、実行時に優先アップロード形式を実際に検出できます。このように:
GLint pixelFormat, pixelType;
glGetInternalFormativ(GL_TEXTURE_2D, GL_RGBA8, GL_TEXTURE_IMAGE_FORMAT, 1, &pixelFormat);
glGetInternalFormativ(GL_TEXTURE_2D, GL_RGBA8, GL_TEXTURE_IMAGE_TYPE, 1, &pixelType);
もちろん、これは、上記のフォーマット/タイプのペアでデータを生成するために、データ生成方法を変更できる必要があることを意味します。
ドライバーをなだめるための手順を実行したら、次の可能性は、バッファーオブジェクトを使用してピクセル転送データを保存することです。これはおそらく全体的なパフォーマンスには役立ちませんが、CPUの負担を減らすことができます。
ただし、これを最大限に活用するには、ピクセルデータをマッピングしてバッファオブジェクトのメモリに「直接」生成できる必要があります。これを行うことができれば、おそらくアップロードのCPUコストの一部を取り戻すことができます。そうでなければ、それは価値がないかもしれません。
これを行う場合は、適切なバッファオブジェクトストリーミング手法を使用する必要があります。
テクスチャをダブルバッファリングすることも役立つ場合があります。つまり、あるテクスチャオブジェクトからレンダリングしているときに、別のテクスチャオブジェクトにアップロードしているということです。これにより、前のレンダリングが完了するのを待つGPUストールが防止されます。これがどれだけ役立つかは、レンダリング方法によって異なります。
アプリケーションの特定の状況について詳しく知らなければ、言えることはあまりありません。