首页 > 解决方案 > 为什么加零会改变顶点着色器的结果

问题描述

这两个顶点着色器应该编译成完全相同的 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 的另一个问题如果这种可能不合规行为的趋势确实如此。

标签: openglcygwinglslsdlvertex-shader

解决方案


推荐阅读