2013-05-18 3 views
4

Допустим, у меня есть функция, где я хочу, чтобы пользователь мог выбрать подходящую текстуру безопасным типом. Поэтому вместо использования GLenum GL_TEXTUREX я определяю метод следующим образом.Как получить максимальное количество мультитекстурированных единиц

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_); 
} 
+2

Это, если неверно, если texture_num не начинается с 1 до n. – Trax

+0

ошибка забора забора, модульные тесты поймали бы это. Но хороший глаз. –

+0

Если вы измените свой заголовок на что-то вроде «Как получить максимальное количество мультитекстурированных единиц», этот пост может быть более полезным для других. – Trax

ответ

6

Я думаю 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, что является безопасным; § 3,8 из the OpenGL 3.2 Core specification говорит, что это:

ActiveTexture генерирует ошибку INVALID_­ENUM если недействительный текстура является специфическая ред. текстуры является символической постоянной формы TEXTUREя, указывая, что текстуры блок я должен быть изменен. Константы подчиняются TEXTUREя= TEXTURE0+я (я находится в диапазоне от 0 до к − 1, где к является значением MAX_­COMBINED_­TEXTURE_­IMAGE_­UNITS).

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_); 
} 

EDIT: Также читайте @icktoofay ответ.

+0

@icktoofay был быстрее в своем ответе;) – Trax