gpt4 book ai didi

ios - glUniform1f 与 glUniform1i 混淆

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:43:08 25 4
gpt4 key购买 nike

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

glActiveTexture(GL_TEXTURE1);                   
glBindTexture(GL_TEXTURE_2D, self.texture);
glUniform1f(_texUniform, 1); // this line should be glUniform1i

我的项目有多个具有自己纹理的对象。这个拼写错误导致所有对象上只显示最后绘制对象的纹理。我怀疑我的纹理 ID 或类似的东西有问题,因此在每次绘制调用时注销纹理 ID 等,这样就找不到任何错误。

这对我来说是一个很难找到的错误,我想了解这个错误是怎么回事。我的问题是 glUniform1f 与 glUniform1i 会导致此行为的原因是什么?我有点惊讶着色器不仅无法链接和编译,或者根本无法绘制任何纹理。

最佳答案

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

制服总是有类型的。并且您必须使用与统一变量类型相匹配的正确 glUniform*() 函数,否则会生成 GL 错误 GL_INVALID_OPERATION(并且该操作没有进一步的影响) .对于采样器制服,您需要将纹理单元的索引设置为整数,因此 glUniform1i() 是正确的函数,而 glUniform1f() - 用于 floats - 将不起作用。由于您没有设置制服,因此将使用该制服的先前值 - 如果您从未设置它,它将为 0。

所以发生的事情是您从绑定(bind)到纹理单元 GL_TEXTURE0 的纹理中采样,而不是您想要的那个。您可能会在创建纹理时使用该纹理单元,这将解释是否仍然存在“最后”纹理绑定(bind)。

关于ios - glUniform1f 与 glUniform1i 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23687102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com