SDL сглаживание без OpenGL? - PullRequest
       11

SDL сглаживание без OpenGL?

4 голосов
/ 12 ноября 2011

Я пытаюсь сделать игру на C ++ с использованием SDL.Я хотел бы реализовать сглаживание в графике, но все, что я искал в Интернете по этой теме, предлагает либо внешнюю библиотеку, либо решение, которое также включает OpenGL.-alias без OpenGL (например, изменение графики перед рукой, или, возможно, некоторые функции, которые я не нашел)?Если нет, то насколько сложно преобразовать игру, написанную на SDL, в использование OpenGL (раньше я не работал с OpenGL ...)?

Ответы [ 2 ]

2 голосов
/ 28 мая 2013

Старый вопрос, но у меня был такой же.Позвольте мне разобраться с частями, которые остались без ответа.

"Есть ли способ сделать сглаживание без OpenGL (например, изменить графику перед рукой или, возможно, какую-то функцию, которую я не сделал»не найти)? Если нет, то насколько сложно преобразовать игру, написанную на SDL, в использование OpenGL (раньше я не работал с OpenGL ...) "

1) Мне нравитсяРуководства по OpenGL и SDL на http://lazyfoo.net/
Пошаговые инструкции, включая настройку среды кода и библиотек, ориентированные на программирование игр.Больше опыта работы с библиотеками должно прояснить вторую половину этого вопроса.

2) Я думаю, что люди ответили на вопрос немного другой, чем вы задавали.
С помощью шрифтов SDL создает поверхности с сглаженными краями.AA равен static , но результат не (1 XOR 0), как ColorKey.Для меня это звучит так, будто вы просто хотите того же с изображениями.

Если это был ваш вопрос, то, конечно, вы можете сделать сглаживание в SDL.Вы можете хранить все, что вы хотите в альфа-канале (игровые дизайнеры делают).Вы можете создать новый канал и добавить его к изображению во время выполнения.Это просто плохая идея сделать это в SDL, вот и все.Чтобы понять почему, позвольте мне составить

ПРИМЕР ПРОЦЕДУРЫ:
, чтобы сделать это самостоятельно.Скажем, у нас есть изображение mxn с белым цветным ключом.Мы хотим улучшить фильтр цветовых ключей, используемый SDL_DisplayFormat ().Создайте Джером, массив mxn с плавающей точкой.Если изображение белое, установите Джером на 1. Оставьте все остальные значения равными 0.

Скажем, мы остановимся здесь.Альфа 0 прозрачна на 100%.Итак (1-Джером) превращает его в альфа-канал.Например, выйдите из SDL, добавьте (1-Джером) как канал 4, сохраните изображение в формате .png.Загрузите его в SDL с SDL_DisplayFormatAlpha.Результат должен быть таким же, как при использовании цветовой клавиши на исходном изображении.Неприятный фильтр, но быстрый.

Давайте сделаем это лучше.Возьмите любой белый пиксель W и добавьте прозрачность со всех восьми сторон.Добавьте T% к смежным пикселям и меньшее количество, t% к диагональным пикселям, например:т т тТ Ш Тт т т

(радиус может быть 2 или более пикселей, или мы можем использовать другую функцию в целом. Все, что мы хотим).Сделайте это для всех белых пикселей.Например, создайте второй массив, Maxine, инициализированный нулями.Для каждой записи «1» в Джером, добавьте T и T к Максине.Делайте столько пикселей одновременно, сколько хотите.Затем добавьте Максин в Джером: Джером + = Максин;ограничено 1. Единственными значениями Джерома, которые изменились, являются «0», непосредственно смежные с «1».Теперь они имеют значения от 0 до 1, в зависимости от того, сколько их соседей было ненулевым.Теперь (1-Джером) дает нам (грубо) сглаженный альфа-канал.

На opengameart.org обсуждается ряд вопросов, которые могут возникнуть.

ПРИМЕЧАНИЯ:
I) Фильтр можно сделать намного эффективнее.Например, мы можем обнаружить и выбросить нулевые члены суммы и собрать дополнения, переписав сумму (Convolution).

II) Если бы мы могли задать маску прозрачности по правилу, мы могли бы работать намного быстрее.Это имеет место со шрифтами, которые определены их краями.Произвольное изображение имеет произвольную маску.Использование тех же методов будет слишком медленным.Причина, по которой SDL предлагает выполнять AA на шрифтах, по той же причине, по которой он не предлагает делать это с изображениями.:)

III) У изображения очень много пикселей, и всю эту обработку можно выполнить заранее, с хорошими фильтрами, в редакторе изображений.

IV)Фильтр также может быть выполнен со всеми пикселями параллельно, принимая четыре канала в качестве (одновременных) векторных компонентов.(..так же использовать графический процессор)

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

Надеюсь, это полезно!(и я всегда ищу исправления).

0 голосов
/ 12 ноября 2011

Вы не можете динамически сглаживать графику в SDL, так как она не преобразует динамически спрайты.

Если вы хотите, чтобы ваши спрайты были сглажены, сделайте это в редакторе изображений и сохраните их в формате, поддерживающем альфа (.png)

...