0

我有一个设置了延迟渲染的程序。我正在删除我的位置纹理以支持从深度重建位置。我之前没有遇到任何问题,但现在由于某种原因,我在尝试访问通过制服传入的矩阵时遇到了段错误!

我的片段着色器(顶点着色器无关):

#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
4

2 回答 2

0

问题是我glBindBufferBase在分配我的光缓冲区时调用的。现在我已经纠正了我传递的论点,一切正常,没有段错误。

现在下一个问题是:为什么我所有的统一位置都报告为-1O_o 也许这是默认位置,谁知道呢。

于 2014-05-15T10:36:12.890 回答
0

glUniformMatrix()方法期望输入数据是具有列主要顺序的扁平数组(即float array[16];),而不是二维数组(即float array[4][4])。后者可能会导致您出现段错误或程序故障,因为组成二维数组的 4 个一维数组不是按顺序定位的。

于 2015-09-28T08:41:11.503 回答