首页 > 解决方案 > 为什么 GLSL 警告告诉我没有写入变化,而它显然是?

问题描述

将变量从顶点着色器传递到片段着色器时,我从来没有遇到过任何问题。但是今天,我在vs中添加了一个新的“out”变量,并在fs中添加了一个对应的“in”变量。GLSL 说明如下:

着色器程序:片段着色器使用不同的 tbn,但之前的着色器不会写入它。

只是为了确认,这里是VS的相关部分:

#version 330 core

layout(location = 0) in vec4 position;
layout(location = 1) in vec2 uv;

// plus other layout & uniform inputs here

out DATA
{
    vec2 uv;
    vec3 tangentViewDir;
    mat3 tbn;
} vs_out;

void main()
{
    vs_out.uv       = uv;
    vs_out.tangentViewDir = vec3(1.0);
    vs_out.tbn = mat3(1.0);

    gl_Position     = sys_ProjectionViewMatrix * sys_ModelMatrix * position;
}

FS中,它被声明为:

in DATA
{
    vec2 uv;
    vec3 tangentViewDir;
    mat3 tbn;
} fs_in;

有趣的是,所有其他变体,如“uv”和所有,都有效。它们的声明方式相同。

也很有趣:即使 GLSL 说变量没有被写入——当我写入它时它仍然会识别出这些变化,并显示这些变化。

那么这只是一个错误的警告或错误吗?即使它告诉我不是这样,该值似乎也被正确传递了。为什么我会收到此警告?

标签: glslshadervarying

解决方案


HolvBlackCat 为我指明了正确的方向——这确实是着色器不匹配!

我有 2 个着色器程序,两者中的 FS 相同,但 VS 不同,我忘记更新第二个 VS 的输出以匹配第一个 VS 的输出布局,以便它们都使用相同的 FS!

哎呀,我想现在我遇到了这个错误,吸取了教训。

谢谢你HolvBlackCat!


推荐阅读