glGetUniformLocation和glGetAttribLocation之间的区别

sup*_*per 0 opengl-es

我正在使用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"),但不起作用.

Col*_*mbo 5

根据规范,你不能使用glGetAttribLocation来获得统一的位置:spec(强调我的)

glGetAttribLocation查询由program指定的先前链接的程序对象,用于name指定的属性变量,并返回绑定到该属性变量的通用顶点属性的索引.如果name是矩阵属性变量,则返回矩阵的第一列的索引.如果指定的属性变量不是指定程序对象中的活动属性,或者名称以保留前缀"gl_"开头,则返回值-1.

因此,您发现了正在使用的实现中的错误.它是那些看似无害的阴险错误之一,但实际上使应用程序开发人员更容易编写不可移植的代码.

  • @super:你不明白“这是一个驱动程序错误”的哪一部分?您使用的 OpenGL 版本无关紧要;它是由*驱动程序*引起的。因此,如果您使用的驱动程序恰好暴露了 ES 3.0,那么它很可能具有相同的错误。但它*仍然是一个错误*。停止研究它并正确地做事。 (2认同)