Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2008, 06:15   #11
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Описание структуры TD3DLight9.
_Type - тип источника света
D3DLIGHT_POINT - точечный источник
D3DLIGHT_SPOT - прожекторный источник
D3DLIGHT_POINT - направленный источник света
Diffuse - диффузный (рассеиваемый) цвет
Specular - зеркальный цвет
Ambient - цвет окружающей среды
Position - позиция источника света
Direction - направление источника света
Range - дистанция, на который действует источник света
Falloff - уменьшение в соответствии между внутренним конусом и краем внешнего конуса
Attenuation0, Attenuation1, Attenuation2 - параметры затухания
Theta - угол в радианах, определяющий внутренний конус прожекторного источника света(от 0 до Phi)
Phi - угол в радианах, определяющий внешнюю границу внешнего конуса прожекторного источника света(от 0 до pi)
Kostia вне форума Ответить с цитированием
Старый 18.04.2008, 06:22   #12
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Немного по подробнее о реализации 2D в Direct3D.

В Direct3D есть специальный интерфейс для вывода изображения на экран(ID3DXSprite), но он сильно урезает возможности программиста, лучше написать вывод текстуры на экран на низком уровне.
Я приведу небольшой код для загрузки и вывода текстуры на экран.

Код:
type
  sVertexRHW=record
    x, y, z, RHW:Single;
    u,v:Single;
end;
x,y,z: положение вершины в экранных координатах
rhv: это число изменяется от 0 до 1 и представляет собой расстояние от точки просмотра до вершины.
u,v: текстурные координаты(1,1 вся текстура)

Код:
procedure LoadTextureFromFile(ColorKey:TD3DColor; FileName: String; out Texture: IDirect3DTexture9);
begin
  D3DXCreateTextureFromFileEx(pD3DDevice, pChar(FileName), 0, 0, 0,
    0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT,
    ColorKey, 0, nil, Texture);
end;
Загрузка текстуры из файла. Т.к большенство параметров взято по умолчанию, то напишем собственную процедуру.

procedure LoadTextureFromFile(
ColorKey:TD3DColor; // прозрачный цвет
FileName: String; //имя файла
out Texture: IDirect3DTexture9 //текстура
);

Не забудьте создать буфер вершин для вывода текстуры
Код:
//в глобальных переменных
var
  vBuffer: IDirect3DVertexBuffer9;
...
pD3DDevice.CreateVertexBuffer(sizeof(sVertexRHW) * 4,
        0, D3DFVF_XYZRHW or D3DFVF_TEX1,
        D3DPOOL_DEFAULT, vBuffer, nil);
Теперь непосредственно вывод текстуры на экран

Код:
Procedure DrawSprite(Texture:IDirect3DTexture9; Position: TRect;
                           Center: TPoint; RotateAngle: single);
var
  Quad : array [0..6] of sVertexRHW;
  pBuf:Pointer;
  x,y,r,xo,yo: Extended;
  s,c: Extended;
begin
  xo:=Center.X+Position.Left;
  yo:=Center.Y+Position.Top;

  r:=sqrt(sqr(Position.Left - xo) + sqr(Position.Top - yo));
  SinCos(RotateAngle + arctan2((Position.Top - yo), (Position.Left - xo)), s, c);
  x:=xo + r * c; y:=yo + r * s;
//x,y
  Quad[0].x:=x;
  Quad[0].y:=y;
  Quad[0].z:=0;
  Quad[0].u:=0;
  Quad[0].v:=0;

  r:=sqrt(sqr(Position.Right - xo) + sqr(Position.Top - yo));
  SinCos(RotateAngle + arctan2((Position.Top - yo), (Position.Right - xo)), s, c);
  x:=xo + r * c; y:=yo + r * s;
//w,y
  Quad[1].x:=x;
  Quad[1].y:=y;
  Quad[1].z:=0;
  Quad[1].u:=1;
  Quad[1].v:=0;

  r:=sqrt(sqr(Position.Left - xo) + sqr(Position.Bottom - yo));
  SinCos(RotateAngle + arctan2((Position.Bottom - yo), (Position.Left - xo)), s, c);
  x:=xo + r * c; y:=yo + r * s;
