Opengl glAttachShader的参数顺序错误,但位置绘制正确

Opengl glAttachShader的参数顺序错误,但位置绘制正确,opengl,Opengl,我有2个着色器:顶点着色器和片段着色器 顶点着色器: layout (location = 0) in vec3 position; void main() { gl_Position = vec4(position.x, position.y, position.z, 1.0); } 片段着色器: out vec4 color; void main() { color = vec4(1.0f, 0.5f, 0.2f, 1.0f); } 当我使用glAttachShader时

我有2个着色器:顶点着色器和片段着色器

顶点着色器:

layout (location = 0) in vec3 position;
void main()
{
   gl_Position = vec4(position.x, position.y, position.z, 1.0);
}
片段着色器:

out vec4 color;

void main()
{
   color = vec4(1.0f, 0.5f, 0.2f, 1.0f);
} 
当我使用glAttachShader时,我按顺序(着色器、程序)传入了参数,不知怎么地,顶点绘制正确,但颜色错误


只是想知道为什么即使我以错误的顺序传递参数,位置也是正确的?谢谢

您可能有一个兼容性配置文件上下文。如果是这种情况,则根本不使用着色器程序,而是使用固定管道进行渲染。这解释了渲染的颜色错误

如果使用
glGetError()
,您会注意到
glAttachShader()
生成了一个错误,以及后续与程序相关的调用,如
glLinkProgram()
glUseProgram()
。由于
glUseProgram()
失败,您仍在使用固定管道

对于核心概要文件上下文,我不希望看到任何渲染,因为需要一个有效的程序。尽管结果取决于实施情况。没有程序的渲染不是错误。堆芯外形规格说明(增加强调):

如果某个阶段的当前程序包含该阶段的可执行代码,则认为该阶段的当前程序处于活动状态;否则,该阶段不认为任何程序处于活动状态。如果顶点或片段着色器阶段没有活动程序,则顶点和/或片段处理的结果将被取消定义


我猜着色器程序句柄和顶点着色器句柄具有相同的值。特别是如果这个程序是第一个创建的,很可能会发生这种情况。也许ID是相同的?您可以打印它们的
int
值并进行比较。ID为1,2,3,都不同。