我有一个使用延迟渲染设置的程序。我正在删除我的位置纹理,有利于从深度重建位置。我之前没有遇到任何麻烦,但是由于某种原因,我在尝试访问通过制服进入的矩阵时遇到了段错误!
我的片段着色器(顶点着色器不相关):
#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()
函数中。
为什么会导致段错误?我检查了应用程序中的数据,这是正确的。
修改
我用来更新矩阵制服的代码:
// 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 :(得分:0)
问题是我在分配我的光缓冲区时调用了glBindBufferBase
。现在我已经纠正了我传递的论点,一切正常,没有段错误。
现在接下来的问题是:为什么我的所有统一位置都报告为-1
O_o
也许它是默认位置,谁知道。
答案 1 :(得分:0)
glUniformMatrix()
方法期望输入数据是具有列主要顺序(即float array[16];
)的扁平数组,而不是二维数组(即float array[4][4]
)。后者可能会导致段错误或程序故障,因为构成二维数组的4个单维数组不是按顺序排列的。