Я хочу получить доступ к значению матрицы row_major mat2x4 из вычислительного шейдера, используя блок хранения шейдера, но всегда получаю неверный результат. Получение правильного результата для мат2, мат3 и мат4. мой шейдер следующим образом. Использование версии gsl430.
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