- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 OpenGL 和 GLSL 在简单的网格上绘制纹理。
我的问题是,当我使用 glUniform1i
设置 sampler2D uniform 的值时,它没有被设置。例如在这段代码中:
glUseProgram(programObject);
glUniform1i(glGetUniformLocation(programObject, "texture"), 1);
GLint val;
glGetUniformiv(programObject,
glGetUniformLocation(programObject, "texture"),
&val);
printf("Value is %d\n", val);
命令行输出的值是 0。我检查了着色器是否正确编译,程序是否正确链接。 glGetUniformLocation
输出索引 > 0。此外,glGetError
在任何时候都不会输出任何错误。
只有当制服是采样器时才会发生这种情况。由于未设置纹理,在着色器中查询它总是返回 (0, 0, 0, 1)。 (我还使用 apitrace 检查了我的纹理是否正确绑定(bind)到 GL_TEXTURE1
,这是在显示的代码之后立即完成的)。
我广泛搜索了这个问题,但只找到一个与此类似的实例 here .解决方案是初始化 GLEW,但这对我不起作用。
我很乐意提供所需的任何扩展信息(或来自 apitrace 的跟踪)。
编辑
这是着色器:
uniform sampler2D texture;
varying vec2 textureCoord;
void main() {
gl_FragColor = texture2D(texture, textureCoord);
}
解决方案
经过一番努力,我设法解决了这个问题。
事实证明,这个问题不是因为没有设置制服,因为无论实际值如何,总是为采样器返回 0 似乎是 gl 实现的一个怪癖。这仅在 Intel 的 Sandy Bridge 驱动程序下发生。在其他实现下测试代码总是返回正确的采样器值。
纹理返回(0, 0, 0, 1) 的问题总是因为我在生成纹理时犯了一个错误。
现在 glGerUniformiv
仍然返回 0,但使用的纹理是正确的。
最佳答案
解决方案
经过一番努力,我设法解决了这个问题。
事实证明,这个问题不是因为没有设置制服,因为无论实际值如何,总是为采样器返回 0 似乎是 gl 实现的一个怪癖。这仅在 Intel 的 Sandy Bridge 驱动程序下发生。在其他实现下测试代码总是返回正确的采样器值。
纹理返回(0, 0, 0, 1) 的问题总是因为我在生成纹理时犯了一个错误。
现在 glGerUniformiv 仍然返回 0,但使用的纹理是正确的。
关于c++ - glUniform 无法设置采样器值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9379325/
我正在使用 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
我是一名优秀的程序员,十分优秀!