• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - glUniform1f 与 glUniform1i 混淆

[复制链接]
菜鸟教程小白 发表于 2022-12-13 07:50:38 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在 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 vs glUniform1i 是什么会导致这种行为?我有点惊讶的是,着色器不仅无法链接和编译,或者根本没有绘制任何纹理。



Best Answer-推荐答案


Uniforms 只是(每个程序的)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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap