Я пытаюсь выяснить, как эффективно очистить буфер хранения шейдеров. ОБП выглядит в моем шейдере:Эффективно очищает буфер хранения шейдеров
struct Type{
vec4 A, B, C;
};
layout (std430, binding = 1) buffer TypeBuffer {
Type items[];
};
Я пишу в этот буфер один раз за кадр, и это нужно, чтобы быть очищено в начале следующего кадра. Спецификация предлагает удобную функцию, чтобы сделать это:
glClearNamedBufferData(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data);
К сожалению, ни internalFormat перечисления не соответствует формату типа. Мне кажется, что эта функция не подходит для очистки произвольных SSBO, хотя она явно предлагает очистить их в спецификациях.
На данный момент я торчащий к этому методу:
//Do this only once!
float* nullData = new float[N * sizeof(float) * 4 * 3];
for(int i = 0; i < N * sizeof(float) * 4 * 3; i++){
nullData[i] = 0.f;
}
glGenBuffers(1, &bufferID);
//Execute this every frame
glBindBuffer(GL_SHADER_STORAGE_BUFFER, bufferID);
glBufferData(GL_SHADER_STORAGE_BUFFER, N * sizeof(float) * 4 * 3, nullData, GL_STATIC_READ);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
Если предположить, что я мог бы использовать glClearNamedBufferData, будет ли даже разница в производительности между этими двумя методами очистки? Есть ли более быстрый способ очистить SSBO каждый кадр по сравнению с моим текущим решением?