[OpenGL]GLSL中使用glGetUniformLocation获取位置始终返回-1的一个坑

文章目录[x]
  1. 1:参考

在CPU中如要获取GLSL中变量的Location会使用glGetUniformLocation方式,如

uniform mat4 u_MVP;
glGetUniformLocation(shaderID, "u_MVP");

但是今天发生一件奇怪的事,明明在Shader中定义了

uniform mat4 u_MVP;

而使用 glGetUniformLocation 函数得到的返回值却仍是-1,经过个人猜测可能与变量的未被使用有关,于是带着疑问定向搜索,终于确认了我的猜测。

 

翻译:一个Shader在编译时,只要发现某个uniform变量未被使用,即使这个变量在你写的代码中,也不会将此变量视为激活状态,所以不会为其赋予一个Location。

个人补充一点,未被使用的意思并非单纯的指该变量未在代码中参与运算,除了这种情况外,还包含了该变量参与运算的结果无意义的情况。如下:

uniform mat4 u_Transform;
uniform mat4 u_MVP;

void main()
{
    gl_Position = u_MVP * a_position;
    gl_Position = u_Transform * a_position;
    v_TexCoord = a_TexCoord;
}

上面这种情况,u_MVP也属于未被使用的情况,因为其参与运算的第一个gl_Position 在后序的代码中未参与任何运算,所以这句代码是毫无意义的。

 

参考


参考帖子

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像