我正在使用OpenGL ES 2.0。显然,您可以使用glGetAttribLocation获取任何着色器变量的位置。这意味着您不需要将glGetUniformLocation用于统一变量,但是您不能以相反的方式执行此操作。这是为什么?
编辑:
VS: 制服mat4 uMvpMat; 属性vec4 vPos; void main(){ gl_Position = uMvpMat * vPos; }
FS: 精密介质浮子; 均匀的vec4 vColor; void main(){ gl_FragColor = vColor; }
例如,glGetUniformLocation(programSolidHandle, "vColor")
似乎等同于glGetAttribLocation(programSolidHandle, "vColor")
。但是,这并不适用于glGetUniformLocation(programSolidHandle, "vPos")
,但这并不起作用。
答案 0 :(得分:5)
根据规范,你不能使用glGetAttribLocation来获得统一的位置:spec(强调我的)
glGetAttribLocation查询以前链接的程序对象 由程序指定的name指定的属性变量 并返回绑定的通用顶点属性的索引 到那个属性变量。如果name是矩阵属性变量, 返回矩阵的第一列的索引。 如果命名 属性变量不是指定的活动属性 程序对象或名称以保留前缀" gl _", a开头 值为-1。
因此,您发现了正在使用的实现中的错误。它是那些看似无害的阴险错误之一,但实际上使应用程序开发人员更容易编写不可移植的代码。