【发布时间】:2014-07-17 19:01:16
【问题描述】:
我在使用 GeForce GT 650M 的 OSX 10.9.4 上的片段着色器中读取无符号整数纹理时遇到问题。
我正在使用 OpenGL 3.2 核心配置文件。
GL_VESION 报告为:4.1 NVIDIA-8.26.26 310.40.45f01
GL_SHADING_LANGUAGE_VERSION 报告为:4.10
以下是我在 C++ 中设置的相关部分:
// ..
GLuint texID;
glGenTextures(1, &texID);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texID);
// data is a void* arg
glTexImage2D(GL_TEXTURE_2D, 0, GL_R32UI, 1024, 2, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, data);
// programID is a GLuint arg
GLint const uniID = getUniformID(programID, "my_texture")
glUniform1i(uniID, 0);
// ..
以下是我的片段着色器代码中的相关部分:
#version 150 core
// ..
uniform usampler2D my_texture;
// ..
void main()
{
ivec2 texSize = textureSize(my_texture, 0);
uint pixelVal = texelFetch(my_texture, ivec2(0, 0), 0).r;
// ..
}
texSize 是 ivec2(1,1),尽管我指定了 1024x2 纹理。
pixelVal 是一个垃圾 uint。
我没有 gl 错误(从上面删除每个 OGL API 调用后的glGetError 调用)。
我在使用整数纹理和使用 RGBA 无符号整数纹理时得到相同的结果。
当我将纹理更改为浮动纹理时,一切正常。
texSize 是ivec2(1024,2)
pixelVal 是正确的浮点值
当我在 Windows 7 上运行相同的无符号整数纹理代码(ATI Radeon HD 5450 和 GLEW 提供的扩展)时,我在片段着色器中得到了预期的结果:
texSize 是ivec2(1024,2)
pixelVal 是正确的 uint 值
谁能解释一下 OSX 上的整数纹理出了什么问题? 也许我的 NVIDIA 卡有问题。搜索未发现任何报告病例...
【问题讨论】:
-
glUniform1i("my_texture", GL_TEXTURE0);与您的代码中的行完全一样吗?您需要传递制服的位置,而不是名称。 -
是的 - 抱歉,我的代码使用 glGetUniformLocation 从名称中获取位置(已编辑)
-
如果可以(并且应该)使用
#version 410,为什么还要在着色器上使用#version 150 core?解决这个问题,它可能会起作用。 -
另外,检查着色器/程序日志。
-
感谢您的回复。遗憾的是,使用版本 410 并不能解决问题。我想用这个 GLSL 版本来兼容旧显卡;我的着色器代码由 150 个核心覆盖,不需要 410。我在每次相关 API 调用后检查着色器/程序日志,但没有显示任何内容。