0

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

1 回答 1

1

你有什么可能的理由这样做sizeof (params [1])?在大多数系统上,这将始终返回48,具体取决于编译器用于int. sizeof在编译时对类型进行操作,它不在运行时评估表达式。就目前sizeof而言,sizeof (params [1])意思是:“我有一个整数指针,然后我使用数组下标将表达式更改为整数……整数的大小是多少?” 您不妨将其替换为,sizeof (int)因为它的含义相同。结果,您没有映射足够的内存来读取一个或两个以上的浮点值。

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

于 2013-12-31T16:10:45.630 回答