|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
13.04.2008, 23:14 | #21 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Kostia, расскажи пожалуйста, как же применить маску к текстуре, с ключем все ясно, но он грубый сильно. Вот к примеру текстура 100х100 в 24bit глубины, и такая же маска 100х100 в 24bit, кроме того фон задний, и еще процедура обрезания текстуры при выходе за экран. Какая процедура нужна Blt, BitBlt, BtlFast или еще какая?
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
14.04.2008, 05:30 | #22 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
Полупрозрачность в DirectDraw – это ужас, в прямом и во всех других смыслах. DD не поддерживает аппаратной полупрозрачности и каким бы быстрым не был код альфы на программном уровне, его не заменить аппаратной поддержкой. Еще можно поискать информацию про модуль DDUtil, там все уже готово, но им я не пользовался, все делал вручную.
Для начала нужно создать две вспомогательные поверхности в одну будем результировать рассчитанную поверхность, в одну скопируем участок фона и еще две сама картинка и маска. Код:
У функции четыре параметра: Результирующая поверхность, ее размеры, и в какой памяти создать поверхность(DDSCAPS_VIDEOMEMORY или DDSCAPS_SYSTEMMEMORY). Если бы DD умел задавать прозрачность аппаратно, то мы бы создали поверхность в видеопамяти, а так придется создавать в оперативке, так быстрее альфа рассчитается. Код:
BltTrans я писал на глаз и не тестировал, но я уверен, что она будет работать. Загружаете вы маску и картинку, создаете две вспомогательные поверхности (в системной памяти), копируете в Desc кусочек фона, вызываете функцию BltTrans и потом любым из способов выводите уже рассчитанную картинку на задний буфер. Предупреждаю это очень медленно, для маленьких объектов тормозов незаметно, но вот больших будет сильный тормоз. |
14.04.2008, 15:47 | #23 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Kostia, большое спасибо! Все не так медленно будет, если на GDI я умудрился все это проделать с нормальной скоростью, то тут будет быстрее, а оптимизация все устранит тормозное.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
14.04.2008, 22:59 | #24 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Оптимизация...
Вот, собственно, что сразу бросилось в глаза, эта странная структура смешивания цветов:
результат := round( задник * маска + текстура * (1 - маска) ); надеюсь, ничего не напутал с расстановкой переменных, ...не удивительно, что вся функция BltTrans работает так тормозно. Вот что должно быть на самом деле (для 24bit глубины): результат := задник + ( текстура - задник ) * маска shr 8; ...это для каждого цвета по RGB, думаю больше пояснений не требуется.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Последний раз редактировалось Beermonza; 14.04.2008 в 23:15. |
15.04.2008, 08:25 | #25 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
Beermonza, Спасибо за оптимизацию. Я в интернете нашел пример как реализовать полупрозрачность и автор утверждал, что это самый быстрый способ смешивания цветов, но когда я запустил пример на менее мощном компьютере, то сразу заметил тормоза, но искать более быстрого способа смешать цвета не стал т.к. перешел на Direct3D.
|
15.04.2008, 14:48 | #26 |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
То есть DirectX в 2D не умеет полупрозрачность аппаратно применять? А с помощью Direct3D двухмерную игру в буквальном понимании создать невозможно? Получается частично тормознутая альфа в любом случае если я правильно понял?
А как OpenGL, аппаратно альфу в 2D применяет? Можно ли из этого сделать вывод, что одинаковая 2D графика на DirectX более требовательна к железу, чем на OpenGL?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог Последний раз редактировалось mutabor; 15.04.2008 в 14:54. |
15.04.2008, 15:27 | #27 | ||||
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
Цитата:
Цитата:
Цитата:
Цитата:
|
||||
15.04.2008, 15:37 | #28 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Так и есть. 2D в Direct3D не что иное, как построение полигона и натягивание на него текстуры, которая меняется в зависимости от цикла смены кадров.
Раз уж тема про DirectDrаw, то я разработаю более скоростную функцию, ...пока что далеко не предел оптимизации со сменой алгоритма смешивания цветов.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
15.04.2008, 15:56 | #29 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
С DirectDraw еще та замута, Beermonza. Я делал модуль для упрощения работы с DirectDraw, там и поворот и масштабирование и обрезание и полупрозрачность, одним словом все необходимое и все это можно было применить одновременно. Я два дня сидел только над тем как можно масштабировать и правильно обрезать картинку, а про повороты и полупрозрачность вообще молчу. В конце концов я пришел к выводу, не делать и не пользоваться разными движками, а делать все на низком уровне самому. Так можно воспользоваться всеми возможностями API и скорость работы приложения будет больше.
Beermonza, можешь покопаться в моих наработках, может что интересного найдешь. |
15.04.2008, 22:35 | #30 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Вот оно!
Как и обещал, выкладываю оптимизированную функцию отображения с альфа-каналом. Быстрее будет только аппаратная )
Обязателен свой тип для RGB: Код:
Код:
function BltFastAlpha(DDS7Desc, X, Y, W, H, DDS7Source, DDS7Mask, DDS7Buf): boolean; DDS7Desc - поверхность заднего фона IDirectDrawSurface7 (это буфер, в котором строится весь кадр, перед выводом на экран, созданный в памяти видеокарты); X - точка копирования заднего фона по-X (от куда начинать копировать); Y - точка копирования заднего фона по-Y; W - ширина области копирования (по этим данным строится область копирования TRect типа); H - высота области копирования; ...следующие 3 поверхности должны быть одного размера и созданы заранее в системной памяти... DDS7Source - поверхность текстуры IDirectDrawSurface7; DDS7Mask - поверхность маски IDirectDrawSurface7; DDS7Buf - поверхность буфера IDirectDrawSurface7; Пробуйте, ...пишите в этой теме отзывы.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Последний раз редактировалось Beermonza; 15.04.2008 в 22:55. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
подключение DirectDraw | g@mbler | Общие вопросы Delphi | 1 | 09.11.2006 20:18 |