在Vulkan中,顶点着色器中顶点的输出颜色与我在片段着色器中获得的颜色不同

问题描述:

在Vulkan中,我编写了一个简单的程序,用简单的顶点着色器和折痕着色器绘制固定颜色的线条。但是,输入片段着色器的颜色与顶点中设置的颜色不同。我使用RenderDoc进行了检查,并且传递给顶点着色器的颜色对于线的两个顶点都是正确的(1,1,1,1),并且也检查了它的输出,它也是相同的。但在片段着色器中,我得到的颜色是(1,1,0,1)。不明白为什么会发生这种情况。不管顶点着色器发出什么颜色,片段着色器中的输入始终为黄色。在Vulkan中,顶点着色器中顶点的输出颜色与我在片段着色器中获得的颜色不同

顶点着色器:

layout(location = 0) in vec4 position; 
layout(location = 1) in vec4 color; 
layout(location = 2) in vec2 texcoord; 
out vec4 io_color; 
out vec2 io_uv; 
out vec4 io_position2; 

layout(std140, binding = 0) uniform UniformBlock_uTransform 
{ 
    mat4 uTransform; 
}; 

layout(std140, binding = 1) uniform UniformBlock_uTransform2 
{ 
    mat4 uTransform2; 
}; 

void main() 
{ 
    io_uv  = texcoord; 
    io_color  = vec4(1,1,1,1); //Just to debug it 

    gl_Position = uTransform * position; 

    io_position2 = uTransform2 * position; 
} 

// Fragement:

in vec4 io_color; 

layout(location = 0) out vec4 result; 

void main() 
{ 
    result = io_color; 
} 
+0

请显示相关代码。 – BDL

+0

添加了着色器代码 – user2065833

+0

我认为接口必须完全匹配**。尝试将'io_uv'和'io_position2'作为'in'变量添加。 – krOoze

尝试增加输出和输入的布局预选赛你从一个着色器传递到其他的值,以确保它们实际上指向相同的位置:

VS:

layout (location = 0) out vec4 io_color; 

FS:

layout (location = 0) in vec4 io_color; 

我建议总是使用语法来连接着色室外及投入。

+0

虽然接口名称匹配在GLSL中是有效的。但是我想'glslangValidator'没有办法知道如何匹配接口,如果着色器是单独编译的话。 – krOoze

检查蓝色通道是否禁用颜色写入掩码。