OpenGL: Как автоматически выбрать правильный метод mipmapping? - PullRequest
2 голосов
/ 24 августа 2010

У меня проблема с отображением текстур на другом оборудовании. Я использую следующий код:

char *exts = (char *)glGetString(GL_EXTENSIONS);

if(strstr(exts, "SGIS_generate_mipmap") == NULL){
    // use gluBuild2DMipmaps()
}else{
    // use GL_GENERATE_MIPMAP
}

Но на некоторых картах написано, что GL_GENERATE_MIPMAP поддерживается, когда нет, поэтому карта gfx пытается считывать память с того места, где должен быть mipamp, таким образом, карта отображает другие текстуры на этих уровнях.

Я попробовал glGenerateMipmapEXT (GL_TEXTURE_2D), но он делает все мои текстуры белыми, я включил GL_TEXTURE_2D перед использованием этой функции (как было сказано).

Я мог бы просто использовать gluBuild2DMipmaps () для всех, так как это работает. Но я не хочу, чтобы новые карты загружались в 10 раз медленнее, потому что есть 2 пользователя, у которых действительно старые карты.

Так как правильно выбрать метод mipmap?

Ответы [ 2 ]

2 голосов
/ 24 августа 2010

glGenerateMipmap поддерживается как минимум OpenGL 3.3 как часть функциональности, а не как расширение.

У вас есть следующие варианты:

  1. Проверьте версию OpenGL, если она более новая, чем первая, которая когда-либо поддерживала glGenerateMipmap, используйте glGenerateMipmap.
  2. (я бы порекомендовал это) OpenGL 1.4..2.1 поддерживает texParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE) (см. this ), который генерирует мипмапы с базового уровня. Это, вероятно, стало "устаревшим" в OpenGL 3, но вы должны иметь возможность использовать его.
  3. Используйте GLEE или GLEW и используйте вызов glewIsSupported / gleeIsSupported для проверки расширения.

Также я думаю, что вместо использования расширений проще придерживаться спецификаций OpenGL. Многие аппаратные средства поддерживают OpenGL 3, поэтому вы должны иметь возможность получить большинство необходимых функций (шейдеры, мип-карты, объекты кадрового буфера, геометрические шейдеры) как часть спецификации OpenGL, а не как расширение.

1 голос
/ 24 августа 2010

Если водители лгут, с этим мало что можно поделать.Также помните, что glGenerateMipmapEXT является частью расширения GL_EXT_framebuffer_object.

То, что вы делаете неправильно, проверяет расширение SGIS_generate_mipmap и использует GL_GENERATE_MIPMAP, поскольку это перечисление принадлежит ядру OpenGL, но это на самом деле не проблема.

Проблема, которую вы описываете, звучит как очень ужасная ошибка реализации OpenGL, я бы обошел ее, используя gluBuild2DMipmaps на этих картах (имея список и проверяя при запуске).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...