如何使用着色器存储块访问着色器中row_major矩阵的值?

时间:2013-12-31 13:38:31

标签: opengl opengl-es glsl glsles

我想使用着色器存储块从计算着色器访问row_major matrix 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);

'丙'有价值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

1 个答案:

答案 0 :(得分:1)

你有什么理由做sizeof (params [1])?在大多数系统上,这将始终返回 4 8 ,具体取决于编译器用于int的大小。 sizeof在编译时对类型进行操作,它不会在运行时计算表达式。所以就sizeof而言,sizeof (params [1])意味着:“我有一个整数指针,然后我使用数组下标将表达式更改为整数... ...的大小是多少一个整数?“你也可以用sizeof (int)替换它,因为它意味着同样的事情。您没有映射足够的内存来读取多于一个或两个浮点值。

更重要的是,由于您覆盖了存储由映射地址提前分配了一行的内存的指针,因此您还会创建不可恢复的内存泄漏。