bugfix> c++ > 投稿

シェーダーと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警告を防ぐためにどのヒントを使用する必要があり、どのようにそのヒントが実際に使用されるように強制するのですか?

回答 1 件
  • I have a peculiar SSBO with only an int, that I need to read and write from both the shaders and the cpu.

    GL_STATIC_COPY  という意味ではありません。これは、割り当てて書き込みを1回だけ行うことを意味します(静的部分)。また、GPU操作を介してのみ読み取り/書き込みが行われることを意味します。 CPUはデータを直接操作しません(COPY部分)。

    したがって、間違ったヒントを使用しています。

    what hint should I use to prevent the OpenGL warning

    この種のことを気にする場合は、古いスタイルの glBufferData ではなく、不変のバッファー割り当てを使用する必要があります  もの。 「ヒント」はバインディングではありません。それが「要件」ではなく「ヒント」である理由です。

    glBufferStorage  課す要件。具体的には、メモリの使用に要件を課します。バッファーを読み取り用にマップできると宣言しない場合、できない 読み取り用にマップします。 glBufferSubData 経由で書き込みできることを宣言しない場合 、 次にあなたできない。今まで。

    必要な使用要件の最小セットを選択し、それらの制限内で作業します。

あなたの答え