//x,h
  Quad[2].x:=x;
  Quad[2].y:=y;
  Quad[2].z:=0;
  Quad[2].u:=0;
  Quad[2].v:=1;

  r:=sqrt(sqr(Position.Right - xo) + sqr(Position.Bottom - yo));
  SinCos(RotateAngle + arctan2((Position.Bottom - yo), (Position.Right - xo)), s, c);
  x:=xo + r * c; y:=yo + r * s;
//w,h
  Quad[3].x:=x;
  Quad[3].y:=y;
  Quad[3].z:=0;
  Quad[3].u:=1;
  Quad[3].v:=1;

  Quad[0].RHW:=1;
  Quad[1].RHW:=1;
  Quad[2].RHW:=1;
  Quad[3].RHW:=1;
  Quad[4].RHW:=1;
  Quad[5].RHW:=1;
  Quad[6].RHW:=1;

  vBuffer.Lock(0, sizeof(sVertexRHW) * 4, pBuf, 0);
  move(Quad, pBuf^, sizeof(sVertexRHW) * 4);
  vBuffer.Unlock();

  pD3DDevice.SetStreamSource(0, vBuffer, 0, sizeof(sVertexRHW));
  pD3DDevice.SetFVF(D3DFVF_XYZRHW or D3DFVF_TEX1);
  pD3DDevice.SetTexture(0, Texture);
  pD3DDevice.SetRenderState(D3DRS_ALPHABLENDENABLE, 1);// включим альфу
  pD3DDevice.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
  pD3DDevice.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
  pD3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);//отобразим 2 треугольника
  pD3DDevice.SetRenderState(D3DRS_ALPHABLENDENABLE, 0);// отключим для оптимизации
end;
И да, незабудьте подключить библиотеки Direct3D и D3DX9.
Kostia вне форума Ответить с цитированием
Старый 18.04.2008, 06:47   #13
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Подробное описание функции для загрузки текстуры из файла.

Код:
function D3DXCreateTextureFromFileEx(
  Device: IDirect3DDevice9;
  pSrcFile: PChar;
  Width: LongWord;
  Height: LongWord;
  MipLevels: LongWord;
  Usage: DWord;
  Format: TD3DFormat;
  Pool: TD3DPool;
  Filter: DWord;
  MipFilter: DWord;
  ColorKey: TD3DColor;
  pSrcInfo: PD3DXImageInfo;
  pPalette: PPaletteEntry;
  out ppTexture: IDirect3DTexture9): HResult; stdcall; external d3dx9texDLL name 'D3DXCreateTextureFromFileExA';
Device - устройство Direct3D;

pSrcFile - имя или полный путь к графическому файлу.(форматы: BMP,DDS,DIB,JPG,PNG и TGA);

Width и Height - ширина и высота текстуры. Размеры текстуры должны быть кратные степени двойки(8*16,1024*1024,1024*512) иначе ваша программа на ветеранах не запустится. Если указать нули, то функция сама решит каких размеров создать текстуру;

MipLevels - количество уровней текстур, это значение определяет кол-во последовательностей текстур;

Usage - параметры использования;

Format - формат пиксела;

Pool - память, в которую будет помещена текстура. Для того чтобы произвести блокировку поверхности и изменить его на прямую нужно установить флаг D3DPOOL_MANAGED;

Filter - фильтр изображения;

MipFilter - уровень фильтрации;

ColorKey - цвет пиксела, который будет прозрачным, если указать 0, то прозрачного цвета нет;

pSrcInfo - структура в которую будет записана информация о загруженом файле;

pPalette - указатель на палитру;

ppTexture - указатель на текстуру;
Kostia вне форума Ответить с цитированием
Старый 18.04.2008, 07:12   #14
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Работа с текстурой напрямую.

Для начала научимся узнавать размеры текстуры.

Код:
var
  info: D3DSURFACE_DESC;
  x,y: integer;
