Как получить доступ к значениям матрицы row_major в шейдерах, используя блоки хранения шейдеров?

Я хочу получить доступ к значению матрицы 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

person user1896853    schedule 31.12.2013    source источник


Ответы (1)


По какой возможной причине вы делаете sizeof (params [1])? Это всегда будет возвращать 4 или 8 на большинстве систем в зависимости от размера, который компилятор использует для int. sizeof работает с типами во время компиляции, а не вычисляет выражения во время выполнения. Итак, что касается sizeof, sizeof (params [1]) означает: "У меня был целочисленный указатель, затем я использовал индекс массива, чтобы преобразовать выражение в целое число... каков размер целого числа?" Вы также можете заменить это на sizeof (int), потому что это означает то же самое. В результате вы выделяете недостаточно памяти для чтения более одного или двух значений с плавающей запятой.

Более того, поскольку вы перезаписываете указатель, в котором хранится память, которую вы выделили одной строкой ранее, сопоставленным адресом, вы также создаете неустранимую утечку памяти.

person Andon M. Coleman    schedule 31.12.2013
comment
Да, ты прав. Но даже после удаления malloc и выделения достаточного количества памяти 8 * 4. Это дает одно и то же значение. Есть ли какой-то конкретный способ прочитать значения матрицы строк? - person user1896853; 02.01.2014