这两个顶点着色器应编译为完全相同的GPU组件,但只有一个显示结果。
第一个顶点着色器按预期显示所有内容:
#version 120
attribute vec3 aPos;
uniform float i;
void main() {
gl_FrontColor=gl_Color;
gl_Position = mat4x4(cos(radians(i)),0.,0.,0., 0.,1.+i*0.,0.,0., 0.,0.,1.,0., 0.,0.,0.,1.)*vec4(aPos.x,aPos.y,aPos.z,1.);
}
第二个顶点着色器什么也不显示:
#version 120
attribute vec3 aPos;
uniform float i;
void main() {
gl_FrontColor=gl_Color;
gl_Position = mat4x4(cos(radians(i)),0.,0.,0., 0.,1.,0.,0., 0.,0.,1.,0., 0.,0.,0.,1.)*vec4(aPos.x,aPos.y,aPos.z,1.);
}
两个着色器状态的日志信息
Vertex shader was successfully compiled to run on hardware.
Vertex shader(s) linked, no fragment shader(s) defined.
两个着色器之间的唯一区别是,第一个着色器具有1.+i*0.
,而第二个着色器具有更简单的1.
。
那为什么要添加i*0.
来修复着色器并使其按预期工作?
此行为是否由GLSL规范定义?
注意:我希望这无关紧要。我使用的是Cygwin,因此链接的DLL是cygGL-1.dll
,而与此DLL链接不足以使程序运行,因此我不得不诉诸使用SDL_GL_GetProcAddress()
来使函数正常运行,因此如果确实存在这种可能不一致行为的趋势,这可能是Cygwin DLL的另一个问题。