Как правильно настроить подсказку SSBO для чтения и записи из шейдеров и процессора? - PullRequest
0 голосов
/ 25 мая 2018

У меня есть своеобразный SSBO только с int, который мне нужно читать и писать как из шейдеров, так и из процессора.

Я создал указанный 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 Ответ

0 голосов
/ 25 мая 2018

У меня есть своеобразный SSBO только с int, который мне нужно читать и писать как из шейдеров, так и из процессора.

GL_STATIC_COPY не означает это.Это означает, что вы собираетесь выделить его и записать в него только один раз (часть STATIC).И это означает, что он будет считываться / записываться только через операции с графическим процессором;ЦП никогда не будет манипулировать данными напрямую (часть COPY).

Таким образом, вы используете неправильную подсказку.

какую подсказку следует использовать, чтобы предотвратить предупреждение OpenGL

Если вам небезразличны такие вещи, то вам нужно использовать неизменяемое выделение буфера , а не устаревшие glBufferData.«Подсказки» не являются привязками;вот почему они являются «подсказками», а не «требованиями».

glBufferStorage навязывает требования .В частности, это накладывает требования на использование вами памяти.Если вы не объявите, что буфер может быть отображен для чтения, то вы не сможете отобразить его для чтения.Если вы не заявите, что можете писать через glBufferSubData, то вы не сможете .Всегда.

Выберите минимальный набор требований к использованию, который вам нужен, и работайте в рамках этих ограничений.

...