glGetUniformBlockIndex возвращает -1 даже с правильным именем блока - PullRequest
0 голосов
/ 03 января 2019

По какой-то причине я просто не могу получить индекс блока SHADER STORAGE BUFFER для буфера в следующем шейдере (который правильно скомпилирован перед буфером).

В соответствии со спецификацией имя интерфейсного блока в этом случае равно «ModelsBlock», а имя GLSL отсутствует, поэтому члены блока находятся в глобальной области видимости в шейдере.

Массив моделей также используется в двух случаях, поэтому не следует оптимизировать.

Я не могу явно установить точку привязки в этом случае, как в этом вопросе.

Shader

#version 460 core
uniform mat4 projection;
uniform mat4 camera_view;

in vec3 position;
in vec3 normal;
in vec2 texcoord;

layout(std140) readonly buffer ModelsBlock {
    mat4 models[];
};

in int diffuse_layer_idx;
in int shading_model_id;
in vec3 pbr_scalar_parameters;

out vec3 fNormal;
out vec3 fPosition;
out vec2 fTexcoord;
flat out int fDiffuse_layer_idx;
flat out int fShading_model_id;
flat out vec3 fPbr_scalar_parameters;

void main() {
    gl_Position = projection * camera_view * models[gl_DrawID] * vec4(position, 1.0);

    fNormal = normal;
    fPosition = vec3(models[gl_DrawID] * vec4(position, 1.0));
    #if defined(DIFFUSE_CUBEMAP)
    fPosition = vec3(vec4(position, 1.0));
    #endif
    fTexcoord = texcoord;
    fDiffuse_layer_idx = diffuse_layer_idx;
    fShading_model_id = shading_model_id;
    fPbr_scalar_parameters = pbr_scalar_parameters;
}

Ни одна из этих работ, все они просто возвращают -1.

const int32_t gl_models_block_idx = glGetUniformBlockIndex(program, "ModelsBlock"); 
const int32_t gl_models_block_idx = glGetUniformBlockIndex(program, "models"); 
const int32_t gl_models_block_idx = glGetUniformBlockIndex(program, "models[]"); 
const int32_t gl_models_block_idx = glGetUniformBlockIndex(program, "models[0]"); 

1 Ответ

0 голосов
/ 03 января 2019

В вашем коде нет равномерного блока:

layout(std140) readonly buffer ModelsBlock {
    mat4 models[];
};

Вы только что объявили SSBO , содержащий ваш массив models,Расположение данных для этого четко определено правилами std140, поэтому совершенно непонятно, что вы пытаетесь здесь запросить (даже если это был UBO).Массив начинается со смещения 0, и каждый массив состоит из 4 векторов-столбцов с 4 числами с плавающей запятой в каждом, поэтому 64 байта на матрицу не требуют дополнительного заполнения, так что models[i] должен быть со смещением 64*i.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...