Ios glUniform1f与glUniform1i混淆

Ios glUniform1f与glUniform1i混淆,ios,opengl-es,Ios,Opengl Es,我正在iOS上的OpenGLES2项目中学习OpenGLES2。我在网上找到了一个Objective-C实现,用于链接和编译着色器,并将此实现用作我自己的模板。不幸的是,我错误地输入了将纹理数据上传为glUniform1f而不是glUniform1i的行。看起来像这样 glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, self.texture); glUniform1f(_texUnifor

我正在iOS上的OpenGLES2项目中学习OpenGLES2。我在网上找到了一个Objective-C实现,用于链接和编译着色器,并将此实现用作我自己的模板。不幸的是,我错误地输入了将纹理数据上传为glUniform1f而不是glUniform1i的行。看起来像这样

glActiveTexture(GL_TEXTURE1);                   
glBindTexture(GL_TEXTURE_2D, self.texture);
glUniform1f(_texUniform, 1);     // this line should be glUniform1i
我的项目有多个具有自己纹理的对象。此输入错误导致所有对象上仅显示最后绘制的对象的纹理。我怀疑我的纹理ID或类似的东西出了问题,所以在每次绘制调用时都注销了纹理ID等,这样就找不到任何错误

这对我来说是一个很难找到的bug,我想了解这个bug到底是怎么回事。我的问题是glUniform1f和glUniform1i之间的什么会导致这种行为?我有点惊讶,着色器不仅没有链接和编译失败,也没有绘制任何纹理。

统一格式只是(每个程序)OpenGL状态。设置统一值的方式完全独立于将着色器链接到程序对象-GL在着色器链接时对此一无所知,程序只是有一堆活动的统一,您可以随时将它们设置为您喜欢的任何内容

制服总是有一种类型。您必须使用与统一变量类型匹配的正确的
glUniform*()
函数,否则将生成GL error
GL\u INVALID\u操作
(并且该操作没有进一步的影响)。对于采样器制服,您需要将纹理单位的索引设置为整数,因此
glUniform1i()
是正确的函数,而
glUniform1f()
-用于浮动-将不起作用。由于未设置统一,因此将使用该统一的上一个值-如果从未设置,则该值将为0

因此,所发生的是,您从绑定到纹理单元的纹理中采样,而不是您想要的纹理。您可以在创建纹理时使用该纹理单元,这将解释仍然存在“最后”文本绑定。

统一格式只是(每个程序)OpenGL状态。设置统一值的方式完全独立于将着色器链接到程序对象-GL在着色器链接时对此一无所知,程序只是有一堆活动的统一,您可以随时将它们设置为您喜欢的任何内容

制服总是有一种类型。您必须使用与统一变量类型匹配的正确的
glUniform*()
函数,否则将生成GL error
GL\u INVALID\u操作
(并且该操作没有进一步的影响)。对于采样器制服,您需要将纹理单位的索引设置为整数,因此
glUniform1i()
是正确的函数,而
glUniform1f()
-用于浮动-将不起作用。由于未设置统一,因此将使用该统一的上一个值-如果从未设置,则该值将为0


因此,所发生的是,您从绑定到纹理单元的纹理中采样,而不是您想要的纹理。您可以在创建纹理时使用该纹理单元,这将解释仍然存在“最后一个”textture绑定。

谢谢-现在有意义。谢谢-现在有意义了。