问题描述
我有以下片段和顶点着色器。
顶点:
#version 450
layout(location = 0) in vec2 Position;
layout(location = 1) in vec4 Color;
layout(location = 0) out vec2 fPosition;
void main()
{
gl_Position = vec4(Position,1);
fPosition = Position;
}
片段:
#version 450
layout(location = 0) in vec2 fPosition;
layout(location = 0) out vec4 fColor;
void main() {
vec4 colors[4] = vec4[](
vec4(1.0,0.0,1.0),vec4(0.0,1.0,1.0)
);
fColor = vec4(1.0);
for(int row = 0; row < 2; row++) {
for(int col = 0; col < 2; coL++) {
float dist = distance(fPosition,vec2(-0.50 + col,0.50 - row));
float delta = fwidth(dist);
float alpha = smoothstep(0.45-delta,0.45,dist);
fColor = mix(colors[row*2+col],fColor,alpha);
}
}
}
但是在编译时出现以下错误:
无法从'gl_Position 4-component vector of float Position' 转换为'layout( location=0) 平滑highp 2-component vector of float'
我不知道如何修复它。 (这是我第一次做着色器编程)。
如果需要更多信息,请告诉我。
解决方法
1.
在顶点着色器和片段着色器之间传输变量时不需要指定布局。移除顶点和片段着色器中 layout(location = 0)
变量的 fPosition
参数。
2.
如果您通过缓冲区将变量(您的位置缓冲区)传递给顶点着色器,则只需指定 layout
。此外,位置、法线和纹理坐标等变量必须始终先通过顶点着色器,然后再通过片段着色器。
3.
从片段着色器导出最终颜色(在您的情况下为 fColor
)时,您不需要传递位置,只需将 vector4 变量指定为 out vec4 fColor
; openGL 会自动检测它。
4.
您实际遇到的错误是告诉您您正在将 vector4 变量 (fColor
) 分配给已存储的 vec2 变量 (fPosition
)。注意:在属性(位置)“0”处的顶点着色器中,您访问了已加载的顶点,但稍后您尝试将 vector4 分配到片段着色器中的相同位置。 OpenGL 不会像这样自动覆盖数据。