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
}

ご覧のとおり、この segfault の原因となっているコードが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