begin
  texture.GetLevelDesc(0,info);
  for x:=0 to info.Width*info.Height do
...
Теперь давайте создадим текстуру и заполним ее полупрозрачным зеленым цветом.

Код:
var
  info: D3DSURFACE_DESC;
  text_rect: D3DLOCKED_RECT;
  dst: PDWordArray;
  Texture: IDirect3DTexture9;
begin
  pD3DDevice.CreateTexture(64, 64, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, Texture, nil);  
  Texture.LockRect(0,text_rect,nil,0);
  dst:=text_rect.pBits;
  texture.GetLevelDesc(0,info);
  for x:=0 to info.Width*info.Height do
    dst[x]:=D3DCOLOR_ARGB(150,0,255,0);
  Texture.UnlockRect(0);
...
Есть еще один способ задать альфу картинки. В редакторе в котором вы рисуете и сохранить изображение в формате поддерживающим альфу(bmp или tga например), тогда вам достаточно будет только загрузить картинку и вывести ее на экран.
Kostia вне форума Ответить с цитированием
Старый 02.05.2008, 09:17   #15
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию Скелетная анимация

К сожалению времени полностью разобрать данный пример у меня небыло и вам придется разбирать пример самостоятельно, если возникнут трудности, то спрашивайте.
И еще, это единственный рабочий пример который я смог найти в интернете, до него я скачивал кучу пример переведенных на Delphi с DX SDK, но больше половины просто не запускалось или выдавали ошибки.
В архиве Common находятся необходимые библиотеки для компиляции проекта.
В архиве Skin находится пример со всеми необходимыми ресурсами+exe'шник.
Изображения
Тип файла: jpg screen.jpg (6.0 Кб, 223 просмотров)
Вложения
Тип файла: rar Common.rar (276.6 Кб, 113 просмотров)
Тип файла: rar skin.rar (863.6 Кб, 139 просмотров)
Kostia вне форума Ответить с цитированием
Старый 08.05.2008, 12:30   #16
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
Смущение

D3D10 and Delphi and Windows XP = true

Наверняка это уже не тайна но всеже выложу все в одном комплекте.
Необходимые dll(игры под dx 10 пойдут на XP) и либы с туториалами для delphi.

В основном там одни сплошные интерфейсы для эффектов(шейдеров) и небольшие примеры реализации шейдеров 4-ой версии и как такового DX10 там нет.
Вложения
Тип файла: rar Clootie_DirectX10.rar (544.4 Кб, 90 просмотров)
Тип файла: rar DirectX-10.rar (863.0 Кб, 88 просмотров)
Kostia вне форума Ответить с цитированием
Старый 27.05.2008, 04:43   #17
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Огромное спасибо костя, я сегодня скачал примеры. Буду разбирать и смотреть. Если что я тогда вопросы буду задавать.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 08.04.2009, 15:49   #18
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

хорошийе примеры были наверное но сайт уже удалили с укоза где теперь взять уроки
IvaniuS вне форума Ответить с цитированием
Старый 08.04.2009, 18:21   #19
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

http://clootie.ru/delphi/download_dx92.html
Kostia вне форума Ответить с цитированием
Старый 28.04.2009, 18:55   #20
astr_al
 
Регистрация: 28.04.2009
Сообщений: 3
По умолчанию

Большая просьба приаттачить модули Direct3D.pas, D3DX9.pas.

Где ещё можно найти информацию по DirectX или OpenGL ? У меня стоит задача нарисовать многогранную пирамидку и перемещать её (отражение,масштабирование и т.п.).Может кто знает,как выполнить эту задачу с использованием других средств(в среде Delphi),учитывая,что в графике я 0

Заранее спасибо

Последний раз редактировалось astr_al; 28.04.2009 в 19:08.
astr_al вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Direct3D: создание карт и ландшафтов challengerr Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 02.05.2009 02:15
Перспектива в Direct3D Ulex Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 11.03.2008 01:04
вопрос по использованию конструкции if zetrix Microsoft Office Excel 0 31.10.2006 07:52