シェーダーとCPUの両方から読み取りと書き込みを行う必要があるintのみの特殊なSSBOがあります。
次のようにSSBOを作成しました:
glGenBuffers(1, &ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
glObjectLabel(GL_BUFFER, ssbo, -1, ("\"SSBO\""));
GLint zero = 0;
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GLint), &zero, GL_STATIC_COPY);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, ssbo);
レンダリングすると、glDbeugMessageは以下を返します。
OpenGL Event Notification:
Source: GL_DEBUG_SOURCE_API
Type: GL_DEBUG_TYPE_PERFORMANCE
ID: Unkown error code: 131186
Severity: GL_DEBUG_SEVERITY_MEDIUM
Message:
Buffer performance warning: Buffer object "SSBO" (bound to
GL_SHADER_STORAGE_BUFFER, and GL_SHADER_STORAGE_BUFFER (3), usage hint is
GL_DYNAMIC_DRAW) is being copied/moved from VIDEO memory to HOST memory.
この警告で最も重要なことは、SSBOにヒントがあるということです:
GL_DYNAMIC_DRAW
ヒントを次のように設定しようとしたにもかかわらず:
GL_STATIC_COPY
だから私の質問は、OpenGL警告を防ぐためにどのヒントを使用する必要があり、どのようにそのヒントが実際に使用されるように強制するのですか?
関連した質問
- 最新のOpenGLIDはどのように機能しますか?
- SDL2でOpenGLテクスチャを表示するにはどうすればよいですか
- 「 'std - : logic_error'のインスタンスをスローした後に呼び出された終了what():basic_string :: _ m_construct null notvalid」例外を修正するにはどうすればよいですか?
- OpenGL独立ローテーション
- ステンシルマスキングを使用して複数のオブジェクトをマスクする方法
- OpenGLテクスチャがほとんど見えない(非常に暗い)
- C ++符号なしバイト配列からのOpenGL2DTexture
- レンダリングループの前にglUniform1f呼び出しを配置すると、均一な値が保存されません
- レンダリングとテスト、ドライバーは重要ですか?
- write_imagefは値を変更しないようです
GL_STATIC_COPY
という意味ではありません。これは、割り当てて書き込みを1回だけ行うことを意味します(静的部分)。また、GPU操作を介してのみ読み取り/書き込みが行われることを意味します。 CPUはデータを直接操作しません(COPY部分)。したがって、間違ったヒントを使用しています。
この種のことを気にする場合は、古いスタイルの
glBufferData
ではなく、不変のバッファー割り当てを使用する必要があります もの。 「ヒント」はバインディングではありません。それが「要件」ではなく「ヒント」である理由です。glBufferStorage
課す要件。具体的には、メモリの使用に要件を課します。バッファーを読み取り用にマップできると宣言しない場合、できない 読み取り用にマップします。glBufferSubData
経由で書き込みできることを宣言しない場合 、 次にあなたできない。今まで。必要な使用要件の最小セットを選択し、それらの制限内で作業します。