将顶点位置从顶点传递到片段着色器 - 仅在使用 Nsight 调试时有效

Passing vertex position from vertex to fragment shader - only works when debugging with Nsight

我正在尝试将顶点位置作为简单的 out vec3 pos 从顶点着色器传递到片段着色器,以便根据顶点的位置对顶点进行着色。这是我的顶点着色器代码:

#version 330 core

in vec3 position;
out vec3 pos;

uniform mat4 u_model;


void main(){
    pos = position;
    gl_Position = u_model * vec4(position, 1.0f);
}

片段着色器:

#version 330 core

out vec4 color;
in vec4 pos;

void main(){

    color = vec4(pos.x, 0.0f, 0.0f, 1.0f);
}

现在这只适用于我在 Visual Studio 2019 年 运行 使用 Nsight 图形调试器的程序。

当我正常执行(x64,调试)时,它似乎退回到默认着色器,它将所有内容渲染为白色。上面发布的顶点和片段着色器停止工作。

顶点着色器输出的类型必须与下一着色器阶段(在本例中为片段着色器)中相应输入的类型完全匹配。
参见 interface matching rules between shader stages.

在您的例子中,顶点着色器输出的类型是 vec3:

out vec3 pos;

但是片段着色器输入的类型是vec4:

in vec4 pos;

将片段着色器输入的类型更改为vec3,以解决问题。


我不知道为什么这段代码在 Visual Studio 2019 中与 Nsight 图形调试器一起工作。错误是它不应该这样做。