glUniform无法设置采样器值
glUniform fails to set sampler value
我使用OpenGL和GLSL在简单网格上绘制纹理。
我的问题是,当我使用glUniform1i
设置sampler2D uniform的值时,它没有被设置。例如,在此代码中的:
glUseProgram(programObject);
glUniform1i(glGetUniformLocation(programObject, "texture"), 1);
GLint val;
glGetUniformiv(programObject,
glGetUniformLocation(programObject, "texture"),
&val);
printf("Value is %dn", val);
在命令行输出处打印的值为0。我已检查着色器是否已正确编译,程序是否已正确链接。CCD_ 2输出索引>0。此外,glGetError
在任何时刻都不输出任何错误。
只有当制服是采样器时才会发生这种情况。由于未设置纹理,因此在着色器中查询纹理总是返回(0,0,0、1)。(我还使用apitrace检查了我的纹理是否正确绑定到GL_TEXTURE1
,这是在显示的代码之后立即完成的)。
我对这个问题进行了广泛的搜索,在这里只发现了一个类似的例子。解决方案是初始化GLEW,但这对我来说不起作用
我很乐意提供任何需要的扩展信息(或来自apitrace的跟踪)。
编辑
这是着色器:
uniform sampler2D texture;
varying vec2 textureCoord;
void main() {
gl_FragColor = texture2D(texture, textureCoord);
}
解决方案
经过一番努力,我设法解决了这个问题。
事实证明,这个问题并不是因为没有设置uniform,因为无论实际值如何,总是为采样器返回0似乎是gl实现的一个怪癖。这只发生在英特尔的SandyBridge驱动程序下。在其他实现下测试代码总是返回正确的采样器值。
纹理返回(0,0,1)的问题总是由于我在生成纹理时犯了一个错误。
现在glGerUniformiv
仍然返回0,但使用的纹理是正确的。
解决方案
经过一番努力,我设法解决了这个问题。
事实证明,这个问题并不是因为没有设置uniform,因为无论实际值如何,总是为采样器返回0似乎是gl实现的一个怪癖。这只发生在英特尔的SandyBridge驱动程序下。在其他实现下测试代码总是返回正确的采样器值。
纹理返回(0,0,1)的问题总是由于我在生成纹理时犯了一个错误。
现在glGerUniformiv仍然返回0,但使用的纹理是正确的。
- 如何使用采样器立方体作为数组
- 将迭代器设置为具有最高键的值
- 将svm分类器设置为HOG检测器
- 片段着色器中的"错误:在 GLSL 1.30 及更高版本中禁止使用非常量表达式索引的采样器数组"
- 如何在链接器设置和搜索目录更改后修复" '::iswblank' has not been declared"
- 为什么找不到这个统一采样器2D?
- 如何将多个立方体纹理传递到均匀的采样器中
- 如何将单个字符转换为为基本密码哈希器设置整数,C++
- GLSL 无法获取采样器3D 值
- C++自动吸气器设置方法的类模板 - 好/坏的做法?
- Glgetuniform -location以外的采样器返回-1
- 用自定义比较器设置操作STD ::设置操作
- 来自代码采样器的Direct3D(DirectX 9.0)代码示例
- Vulkan的YCBCR采样器
- 将FFMPEG命令行转换为C 编解码器设置
- 无法使用访问器设置私有静态成员变量
- 插入函数中的迭代器设置
- 如何为CMAKE中的链接器设置库
- 如何在vc++中使用samplegrabber?未定义采样器
- glUniform无法设置采样器值