【问题标题】:OpenGL Integer Textures on OSX (NVIDIA GeForce GT 650M)OSX 上的 OpenGL 整数纹理 (NVIDIA GeForce GT 650M)
【发布时间】: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;

    // ..
}

texSizeivec2(1,1),尽管我指定了 1024x2 纹理。

pixelVal 是一个垃圾 uint。

我没有 gl 错误(从上面删除每个 OGL API 调用后的glGetError 调用)。

我在使用整数纹理和使用 RGBA 无符号整数纹理时得到相同的结果。


当我将纹理更改为浮动纹理时,一切正常。

texSizeivec2(1024,2)

pixelVal 是正确的浮点值


当我在 Windows 7 上运行相同的无符号整数纹理代码(ATI Radeon HD 5450 和 GLEW 提供的扩展)时,我在片段着色器中得到了预期的结果:

texSizeivec2(1024,2)

pixelVal 是正确的 uint 值


谁能解释一下 OSX 上的整数纹理出了什么问题? 也许我的 NVIDIA 卡有问题。搜索未发现任何报告病例...

【问题讨论】:

  • glUniform1i("my_texture", GL_TEXTURE0); 与您的代码中的行完全一样吗?您需要传递制服的位置,而不是名称。
  • 是的 - 抱歉,我的代码使用 glGetUniformLocation 从名称中获取位置(已编辑)
  • 如果可以(并且应该)使用#version 410,为什么还要在着色器上使用#version 150 core?解决这个问题,它可能会起作用。
  • 另外,检查着色器/程序日志。
  • 感谢您的回复。遗憾的是,使用版本 410 并不能解决问题。我想用这个 GLSL 版本来兼容旧显卡;我的着色器代码由 150 个核心覆盖,不需要 410。我在每次相关 API 调用后检查着色器/程序日志,但没有显示任何内容。

标签: macos opengl glsl


【解决方案1】:

您的通话有问题:

glUniform1i(uniID, GL_TEXTURE0);

采样器uniform需要设置的值是纹理单元的索引,而不是对应的枚举。要从纹理单元 0 采样,需要:

glUniform1i(uniID, 0);

【讨论】:

  • 感谢现场。这是我在向问题添加代码时犯的一个错误,而不是代码本身 - 抱歉。实际代码如您所描述(已编辑)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多