2

glBufferSubData マンページの注記セクションには、次の段落が含まれています。

データ ストアの更新中にレンダリング パイプラインが停止しないように、複数のバッファー オブジェクトを使用することを検討してください。パイプライン内のレンダリングが glBufferSubData によって更新されるバッファ オブジェクト内のデータを参照する場合、特に更新される特定の領域から、そのレンダリングはデータ ストアを更新する前にパイプラインから排出する必要があります。

glUniform * マンページでは、パイプラインについてまったく言及されていません。
ただし、ユニフォームはすべてのシェーダー呼び出しで均一であると想定されているため、ユニフォームはバッファーと同じくらい重要であると考えていました。
したがって、描画呼び出しを実行し、uniform 値を変更してから、同じシェーダーで別の描画呼び出しを実行すると、両方の描画呼び出しが異なる uniform 値で同時に実行されるか、または 2 番目の描画呼び出しがすべての段階 (vert/ geom/frag) は最初の 1 つで完了しますか?

4

1 に答える 1

5

一般的な形での質問は、ほとんど答えられません。ただし、次のことを考慮してください。

GLSL、およびそれ以前の ARB のアセンブリ言語の出現以来、ユニフォーム/パラメーターの状態は常にシェーダー オブジェクトに格納されていました。ユニフォーム ブロックとバッファ オブジェクトが登場して初めて、プログラムからユニフォーム状態を分離することが可能になりました。その時点まで、5年以上、ユニフォームを変更する唯一の方法は、プログラムで変更することでした.

これは、GLSL を使用するほぼすべてのプログラムが、標準的な方法で GLSL を使用することを意味します: プログラムのバインド、ユニフォームの変更、レンダリング、ユニフォームの変更、レンダリングなど。

ここで、何百もの OpenGL プログラムが完全なパイプライン ストールを引き起こしたこの単純で明白なことを行うとしたら、想像してみてください。

ドライバー開発者は愚かではありません。Intel のドライバー開発者でさえ、それほど愚かではありません。ハードウェアがどのようなものであっても、パイプラインの停止を引き起こさずに均一な変更を行う方法を見つけることができます。

于 2012-07-27T20:17:34.360 に答える