Я пытаюсь выяснить, как SSBO работает с очень простым примером. Вершинные шейдеры:Trivial OpenGL Shader Storage Buffer Object (SSBO) не работает
#version 430
layout(location = 0) in vec2 Vertex;
void main() {
gl_Position = vec4(Vertex, 0.0, 1.0);
}
И пиксельный шейдер:
#version 430
layout(std430, binding = 2) buffer ColorSSBO {
vec3 color;
};
void main() {
gl_FragColor = vec4(color, 1.0);
}
Я знаю, что они работают, потому что, если я заменю vec4(color, 1.0)
с vec4(1.0, 1.0, 1.0, 1.0)
я вижу белый треугольник в центре экрана.
Я инициализировать и связать SSBO со следующим кодом:
GLuint ssbo;
glGenBuffers(1, &ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
float color[] = {1.f, 1.f, 1.f};
glBufferData(GL_SHADER_STORAGE_BUFFER, 3*sizeof(float), color, GL_DYNAMIC_COPY);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
Что здесь не так?
Ваши флаги использования кажутся мне немного странными, хотя я никогда в них не верил. Вы сказали GL, что этот буфер будет заполнен данными, которые вы копируете из какого-то другого буфера, но ... при распределении буфера вы заполняете его данными из самого клиента. Я давно считал эти намеки плацебо, но вы никогда не знаете - это может быть первый в мире водитель, который буквально принимает эти намеки? :) Пробовали ли вы более логичный подсказку «GL_DYNAMIC_DRAW»? –
Если вы попытаетесь расширить этот SSBO в массив, вы столкнетесь с проблемой выравнивания. Вам нужно будет изменить 'color' на' vec4' или поместить 'float' сразу после него. Я уверен, что вы это знаете. –
Идея состоит в том, чтобы использовать этот буфер для реализации независимой прозрачности порядка с независимым списком, поэтому он будет записан, а затем прочитан только с помощью флеш-шейдеров, но тем временем я тестирую его с данными хоста. Я попробовал оба ваших предложения, но то, что я вижу, по-прежнему является черным экраном :(Очень расстраивает. – Shepard