OpenGL: включение мультисэмплинга рисует запутанные края для полигонов с высоким уровнем масштабирования - PullRequest
1 голос
/ 05 января 2010

Когда я использую следующий код:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 6);

и затем я включаю мультисэмплинг, я замечаю, что моя программа больше не заботится о максимальном уровне mip.

Редактировать: он также отображает последние уровни, это проблема, я не хочу, чтобы они отображались.

Edit3: Я проверил и подтвердил, что он вообще не забывает пределы mip, поэтому он соответствует моим настройкам GL_TEXTURE_MAX_LEVEL. ... Так что проблема не связана с mipmap, я думаю ...

Edit2: Скриншоты, это карта мира, сильно уменьшенная и использующая малый угол, чтобы эффект был показан наихудшим из возможных способов, также есть визуализированная плоскость воды под картой, поэтому нет никакой возможности взять черные пиксели где-либо еще, кроме текстур карты:

альтернативный текст http://img511.imageshack.us/img511/6635/multisamplingtexturelim.png

Edit4: Все эти фотографии должны выглядеть как изображение в верхнем правом углу (только сглаженные края в зависимости от мультисэмплинга). Но, видимо, в моем коде что-то ужасно неправильно. Я должен использовать MIPMAP, MIPMAP не проблема, они отлично работают.

Что я делаю не так, или как я могу это исправить?

Ответы [ 3 ]

1 голос
/ 13 января 2010

Проверьте также, что вы установили для MIN_FILTER:

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, ... );

Попробуйте другие настройки (список здесь ).

Однако, если вы недовольны результатами gluBuild2DMipmaps, я советую вам взглянуть на альтернативы:

Особенно последний очень настраиваемый. И что не было упомянуто, это расширение запускается установкой GL_GENERATE_MIPMAP в true. Это автоматически, поэтому вам не нужно делать пересчет при изменении данных.

1 голос
/ 15 января 2010

Хорошо. Так что проблема была не в TEXTURE_MAX_LEVEL в конце концов. Забавно, как простой тест помог понять это.

У меня было 2 теории о том, что LOD выбирают по-разному, и обе из них, похоже, опровергнуты тестом на сплошной цвет.

Тогда к третьей теории. Если я правильно понимаю вашу сцену, у вас есть модель, использующая текстурный атлас, и мы наблюдаем, что некоторые полигоны, которые должны извлекаться из определенного элемента атласа, на самом деле извлекаются из другого. Это верно?

Это может быть объяснено тем фактом, что мультисэмплированный фрагмент обычно выбирается в середине пикселя. Даже когда этот центр не находится внутри треугольника, который создал образец. См. эту страницу для иллюстрации.

Обычный способ обойти это называется выборка центроида (на этой странице также есть хорошие иллюстрации этой проблемы). Это заставляет выборку возвращать точку выборки внутри треугольника.

Теперь плохие новости: я не знаю ни одного способа включить фильтрацию центроидов за пределами программируемого конвейера, и вы не используете его. Как вы думаете, вы хотите переключиться, чтобы получить доступ к этой функции?

Изменить, чтобы добавить:

Кроме того, использование атласов текстур было бы способом обойти это. Причина, по которой это так заметно, заключается в том, что вы начинаете извлекать данные из другой части атласа с помощью шаблона выборки «вне треугольника».

0 голосов
/ 09 января 2010

Вам следует включить мультисэмплирование через ваше приложение, а не через панель управления nvidia, если вы хотите, чтобы рендеринг всегда имел его. Это может даже решить вашу проблему.

Что касается параметра GL_TEXTURE_MAX_LEVEL, игнорируемого при использовании мультисэмплирования панели управления, это звучит как ошибка / функция драйвера. Это странно, потому что эту функцию можно использовать для ограничения того, что вы на самом деле загружаете в текстуру (так называемые критерии полноты текстуры). Что делать, если вы вообще не загружаете самые низкие уровни mipmap? Что визуализируется?

Редактировать: На изображении, которое вы показываете, оно не выглядит так, как будто игнорирует настройку. С одной стороны, MAX_LEVEL = 0 отличается от MAX_LEVEL = 6. Теперь, учитывая шум в ваших текстурах, я даже не понимаю, почему ваш MAX_LEVEL = 6 / MS off выглядит так чисто. Это должно быть шумным на основе MAX_LEVEL = 16 / MS выключено. На этом этапе я бы посоветовал размещать разные сплошные цвета на каждом уровне мипа вашей диффузной текстуры (и не полагаться на GL для создания ваших мипов), чтобы точно определить, какие уровни мипов вы получаете.

...