Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Графические эффекты

Автор: XaMMaX 6.05.2008 22:07

подскажите какие-нибудь интересные графические 2д эффекты, фокусы с расстановкой пикселей или цветами, учитываю что не должна использоваться какая-либо видео акселерация видео картой(я имею ввиде без опенгл или дирестикс). Надеюсь вы меня поняли и что-нибудь подскажите :D

Автор: andriano 6.05.2008 23:48

Что-нибудь такое?



Прикрепленные файлы
Прикрепленный файл  FireLens.ZIP ( 14.14 килобайт ) Кол-во скачиваний: 231

Автор: XaMMaX 6.05.2008 23:57

Да, спасибо. Линзу поизучаю, но хотелось бы ещё что-то интересное, моежт какие-то фокусы с изменением цвета и т.д.

Автор: andriano 8.05.2008 2:23

Цитата(XaMMaX @ 6.05.2008 20:57) *

Да, спасибо. Линзу поизучаю, но хотелось бы ещё что-то интересное, моежт какие-то фокусы с изменением цвета и т.д.

Кое-что из того, что в свое время собирал.
Те эффекты, что с текстовым режимом, работают, естественно, только в полноэкранном режиме, в окне не работают, хотя из виндов запускаются именно в окне.
Не забыть переключить Alt+Enter.


Прикрепленные файлы
Прикрепленный файл  DEMO.ZIP ( 131.6 килобайт ) Кол-во скачиваний: 260

Автор: klem4 8.05.2008 22:29

не знаю подойдет или нет, но есть такая темка: http://forum.pascal.net.ru/index.php?showtopic=3867

Автор: XaMMaX 8.05.2008 22:40

2klem4, Переработаю на свой лад и подойдёт, спасибо и позор мне что я так плохо пользуюсь поиском :D

2andriano, Спасибо! :D

Автор: XaMMaX 9.05.2008 15:02

Господа знатоки, вот думаю как реализовать эффект для взрыва, собственно, что требуется:
Нужно сделать широкий круг увеличывающийся от точки взрыва, но круг должен искажать окружение, как взрывная волна или что вроде этого(я думаю для этого нужны только гетпиксели и путпиксели), в идеали хотелось бы не круг, а эллипс т.к. у меня игра в перспективе.
Чтобы понятней я пытался найти нормальный скриншот из игры где подобное реализовано(только так круг, а не эллипс), но нашёл только один не очень удачный скриншот т.к. там это не очень хорошо видно.
Изображение
Как вы видите от точки взрыва разрастается круг искажающий окружение. Правда он не очень больше, но надеюсь вы его разглядели :D
Есть какие-нибудь идеи как это реализовать? Где гедпиксели делать и т.д.

Автор: andriano 10.05.2008 1:18

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

Автор: XaMMaX 10.05.2008 2:12

Цитата
Если взрыв наподобие того, что справа - полупрозрачный анимированный спрайт.

Нет нет, ты смотрел на сам взрыв, а не на взрывную волну, ну вот что-то такое, может наглядней:

Изображение

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

Трям прям и не сообразить, но я так понимаю почти тоже самое, что пример линзы который ты приводил выше?

Автор: andriano 10.05.2008 14:20

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

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

Автор: XaMMaX 11.05.2008 0:45

Цитата
И еще по поводу прежнего сообщения: если собираешься работать с динамичной графикой, например, с игрой, забудь про гетпиксель и путпиксель - это слишком медленно.

Честно говоря, ты меня поставил в тупик. А как ещё можно это реализовать?

Автор: andriano 11.05.2008 2:17

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

Автор: XaMMaX 11.05.2008 3:05

Значит ли это, что мне все процедуры надо переписывать для записи их в массив? Я честно говоря ещё начинающий(хотя нет, просто топчусь на месте) мне бы разжевать слегка :D

Автор: andriano 11.05.2008 3:10

Не понял вопроса. Какие процедуры ты записываешь в массив? И зачем?

