为什么添加零会更改顶点着色器的结果

时间:2018-10-04 13:44:37

标签: opengl cygwin glsl sdl vertex-shader

这两个顶点着色器应编译为完全相同的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的另一个问题。

0 个答案:

没有答案