Как проверить наличие mip-карты в OpenGL? - PullRequest
2 голосов
/ 18 июня 2010

Недавно я столкнулся с проблемой, когда моя программа OpenGL неправильно отображала текстуры на 2-летнем ноутбуке Lenovo с картой nVidia Quadro 140. Он работает с OpenGL 2.1.2 и GLSL 1.20, но когда я включил mip-mapping, весь экран черный, без предупреждений или ошибок.

Это мой код фильтра текстур:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

После 40 минут возни, я обнаружил, что проблема в mip-mapping. Отключение исправило это:

// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

Я получаю много псевдонимов, но, по крайней мере, программа видна и работает нормально.

Наконец, два вопроса:

  1. Какой лучший или стандартный способ проверить, доступно ли mip-mapping на компьютере, кроме проверки версий OpenGL?
  2. Если mip-mapping недоступен, как лучше обойтись без псевдонимов?

Edit:

Вот вопрос, который мне действительно нужен:

Как программно проверить, доступно ли mip-mapping на платформе?

Ответы [ 4 ]

3 голосов
/ 18 июня 2010

OpenGL 1.4 требуется для поддержки автоматического mipmap generation (с использованием GL_GENERATE_MIPMAP), текстурирование с использованием mipmaps должно быть доступно практически на каждой графической карте.Я предполагаю, что проблема может заключаться не в отсутствии функциональности mipmapping, а, возможно, в создании mipmaps.Только для целей отладки, можете ли вы попытаться сгенерировать mipmaps с помощью gluBuild2DMipmaps?

Если эта проблема характерна для данной графической карты / конфигурации, проверка обновленных драйверов также может быть хорошей идеей.

Хороший способ избавиться от алиасинга - это мультисэмплинг .

2 голосов
/ 21 июня 2010

OpenGL требует, чтобы все форматы текстур, которые являются частью Core, поддерживали mip-mapping.Таким образом, нет конкретного способа спросить, поддерживает ли формат текстуры mip-mapping.

Некоторые расширения, когда они были впервые введены, ослабили это ограничение для новых форматов (прежде всего, отсутствие мощности двух текстур иплавающие текстуры).Само расширение дало понять, что mip-mapping вообще не поддерживается.Но до того, как они были интегрированы в ядро, требование поддержки mip-mapping было восстановлено.

2 голосов
/ 18 июня 2010

Если mip-mapping недоступен, вы, вероятно, не хотите избегать псевдонимов. Платформа без MIP-картографии обычно не стоит проблем.

Однако, если вы действительно хотите избежать наложения псевдонимов, вы можете аппроксимировать mip-отображение для каждого фрагмента примитивным mip-mapping. Сначала вы должны сгенерировать и загрузить все уровни mip-map вручную в отдельные текстуры. Перед рендерингом треугольника вычислите соответствующий уровень mip-карты на процессоре и используйте текстуру, соответствующую этому уровню mip-map. Чтобы избежать артефактов на больших примитивах, подразделите их.

0 голосов
/ 02 марта 2011

Я был бы очень удивлен, если бы ваша реализация действительно не поддерживала mipmaps. Скорее всего, вам не хватает одного или нескольких уровней, это может произойти случайно.

Если вы пропускаете только один уровень мипов и включаете мипмаппинг, вы получаете только то, что имеете, черный. Убедитесь, что определены либо все уровни вплоть до 1x1, либо соответственно установите GLPTTEXTURE_MAX_LEVEL TexParameter.

...