- PVSM.RU - https://www.pvsm.ru -
Вдохновившись статьей «У прозрачных пикселей тоже есть чувства или артефакты png'шек с прозрачностью» [1], решил рассказать еще о некоторых проблемах, которые могут возникнуть при разработке 2D-игры.
В этой статье я хотел бы рассказать о нетривиальных проблемах, с которыми мне пришлось столкнуться при разработке 2D-игр, связанных с фильтрацией текстур.
Все эти артефакты возникают при включенной фильтрации текстур. А также масштабировании, повороте текстуры или если она имеет дробные координаты.
Текстуры накладываются на треугольники в пространстве экрана. Обычно размер треугольного фрагмента текстуры отличается от размера треугольной грани на экране. Когда фрагмент текстуры меньше, чем изображение грани на экране, выполняется увеличение фрагмента текстуры до размеров грани. Когда текстура больше чем грань на экране, она сжимается. И в том и в другом случае возникают искажения. Фильтрацией называется техника уменьшения этих искажений.
Фильтрация очень полезна, но как оказалось, может вызвать некоторые проблемы в приложениях где важно, чтобы исходное изображение было идентично первоначальному.
Пусть это изображение мы хотим отобразить:
Режимы текстурной адресации указывают как должен вести себя видео процессор если текстурная координата вершины треугольника выходит за пределы изображения. Существует четыре вида адресации: обертывание (wrap), цвет рамки (border color), одиночное наложение (clamp) и отражение (mirror).
При установленном режиме текстурной адресации WRAP, пиксели с одной стороны изображения попадают на другую.
Используйте WRAP адресацию только если это необходимо. Если вам нужно просто вывести текстуру, используйте режим CLAMP.
На некоторых видеокартах текстуры, размеры которых, ширина или высота, не кратны степени двойки, дополняются. И мы получаем такое изображение:
Конечно, дополненную часть изображения на экране мы не увидим. О ее существовании можно узнать получив буфер текстуры и обнаружив, что он больше ожидаемого. Но эта часть будет участвовать в фильтрации. В результате этого ее часть мы сможем увидеть на границе изображения.
Можно заполнить эту область, полностью или частично, пикселями, которые лежат на границе. Вот так:
В качестве общего решения, можно оставлять рамку в несколько пикселей вокруг области текстуры, которая будет попадать на экран.
Синяя рамка это область которая будет выводиться на экран.
Еще одно решение — оставлять на краях изображения прозрачную рамку.
Но в таком случае может возникнуть проблема из статьи, которая указана в начале. Но и она разрешима. Например можно использовать программу PVRTextureTool [2].
Источники:
1. Франк Д. Луна. Введение в программирование трехмерных игр с DX9. Wordware Publishing, 2003. ISBN: 1-55622-922-4
Автор: sanchousf
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/12748
Ссылки в тексте:
[1] «У прозрачных пикселей тоже есть чувства или артефакты png'шек с прозрачностью»: http://habrahabr.ru/post/147165/
[2] PVRTextureTool: http://www.imgtec.com/powervr/insider/powervr-pvrtextool.asp
Нажмите здесь для печати.