Автор: XaMMaX 11.05.2008 3:29

Цитата
Работаешь с экраном (вероятно экранным буфером) как с массивом пикселей без вызова процедур для отдельных точек.

Хм, как с массивом, тоесть процедуры вывода допустим картинок должны писаться сразу в массив(всмысле не сами процедуры конечно, а картинки, которые они выводят)? Тоесть их надо специально переписывать? Или я совсем тупой? :D

Автор: andriano 11.05.2008 11:06

Любая процедура, участвующая в формировании изображения должна работать с объектами, существенно превосходящими одну точку. Скажем, со строкой растра, с прямоугольной областью экрана или с другим примитивом.
Внутри процедуры идет работа непосредственно с фреймбуфером. Сам фреймбуфер определяется адресом начала, глубиной цвета и длиной сканлинии в байтах. Именно используя эти параметры, процедура и осуществляет работу с изображением.
Процедуры типа putpixel и getpixel пригодны только для учебных примеров или статичной графики.
Собственно, сравни скорость формирования изображения при помощи этх процедур и непосредственной записью в фреймбуфер, и вопросы сами отпадут.

Автор: XaMMaX 11.05.2008 17:37

А пример подобного где-нибудь посмотреть можно? Может даже на этом форуме, я просто фразу для поиска немогу удачную подобрать unsure.gif
Но я так понимаю придёться пользоваться ассемблером? Или я опять ничего не понял? Разве можно стандартными средствами узнать значения в фреймбуфере?

P.S.
Извини за подобные вопросы(наверняка глупые), просто мне реально хочеться этому научиться и я готов приложить усилия, но пока не понимаю куда копать.

Автор: andriano 11.05.2008 23:33

Можно, конечно, получить данные непосредственно экрана. Но это долго. Долго это было под DOS, т.к. видеопамять намного тормознее по операции чтения, чем по операции записи. Еще дольше это под Windows.
В то же время хорошо себя зарекомендовал следующий алгоритм:
1. готовим в оперативной памяти буфер в формате BMP-файла, причем, с удобной нам глубиной цвета.
2. в обработчике сообщения WM_PAINT процедурой StretchDIBits переливаем содержимое буфера на экран.
Примечания:
к п.1: обычно я использую 256-цветный режим, т.к. для операций в труколоре обычно больше подходит OpenGL. Но это мое личное мнение. Опять же, сущесвуют исключения, например, то, что я привел вл втором посте темы.
к п.2: мне кажется, что если размеры буферов совпадают (т.е. не требуется масштабирования), то операцию преобразования цвета (например от палитры 256 цветов в труколор) берет на себя железо видюшки прозрачно для программы. По крайней мере, судя по скорости этого преобразования.

Что же касается примера, то чем не подходит, опять же, архив из второго поста? Там я как раз реализовал описанную технику.

PS. Да, язык Ассемблера здесь в подавляющем большинстве случаев совсем необязателен. В приведенном римере, например, на нем написано всего несколько строк, и то лишь для того, чтобы использовать MMX для ускорения одного конкретного алгоритма.

Автор: XaMMaX 12.05.2008 1:42

Цитата
Что же касается примера, то чем не подходит, опять же, архив из второго поста? Там я как раз реализовал описанную технику.

Да вот запустить не могу. Я так понимаю компилировать надо в делфи? Я открываю седьмым "FireLens.pas", но запустить нельзя в принципе(кнопка серая). Я уже давно делфи не пользовался и не могу понять в чём проблема wacko.gif

Автор: andriano 12.05.2008 14:34

Откомпилировано оно в TMT-Паскале, для Delphi, вероятно, надо адаптировать. 16-разрядным компилятором, не должно компилироваться в принципе. Поэтому сразу положил exe-шник, чтобы можно было посмотреть.

Собственно, привел-то я пример того, как можно сделать (общий принцип) и как это будет выглядеть. На то, что эта прогамма может быть откомпилирована без переделки я и не рассчитывал.