假设我有一个功能,我希望用户能够以类型安全的方式选择适当的纹理。因此,我没有使用GL_TUMTUREX的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_);
}
答案 0 :(得分:7)
我认为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
,这是安全的; the OpenGL 3.2 Core specification的§3.8说:
如果指定了无效的纹理,ActiveTexture 会生成错误
INVALID_ENUM
。 texture 是TEXTURE
i 形式的符号常量,表示纹理 单位 i 将被修改。常量服从TEXTURE
i= TEXTURE0+
i ( i 在 范围0到 k - 1,其中 k 是MAX_COMBINED_TEXTURE_IMAGE_UNITS
)的值。
答案 1 :(得分: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回答。