|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
29.06.2009, 16:42 | #1 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
Mini 2D engine. Delphi и Direct3D
Буду делать 2D движок для начинающих!
И так, движок является обверткой на Direct3D и очень прост в освоении. Для его работы нужно скачать DirectX модули и установить DirectX 9c. Скачать необходимые модули можно с этого сайты: http://clootie.ru/delphi/download_dx92.html#Headers http://clootie.ru/delphi/DX92/Clootie_DirectX92.exe - прямой линк на библиотеки http://clootie.ru/delphi/DX92/Clootie_DX92_dlls.zip - прямой линк на необходимые динамические библиотеки Тестовая версия на работоспособность. Справка по функциям: function D3DXInit(hWnd: THandle; iWidth, iHeight: Integer; FullScreen: Boolean; vSync: Boolean):Boolean; Функция инициализации Diretc3D на окно. hWnd: THandle; - дескриптор окна iWidth, iHeight: Integer; - высота и ширина системы координат(не обязательно размеры окна) FullScreen: Boolean; - полноэкранный/оконный режимы vSync: Boolean - вертикальная синхронизация function LoadTextureFromFile(FileName: string; var Texture: IDirect3DTexture9; ColorKey: DWORD): boolean; Функция для загрузки текстуры из файла FileName: string; - путь к текстуре var Texture: IDirect3DTexture9; - текстура ColorKey: DWORD - прозрачный цвет $FF000000 - черный $FFFFFFFF - белый и все промежуточные, формат AARRGGBB, 0 - нет прозрачного цвета procedure ResetVievPort(iWidth, iHeight: integer); Если размеры формы изменились, то нужно рассчитать систему координат заново. Код:
Код:
Рисование текстуры на экране x1,y1,x2,y2: Real; - левый верхний и правый нижний угол Texture: IDirect3DTexture9 - текстура procedure DrawRect(x1,y1,x2,y2: Single; u1,v1,u2,v2: Single; Texture: IDirect3DTexture9); Более сложный вариант рисования текстуры. u1,v1,u2,v2: Single; - текстурные координаты (вся текстура 0,0,1,1)(лева верхняя четверть 0,0,0.5,0.5) Добавятся функции поворота координатной сетки для поворота картинок и функции переноса координатной сетки. Аналоги glRotate и glTranslate. Прямая работа с пикселями текстуры, вывод текста и еще что нибудь придумаю. В архиве пример с библиотекой(mini2d.pas). |
29.06.2009, 20:01 | #2 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
Собственно что я за это время успел добавить.
Это 3 новые ф-ии для вывода спрайтов на экран: Код:
Выводит повернутый прямоугольник с текстурой на угол angle относительно центра прямоугольника. procedure DrawRotateRect(x1,y1,x2,y2: Single; u1,v1,u2,v2: Single; angle: single; Texture: IDirect3DTexture9); Тоже самое, но с возможностью задать текстурные координаты procedure DrawEx(x1,y1,x2,y2: Single; u1,v1,u2,v2: Single; ox,oy,angle: single; Texture: IDirect3DTexture9); Это самая главная функция вывода на экран, все остальные ф-ии обращаются именно к ней. ox,oy,angle: single; - угол на который нужно повернуть спрайт относительно точки ox,oy Код:
procedure DXLoadIdentity(); Улучшил расчет матрицы проекции. Дальше, еще круче, добавлю возможность устанавливать различные типы прозрачности спрайтов и наконец добавлю вывод текста =) Немного самопиара =) Звезды загружены из bmp файла и не имеют альфа, а взрыв вообще из jpg, но они прозрачны. Это достигается путем сложения цветов. Когда добавлю простеский способ вывода векторных шрифтов, выложу модуль( и тут я пропал на вечно...=)) И еще немного пиара, никаких посторонних dll таскать не нужно, кроме тех что нужны непосредственно самому Direct3D. Последний раз редактировалось Kostia; 29.06.2009 в 21:01. |
03.07.2009, 17:34 | #3 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
И так, документы во все вузы поданы остается только ждать, по моему, это сложнее, чем сдавать сами экзамены.
И так, я добавил возможность использования GDI шрифтов, но это еще не конечный вариант и параметры функций могут претерпеть изменения. Еще я изменил функцию инициализации, теперь стало немного меньше параметров и больше возможностей. function DXInit(hWnd: THandle; iWidth, iHeight: Integer; Flag: DWORD):Boolean; Новый параметр, который заменил старый: Flag: DWORD; Он принимает 3 различных флага инициализации: DXHARDWARE - аппаратное ускорение/если не возможно, то будет включено SoftWare DXVSYNC - включает вертикальную синхронизацию DXFULLSCREEN - полноэкранный режим Примерно она теперь выглядит так: DXInit(pWnd, 640, 480, DXHARDWARE or DXVSYNC); Шрифты. Новый тип DXFont, синоним ID3DXFont. Для создания необходимого шрифта используется функция: procedure DXCreateFont(Height: integer; Italic: boolean; Bold: boolean; FontName: pChar; var ppFont: ID3DXFont); Height: integer; - размер шрифта, чем больше значение, тем меньше шрифт Italic: boolean; Bold: boolean; - и так понятно FontName: pChar; - имя шрифта, например 'Arial' ppFont: ID3DXFont - собственно интерфейс самого шрифта Для вывода такста используется функция: procedure DXOutText(Text: string; R: TRect; Color: DWROD; ppFont: ID3DXFont); Text: string; - текст для вывода R: TRect; - область для вывода, текст будет сам делиться на строки при выходе за его границы Color: DWROD; - цвет шрифта, включая и задействовав альфу ppFont: ID3DXFont - сам шрифт DXOutText('FPS: '+IntToStr(ffps), Rect(0,0,60,20),$aaFFFFFF, Font); Теперь об особенностях некоторых доработок. 1. Скорость вывода увеличилась в разы(я сначала немного не тот флаг указал при инициализации, промазал). 20000 спрайтов + смешивание дает ~12 кадров/с 10000 спрайтов + смешивание дает 22-25 кадров/с 1000 спрайтов + смешивание дает 235 кадров/с 100 спрайтов + смешивание дает 2100-2200 кадров/с 10 спрайтов + смешивание дает 10000-11000 кадров/с. На моей машине. 2.Новая функция для рисования прямоугольника определенного цвета с учетом установленного типа смешивания. procedure Rectangle(x1,y1,x2,y2: Single; Color: DWORD); В архива новая версия библиотеки и пример. Последний раз редактировалось Kostia; 03.07.2009 в 17:37. |
03.07.2009, 18:38 | #4 |
Участник клуба
Регистрация: 06.03.2009
Сообщений: 1,346
|
Интересная работа. Как будет функционал побольше может ознакомлюсь .
|
04.07.2009, 15:44 | #5 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
Уф, многое доработал!
Производительность увеличилась в 1,5 раза и теперь при 30000 спрайтах 12 fps. Данное увеличение связано с переходом на матричные преобразования. Добавил проверку на потерю устройства. function DXTest: HRESULT; Эта функция возвращает все возможные ошибки, в том числе потерю поверхности и возможность восстановления устройства. Код:
procedure DXResetDevice(); Сброс устройства, используйте исключительно при DXERR_DEVICENOTRESET Добавил новую функция для изменения координатной сетки: procedure DXScale(x,y: single); Я ужу говорил, что все преобразования происходят опираясь на предыдущие, поэтому внимательно следите или просто сбрасывайте все настройки DXLoadIdentity Изначальный масштаб 1:1 DXScale(0,0); - без всяких изменений DXScale(-0.5,-0.5); - в 2 раза меньше DXScale(1,1); - в 2 раза больше Также претерпели изменения функции для работы со шрифтами. procedure DXCreateFont(Height: integer; Flag: DWORD; FontName: pChar; var ppFont: ID3DXFont); Я объединил italic и bold во флаги. Теперь чтобы включить все стили нужно указать Flag = DXFONT_ITALIC or DXFONT_BOLD; Также были добавлены функция добавления новых шрифтов из файла. function DXAddFontResource(FilaName: string): string; FilaName: string - имя файла шрифта Функция возвращает имя самого шрифта procedure DXReleaseFontResource(FilaName: string); Удаление шрифта И да еще вы можете узнать статус смешивания: BlendingState: DWORD = 0; // DXZEROALPHA or DXONEALPHA or DXSRCALPHA и ширину и высоту буфера: BufferWidth, BufferHeight: Integer; При изменении размеров формы будет портиться качество, т.к. размер буфера остается прежним, но матрица проекции позволит использовать все пиксели окна. В следующей версии, постараюсь реализовать смену режимов на ходу(fullscrean/windowed). Постараюсь решить проблему связанную с задним буфером. И добавлю возможность упрощенного использования растровых шрифтов. В архиве только библиотека. Последний раз редактировалось Kostia; 04.07.2009 в 19:42. |
08.07.2009, 01:25 | #6 |
Форумчанин
Регистрация: 05.01.2009
Сообщений: 130
|
Насчёт оптимизации, советывал бы прочитать законы оптимизации по версии Фленова М.
всех благ)
В жизни нет reset'а, а жаль...
|
08.07.2009, 18:10 | #7 | |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
Цитата:
В общем хочется сделать много и времени выложить новую версию я все не находил. Теперь поменялось многое добавил сглаживание, фильтрацию текстур, создание winapi окна, определение поддерживаемых режимов... И так изменилась функция инициализации, теперь можно указать уровень сглаживание. function DXInit(hWnd: THandle; iWidth, iHeight: Integer; Flag: DWORD; MultiSampleFlag: DWORD):Boolean; MultiSampleFlag: DWORD - флаг сглаживания 0 - нет сглаживания Вот список всех флагов: Код:
procedure DXAntialiasing(Flag: DWORD); 1 - вкл. 0 - выкл. Добавил возможность выбора фильтрации текстуры: procedure DXTextureFilter(Flag: DWORD); Код:
Добавил работу с растровым текстом. У вас должна быть текстура и файл с данными о шрифте. Поля текстового файла информации: 1 - Полное или краткое имя текстуры 2 - прозрачный цвет, допускается указание без и с альфа каналом 3 и 4 - ширина и высота 5 - Алфавит, все буквы по порядку, как они нарисованы 6 - текстурные координаты в пикселях для каждой буквы, TRect procedure DXLoadRasterFont(infoName: string; var RFont: DXRasterFont); procedure DXOutRasterText(Text: String; x,y: Single; Size: single; Color: DWORD; Flag: DWORD; RFont: DXRasterFont); Флаг DXRFONT_BREAK = 1; авто переход на следующую строку при выходе за правую границу окна. Работает коряво! Поэтому ставим 0 и не паримся. Утилиту для составления растрового шрифта из векторного и из кусочков(например нарисованных в photoshop) напишу позже. И да сам модуль выложу тоже чуть позже. Пример работы с растровым текстом + новая библиотека движка для упрощенной работы с WinAPI окном. Последний раз редактировалось Kostia; 08.07.2009 в 20:08. |
|
09.07.2009, 15:19 | #8 |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
Простите за оффтоп. Костя, а в связи с чем на аватарке логотип Убунту? Начал программить под линукс?
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)
Проверь себя! Онлайн тестирование | Мой блог |
09.07.2009, 15:40 | #9 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
Угу, любитель Си и бесплатного софта=). А Ubuntu мой любимый дистрибутив, в KDE были проблемы с драйвером для видеокарты с поддержкой CUDA, или у меня просто кривые руки, но на Убунту все стразу встало.
--------------- Сейчас ковыряю книжку по ассемблеру, ищу способы оптимизации, еще возможно добавлю выбор, использовать процессор для задания вершин и текстурных координат или шейдер(если напишу, еще не разу не работал), производительность в случае шейдера должна увеличиться на порядок. И да если будет время, то напишу справку по функциям. |
11.07.2009, 14:36 | #10 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
Веду активную оптимизацию работы с графикой. Добавил способ реализации системы частиц, а именно вывод большого кол-ва точек с текстурой.
200000 частиц ~25 кадров/секунду. Достиг такого результата благодаря распараллеливанию работы процессора и видеокарты. Разбил буфер вершин на сегменты по 200 вершин, всего 5 сегментов(~20кб он занимает в памяти). Когда видеокарта ведет рендеринг сегмента, процессор копирует новую партию вершин в следующий сегмент.(так на заметку) Вывод обычных спрайтов тоже ускорился. 20000 спрайтов 31 кадров/секунду. Посмотрим, может еще что оптимизирую... procedure DXDrawParticles(const ParticleArray: PChar; N: integer; const Texture: IDirect3DTexture9); Процедура для рисования массива частиц с текстурой. Каждый элемент массива должен быть 20байт, или проще? такого типа: Код:
Код:
Плохо то, что точку нельзя поворачивать, и задать текстурные координаты. В архиве только 2 библиотеки. |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Уроки по использованию Direct3D в Delphi | Kostia | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 32 | 23.02.2010 17:48 |
Перспектива в Direct3D | Ulex | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 2 | 11.03.2008 01:04 |
Aquatica engine | MagicIndie | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 4 | 23.04.2007 18:33 |