即使使用正确的块名,glGetUniformBlockIndex也会返回-1

时间:2019-01-02 22:17:38

标签: opengl graphics

由于某种原因,我无法在以下着色器(在缓冲区之前正确编译)中获取缓冲区的SHADER STORAGE BUFFER块索引。

根据规范,接口块的名称在这种情况下为'ModelsBlock',并且没有GLSL名称,因此,该块成员位于着色器中的全局范围内。

在两种情况下还使用了models数组,因此应该 进行优化。

在这种情况下,我无法像this问题中那样显式设置绑定点。

着色器

#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 :(得分:1)

您的代码中没有制服块:

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

您刚刚声明了一个包含models数组的SSBOstd140的规则明确定义了该数据的布局,因此完全不清楚您要在此处查询的内容(即使它是UBO)。数组从偏移量0开始,每个数组都是4个列向量,每个向量有4个浮点数,因此每个矩阵64字节,没有其他填充,因此models[i]势必会在偏移量64*i上。