Не может связать равномерный буфер с использованием бинарного шейдераC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Не может связать равномерный буфер с использованием бинарного шейдера

Сообщение Anonymous »

Я собираю исходный код GLSL на лету, используя Shaderc. Я знаю, что это работает, потому что я не получаю никаких ошибок OpenGL, а сетка правильно отображается на экране. Однако, когда я хотел загрузить некоторую дополнительную информацию с помощью унифицированных буферов, она не сработала. < /P>
код шейдера (вершина-шейдер еще проще, довольно стандартный материал): < /p>

Код: Выделить всё

#version 450 core

layout (location = 0) out vec4 out_colour;

layout (binding = 0, std140) uniform Colours
{
vec3 Colour;
};

void main()
{
out_colour = vec4(Colour, 1.0);
}
< /code>
Код, ответственный за компиляцию: < /p>
shaderc::Compiler compiler;
shaderc::CompileOptions compileOptions;
compileOptions.SetTargetEnvironment(shaderc_target_env_opengl, shaderc_env_version_opengl_4_5);
compileOptions.SetGenerateDebugInfo();
compileOptions.SetOptimizationLevel(shaderc_optimization_level_performance);
compileOptions.SetAutoBindUniforms(true);

uint32_t programId = glCreateProgram();

// m_Sources: std::unordered_map
for (const auto& [stage, source] : m_Sources)
{
const shaderc::CompilationResult result = compiler.CompileGlslToSpv(source, ShaderUtils::ShaderStageToShaderC(stage), m_Name.data(), compileOptions);
assert(result.GetCompilationStatus() == shaderc_compilation_status_success, "Failed to compile shader!");
auto binary = std::vector(result.begin(), result.end());

uint32_t shader = glCreateShader(ShaderUtils::ShaderStageToOpenGL(stage));
glShaderBinary(1, &shader, GL_SHADER_BINARY_FORMAT_SPIR_V, binary.data(), (uint32_t)binary.size() * sizeof(uint32_t));
glSpecializeShader(shader, "main", 0, nullptr, nullptr);
glAttachShader(programId, shader);
}

glLinkProgram(programId);
glValidateProgram(programId);
< /code>
После всего этого я использую Spirv-Cross, чтобы получить данные отражения (имя, привязка, размер и т. Д.). Код для UBO: < /p>
glm::vec3 colour = { 0.2f, 1.0f, 0.3f };
uint32_t ubo;
glCreateBuffers(1, &ubo);
glNamedBufferData(ubo, sizeof(glm::vec3), nullptr, GL_DYNAMIC_DRAW);
glNamedBufferSubData(ubo, 0, sizeof(glm::vec3), glm::value_ptr(colour));

uint32_t bindingPoint = 0; // Actually this comes from the reflection
glBindBuffer(GL_UNIFORM_BUFFER, ubo);
glBindBufferBase(GL_UNIFORM_BUFFER, bindingPoint, ubo);
< /code>
Все это не работает. Прямоугольник, который я хочу сделать, не зеленый, а черный. Как ни странно, когда я использую glshadersource 
и glcompileshader все работает нормально. У меня совершенно нет идей.


Подробнее здесь: https://stackoverflow.com/questions/796 ... der-binary
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»