我想使用着色器存储块从计算着色器访问 row_major 矩阵 mat2x4 的值,但总是得到错误的结果。获得 mat2、mat3 和 mat4 的正确结果。我的着色器如下。使用 glsl430 版本。
layout(std140, row_major) buffer BufferMat{
mat2 row_mat2;
mat3 row_mat3;
mat4 row_mat4;
mat2x4 row_mat24;
}
void main()
{
row_mat2=mat2(1.0, 2.0, 3.0, 4.0);
row_mat3=mat3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0);
row_mat4=mat4(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0);
row_mat24=mat2x4(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
}
使用 glGetProgramResourceIndex、glShaderStorageBlockBinding 和 glGetProgramResourceiv 获取缓冲区块索引并绑定它。获取 BUFFER_VARIABLE 的索引和值如下。
index=glGetProgramResourceIndex(progId, GL_BUFFER_VARIABLE, "row_mat24");
glGetProgramResourceiv(progId, GL_BUFFER_VARIABLE, index, 3, &prop[1],3* sizeof(GLsizei), &length, params);
fbuffer = (float*)glMapBufferRange(GL_SHADER_STORAGE_BUFFER, params[0], 4, GL_MAP_READ_BIT);
'prop' 的值为 GLenum prop[4]={GL_BUFFER_DATA_SIZE, GL_OFFSET, GL_TYPE, GL_MATRIX_STRIDE}; 获取价值为:
printf("1 type = mat24 Value =%f %f %f %f", *(fbuffer), *(fbuffer+1), *(fbuffer+2), *(fbuffer+3));
printf("2 type = mat24 Value =%f %f %f %f", *(fbuffer+4), *(fbuffer+5), *(fbuffer+6), *(fbuffer+7));
结果 :
1 type = mat24 Value =5.000000 6.000000 7.000000 8.000000
2 type = mat24 Value =1.000000 2.000000 -0.000000 0.000000