【问题标题】:Why does GLSL Warning tell me varying isn't written to, when it clearly is?为什么 GLSL 警告告诉我没有写入变化,而它显然是?
【发布时间】:2018-09-08 20:46:11
【问题描述】:

将变量从顶点着色器传递到片段着色器时,我从来没有遇到过任何问题。但是今天,我在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 说变量没有被写入 - 当我写入它时它仍然会识别出这些变化,并显示这些变化。

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

【问题讨论】:

  • 你能给我们一个minimal reproducible example吗?
  • 大家好,感谢您的回复,我已将带有相关信息的简化版本添加到操作中。着色器日志没有抱怨 vs_out.uv,只有“out DATA”中的其他两个变量
  • 如果您创建了一个实际的 MCVE(请参阅上面的链接)会有所帮助,这样我们就可以排除例如不小心附加了不正确的顶点着色器。
  • 你指出了我正确的方向,发现错误 - 这确实是着色器不匹配!发布答案以供参考,如果将来有人遇到类似问题。谢谢!

标签: glsl shader varying


【解决方案1】:

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

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

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

谢谢 HolvBlackCat!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2010-12-07
    相关资源
    最近更新 更多