Opengl es glGetUniformLocation和GLGetAttriblLocation之间的差异

Opengl es glGetUniformLocation和GLGetAttriblLocation之间的差异,opengl-es,Opengl Es,我正在使用OpenGLES2.0。显然,您只需使用glGetAttriblLocation就可以获得任何着色器变量的位置。这意味着您不需要对统一变量使用glGetUniformLocation,但是您不能以相反的方式执行此操作。为什么会这样 编辑: VS: 统一mat4 uMvpMat; 属性vec4 vPos; void main(){ gl_位置=uMvpMat*vPos; } 财政司司长: precision mediump float; 均匀vec4彩色; void main(){ g

我正在使用OpenGLES2.0。显然,您只需使用glGetAttriblLocation就可以获得任何着色器变量的位置。这意味着您不需要对统一变量使用glGetUniformLocation,但是您不能以相反的方式执行此操作。为什么会这样

编辑:

VS:

统一mat4 uMvpMat;
属性vec4 vPos;
void main(){
gl_位置=uMvpMat*vPos;
}
财政司司长:

precision mediump float;
均匀vec4彩色;
void main(){
gl_FragColor=vColor;
}

例如,
glGetUniformLocation(programSolidHandle,“vColor”)
似乎等同于
glGetAttriblLocation(programSolidHandle,“vColor”)
。但是,这不适用于不起作用的
glGetUniformLocation(programSolidHandle,“VPO”)

根据规范,您不能使用glGetAttriblLocation获取统一位置:(强调我的位置)

GLGetAttriblLocation查询先前链接的程序对象 由程序为名称指定的属性变量指定 并返回绑定的通用顶点属性的索引 添加到该属性变量。如果名称是矩阵属性变量, 返回矩阵第一列的索引如果指定的 属性变量不是指定属性中的活动属性 程序对象,或者如果名称以保留前缀“gl_”开头,a 返回值-1。


因此,您在正在使用的实现中发现了一个bug。这是一个看似无害但实际上让应用程序开发人员更容易编写不可移植代码的潜伏性错误。

根据规范,您不能使用glGetAttriblLocation获得统一的位置:(强调我的位置)

GLGetAttriblLocation查询先前链接的程序对象 由程序为名称指定的属性变量指定 并返回绑定的通用顶点属性的索引 添加到该属性变量。如果名称是矩阵属性变量, 返回矩阵第一列的索引如果指定的 属性变量不是指定属性中的活动属性 程序对象,或者如果名称以保留前缀“gl_”开头,a 返回值-1。


因此,您在正在使用的实现中发现了一个bug。这是一个看似无害但实际上让应用程序开发人员更容易编写不可移植代码的潜伏性错误。

这是真的吗?我认为
glGetAttriblLocation
只返回了属性变量的位置,
glGetUniformLocation
只返回了统一变量的位置。@DietrichEpp似乎glGetAttriblLocation可以同时用于这两个变量,但glGetUniformLocation仅适用于统一变量,这只是重复您在问题中所说的。你在哪里看到这个?你有代码吗,或者你在什么地方读过吗?@DietrichEpp我已经在一个普通的着色器上测试过了,我可以把代码放进去here@DietrichEpp这是真的吗?我认为
glGetAttriblLocation
只返回了属性变量的位置,
glGetUniformLocation
只返回了统一变量的位置。@DietrichEpp似乎glGetAttriblLocation可以同时用于这两个变量,但glGetUniformLocation仅适用于统一变量,这只是重复您在问题中所说的。你在哪里看到这个?你有代码吗,或者你在什么地方读过吗?@DietrichEpp我已经在一个普通的着色器上测试过了,我可以把代码放进去here@DietrichEpp edited@super:您不明白“这是一个驱动程序错误”的哪一部分?您使用的OpenGL版本与此无关;这是司机造成的。因此,如果您使用的驱动程序与公开ES3.0的驱动程序相同,则很可能存在相同的错误。但它仍然是一个bug。停止调查,正确地做事。@super:你不明白“这是一个驱动程序错误”的哪一部分?您使用的OpenGL版本与此无关;这是司机造成的。因此,如果您使用的驱动程序与公开ES3.0的驱动程序相同,则很可能存在相同的错误。但它仍然是一个bug。停止调查,正确地做事。