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 はエラーを生成します。textureは形式TEXTUREiの記号定数で、テクスチャ ユニットiが変更されることを示します。定数はTEXTUREi = TEXTURE0+iに従います( iは 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 に答える