gpt4 book ai didi

c++ - 如何获得最大数量的多纹理单元

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:58 24 4
gpt4 key购买 nike

假设我有一个函数,我希望用户能够以类型安全的方式选择合适的纹理。因此,我没有使用 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_);
}

最佳答案

我认为 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 节是这样说的:

Active­Texture generates the error INVALID_­ENUM if an invalid texture is specified. texture is a symbolic constant of the form TEXTUREi, indicating that texture unit i is to be modified. The constants obey TEXTUREi = TEXTURE0+i (i is in the range 0 to k − 1, where k is the value of MAX_­COMBINED_­TEXTURE_­IMAGE_­UNITS).

关于c++ - 如何获得最大数量的多纹理单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16629317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com