GLSL统一访问导致程序故障
GLSL uniform access causing sefault in program
我有一个程序设置延迟渲染。我正在删除我的位置纹理,以便从深度重建位置。我之前已经这样做了,没有麻烦,但现在由于某种原因,当我试图访问我通过制服传递的矩阵时,我得到了一个段错误!
我的片段着色器(顶点着色器无关):
#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
问题是我在分配光缓冲区时调用glBindBufferBase
。现在我已经纠正了我传递的参数,一切都很好,没有分段错误。
现在下一个问题是:为什么我所有的统一位置报告为-1
O_o也许这是默认位置,谁知道呢
glUniformMatrix()
方法期望输入的数据是一个列主序的扁平数组(即float array[16];
),而不是一个二维数组(即float array[4][4]
)。后者可能导致段错误或程序故障,因为组成二维数组的4个单维数组没有按顺序定位。
相关文章:
- Geeksforgeeks C 程序故障排除:IEE 754 表示法为十进制
- 对程序故障进行分段
- 多线程程序中的分段故障和gdb回溯上的不完整信息
- 程序接收了信号sigsegv,在代码块中调试时的细分故障
- lambda回调中Android Cocos2D-X应用程序上的SEG故障
- G :内部编译器错误:分割故障(程序CC1PLUS) - 我在哪里开始
- 当使用e时没有空格时,奇怪的程序故障
- 程序将拒绝进度的奇怪故障(刽子手分配)
- 二进制搜索树操作程序错误:分割故障(核心倾倒)
- 复制CORBA ::任何包含字符串的corba程序SEG故障
- 程序执行因细分故障而停止:11
- GDB执行时,Apache IGNITE C 客户端应用程序具有许多细分故障
- 程序收到信号sigsegv,分段故障.在al_draw_tinted_bitmap中(bitmap = 0x0,tint
- PRNG程序故障.无法输入随机数量的选择,并且将始终从PRNG中回答2
- 将程序的故障与模板Main联系起来
- 从任务管理器获取应用程序故障转储中显示的状态在 Windows 上是否准确
- 矢量初始化期间出现未知应用程序故障
- c++程序故障
- GLSL统一访问导致程序故障
- 定时C++程序故障