4

假设我有一个功能,我希望用户能够以类型安全的方式选择适当的纹理。因此,我没有使用 GL_TEXTUREX 的 GLenum,而是定义了一个方法,如下所示。

void activate_enable_bind(uint32_t texture_num)  {
  const uint32_t max_textures = GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS - GL_TEXTURE0;
  const uint32_t actual_texture = (GL_TEXTURE0 + texture_num);

  if (texture_num > max_textures) {
    throw std::runtime_error("ERROR: texture::activate_enable_bind()");
  }

  glActiveTexture(actual_texture);
  glEnable(target_type);
  glBindTexture(target_type, texture_id_);
}

这是否保证在基于 opengl 规范的所有实现下工作,或者是否允许实现者拥有

`GL_TEXTURE0 - GL_TEXTURE(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS -1)` 

以非连续方式定义?

我在这里也修改了我的代码:

void activate_enable_bind(uint32_t texture_num = 0)  {
  GLint max_textures = 0;
  glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &max_textures);
  if (static_cast<GLint>(texture_num) > max_textures - 1) {
    throw std::runtime_error("ERROR: texture::activate_enable_bind()");
  }

  const uint32_t actual_texture = (GL_TEXTURE0 + texture_num);

  glActiveTexture(actual_texture);
  glEnable(target_type);
  glBindTexture(target_type, texture_id_);
}
4

2 回答 2

8

我认为GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS它本身并不是一个有用的值,而是你传递glGet给检索实际值的东西。为了解决这个问题,您可以像这样检索它:

GLint max_combined_texture_image_units;
glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &max_combined_texture_image_units);
// and then maybe check for errors

至于添加到GL_TEXTURE0,那是安全的;OpenGL 3.2 核心规范第3.8节这样说:

INVALID_­ENUM如果指定了无效纹理,则ActiveTexture 会生成错误。textureTEXTUREi形式的符号常数,表示要修改纹理单元i 。常数服从TEXTUREi = TEXTURE0+ii在 0 到k - 1 的范围内,其中k是 的值MAX_­COMBINED_­TEXTURE_­IMAGE_­UNITS)。

于 2013-05-18T21:55:18.907 回答
1

您更正的代码,(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS是一个枚举):

void activate_enable_bind(uint32_t texture_num)  {
  int value;
  glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB,&value);

  if (texture_num+1 > value) {
    throw std::runtime_error("ERROR: texture::activate_enable_bind()");
  }

  const uint32_t actual_texture = (GL_TEXTURE0 + texture_num);

  glActiveTexture(actual_texture);
  glEnable(target_type);
  glBindTexture(target_type, texture_id_);
}

编辑:另请阅读@icktoofay 答案。

于 2013-05-18T21:59:18.697 回答