ES3.0 中 Vertex Shader 的out变量未赋值,导致 glLinkProgram 失败

GLSL中,定义了但是 没有使用的变量会被优化掉,在之前就遇到过。

(GLSL 中 ,如果定义的 变量 没有在代码中使用到,那么不会被编译,用 glget* 是获取不到的,返回 -1 。算是被优化掉了。

http://blog.csdn.net/huutu/article/details/50322905 )

而且如果 Vertexshader 中的定义的 Out 变量未使用,被优化掉后,会引起 FragmentShader 的问题,导致 glLinkProgram  失败!

群里朋友 学习 ES3.0的时候 碰到一个问题:

编译下面的Shader 并没有出错,但是使用

[cpp] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. glGetUniformLocation(program, “s_texture”);

去获取 的时候,却返回了 -1 。转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

Vertex Shader:

[cpp] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. #version 300 es
  2. precision mediump float;
  3. in vec3 inPos;
  4. in vec2 vTexCoord;
  5. out vec3 Color;
  6. out vec2 texCoord;
  7. uniform mat4 myMat;
  8. void main() {
  9.     gl_Position = vec4(inPos, 1.0) * myMat;
  10.     Color = inPos;
  11. }

Fragment Shader:

[cpp] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. #version 300 es
  2. precision mediump float;
  3. in vec3 Color;
  4. in vec2 texCoord;
  5. out vec4 fragmentColor;
  6. uniform sampler2D s_texture;
  7. void main() {
  8.     fragmentColor = texture(s_texture, texCoord);
  9. }

我的第一反应是:

s_texture 没有使用,被优化掉了。

然而并没有,让朋友把工程传过来看了一段时间才发现

在Vertex Shader 中的 out vec2 texCoord; 没有赋值!!

所以 texCoord 是被优化掉了的。

但是 在 FragmentShader 中的 in vec2 texCoord 是存在的变量,所以呢 glCompileShader 操作的时候是不会报错的!

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

难道 OpenGL 没有处理这个问题?当然不是。

这个错误是在 glLinkProgram 阶段抛出的。 朋友没有去获取 glLinkProgram 的状态,所以没有发现这个错误。

抛出了很详细的错误

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. WARNING: Output of vertex shader ‘Color’ not read by fragment shader
  2. ERROR: Input of fragment shader ‘texCoord’ not written by vertex shader
  3. (lldb)