Единый доступ GLSL, вызывающий сбой в программе

У меня есть программа с отложенным рендерингом. Я нахожусь в процессе удаления моей текстуры позиции в пользу восстановления позиций из глубины. Я делал это раньше без проблем, но теперь по какой-то причине у меня возникает ошибка при попытке получить доступ к матрицам, которые я передаю через униформу!

Мой фрагментный шейдер (вершинный шейдер не имеет значения):

#version 430 core

layout(location = 0) uniform sampler2D depth;
layout(location = 1) uniform sampler2D diffuse;
layout(location = 2) uniform sampler2D normal;
layout(location = 3) uniform sampler2D specular;

layout(location = 4) uniform mat4 view_mat;
layout(location = 5) uniform mat4 inv_view_proj_mat;

layout(std140) uniform light_data{
// position ect, works fine
} light;

in vec2 uv_f;

vec3 recontruct_pos(){
float z = texture(depth, uv_f);
vec4 pos = vec4(uv_f * 2.0 - 1.0, z * 2.0 - 1.0, 1.0);

//pos = inv_view_proj_mat * pos; //un-commenting this line causes segfault

return pos.xyz / pos.w;
}

layout(location = 3) out vec4 lit; // location 3 is lighting texture

void main(){
vec3 pos = reconstruct_pos();
lit = vec4(0.0, 1.0, 1.0, 1.0); // just fill screen with light blue
}

И, как вы можете видеть, код, вызывающий эту ошибку, показан в reconstruct_pos() функция.

Почему это вызывает segfault? Я проверил данные в приложении, это правильно.


РЕДАКТИРОВАТЬ:

Код, который я использую для обновления моей матричной формы:

// bind program

glUniformMatrix4fv(4, 1, GL_FALSE, &view_mat[0][0]);
glUniformMatrix4fv(5, 1, GL_FALSE, &inv_view_proj_mat[0][0]);

// do draw calls

0

Решение

Проблема была в моем звонке glBindBufferBase при выделении моего светового буфера. Теперь, когда я исправил аргументы, которые я передаю, все работает нормально, без ошибок.

Теперь следующий вопрос: почему все мои унифицированные локации сообщают -1 O_o
Может быть, это местоположение по умолчанию, кто знает.

0

Другие решения

glUniformMatrix() метод ожидает, что входные данные будут уплощенным массивом с главным порядком столбца (т.е. float array[16];), а не двумерный массив (т.е. float array[4][4]). Последнее может привести к ошибке segfault или программы из-за того, что 4 одномерных массива, составляющих 2-мерный массив, не расположены последовательно.

0

По вопросам рекламы [email protected]