由于某种原因,我无法在以下着色器(在缓冲区之前正确编译)中获取缓冲区的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]");
答案 0 :(得分:1)
您的代码中没有制服块:
layout(std140) readonly buffer ModelsBlock { mat4 models[]; };
您刚刚声明了一个包含models
数组的SSBO。 std140
的规则明确定义了该数据的布局,因此完全不清楚您要在此处查询的内容(即使它是UBO)。数组从偏移量0开始,每个数组都是4个列向量,每个向量有4个浮点数,因此每个矩阵64字节,没有其他填充,因此models[i]
势必会在偏移量64*i
上。