- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在 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/
我正在使用 OpenGL 和 GLSL 在简单的网格上绘制纹理。 我的问题是,当我使用 glUniform1i 设置 sampler2D uniform 的值时,它没有被设置。例如在这段代码中: gl
我想知道 glUniformXXv 是否会阻塞,直到指针所指的数据被复制到 GPU。换句话说,如果 GPU 很忙,这段代码会导致问题吗? int i=5; glUniform1iv(location,
GLSL 代码和传递数据的 native 代码之间的类型必须匹配到什么程度? 例如,假设我有着色器代码: uniform float uFloat; uniform int uInt; in floa
当我调用 glUniform2fv 时到底会发生什么? 它是同步复制传递的缓冲区还是只是接受指针并稍后使用该数据?它保留缓冲区吗? 换句话说:在函数中传递本地创建的或非保留的缓冲区是否安全,或者由我来
再次嗨,欢迎来到另一个“如果我们将两件我真的不了解的事情结合起来会不会很棒”-问题;) 这一集:OpenGL 制服和 C++ 模板 想法:如果您可以编写一个模板函数来在 OpenGL 着色器中设置制服
我已经阅读了khronos的规范,我知道glProgramUniform*()将数据上传到指定的程序对象,而glUniform*()将数据上传到当前绑定(bind)的程序对象。但我想知道这两者之间是否
我目前正在编写一个 openGL 着色器类。我没有使用函数来设置每个统一类型,而是尝试将统一函数(例如 glUniform1f)作为参数传递。 我目前的尝试看起来像这样: template void
如果我有一个看起来像这样的片段着色器: #version 450 #define MAX_NUM_LIGHTS 10 #define NUM_CASCADES 6 uniform sampler2D
我正在关注 OpenGL v3.3 教程,该教程指示我使用 glUniform4f 修改片段着色器中的统一属性(请参阅下面的代码)。据我了解,OpenGL 是一个状态机,我们不会取消绑定(bind)当
背景 我目前正在围绕 OpenGL 的 glUniform 编写包装器C++ 中的函数,努力使它们类型安全。我有一堆 set_uniform 函数被重载以接受 OpenGL POD(GLint、GLu
我是一名优秀的程序员,十分优秀!