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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2009, 17:03   #21
antonyLW
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 19
По умолчанию

в уроках 3 и 5 не грузятся текстуры...грузится только в единственном примере - где у куба есть круглые вогнутости (хз как правильно назвать)
antonyLW вне форума Ответить с цитированием
Старый 16.06.2009, 12:23   #22
Maxs
Заблокирован
 
Регистрация: 06.04.2009
Сообщений: 130
По умолчанию

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

Последний раз редактировалось Maxs; 16.06.2009 в 18:50.
Maxs вне форума Ответить с цитированием
Старый 16.06.2009, 19:36   #23
Maxs
Заблокирован
 
Регистрация: 06.04.2009
Сообщений: 130
По умолчанию

У меня возник вопрос: как в уроке 3 про рисование треугольника добавить еще один треугольник? В линиях - понял (расширить массив и поменять число примитивов. Здесь же это не помогает).
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Direct3D9, D3DX9,DXFunc, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormActivate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TCustomVertex = packed record
    x,y,z,rwh: Single;
    color: DWORD;
end;

var
  Form1: TForm1;
  pD3D: IDirect3D9=nil;
  pD3DDevice: IDirect3DDevice9=nil;

  VertexBuf: IDirect3DVertexBuffer9; // буфер вернин


implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
const
  Pixel:array[0..2]of TCustomVertex = (
  (x: 50; y:50;  z:0; rwh:1; color: $000000FF),
  (x:250; y:250; z:0; rwh:1; color: $0000FF00),
  (x: 50; y:250; z:0; rwh:1; color: $00FF0000)
   );
var
  pPixel,pPixel1:Pointer;
begin
  DX3DInit(pD3D,pD3DDevice,Form1.Handle,640,480,D3DFMT_A8R8G8B8,False);

  pD3DDevice.CreateVertexBuffer(SizeOf(Pixel),0, D3DFVF_XYZRHW or D3DFVF_DIFFUSE,
                                D3DPOOL_DEFAULT,VertexBuf,nil);
  //блокировка доступа к буферу вершин
  VertexBuf.Lock(0,SizeOf(Pixel),pPixel,1);
  //копируем в буфер данные
  CopyMemory(pPixel,@Pixel,SizeOf(Pixel));
  //разблокировка буфера
  VertexBuf.Unlock;

  Timer1.Enabled:=true;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  pD3D:=nil;
  pD3DDevice:=nil;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  // чистим устройство
  pD3DDevice.Clear(0,nil,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1,0);
  //начало сцены
  pD3DDevice.BeginScene;
  //связываем буфер вершин с потоком данных устройства
  pD3DDevice.SetStreamSource(0,VertexBuf,0,SizeOf(TCustomVertex));
  //устанавливаем формат вершин
  pD3DDevice.SetFVF(D3DFVF_XYZRHW or D3DFVF_DIFFUSE);
  //рисуем примитив
  pD3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
  //завершаем сцену
  pD3DDevice.EndScene;

  //переключение буферов
  pD3DDevice.Present(nil,nil,0,nil);
end;

end.
И про текстуры: почему то не показывает. Не только у меня.

Последний раз редактировалось Maxs; 16.06.2009 в 20:11.
Maxs вне форума Ответить с цитированием
Старый 17.06.2009, 09:12   #24
Maxs
Заблокирован
 
Регистрация: 06.04.2009
Сообщений: 130
По умолчанию

Тот квадрад с текстурой (mesh). Не грузит модель. Говорит Could not find mesh\1.x Я уж всяко пробовал, даже в самом файле DXFunc.pas где функция LoadMesh ставил имя файла напрямую с диска С(Туда загрузил файл). Похоже дело не в файле . Видимо где-то в другом месте, т.к. в функция LoadMesh выводит это сообщение если один из параметров неверен. Вот тот код при загрузке модели:
Код:
if FAILED(D3DXLoadMeshFromX(PChar(FileName), D3DXMESH_SYSTEMMEM,
                              ppiD3DDevice9, nil,
                              @pD3DXMtrlBuffer, nil, @dwNumMaterials,
                              ppMesh)) then
  begin
    if FAILED(D3DXLoadMeshFromX(PChar('..\'+FileName), D3DXMESH_SYSTEMMEM,
                                ppiD3DDevice9, nil,
                                @pD3DXMtrlBuffer, nil, @dwNumMaterials,
                                ppMesh)) then
    begin
      MessageBox(0, pChar('Could not find '+FileName), '', MB_OK);
      Exit;
    end;
  end;
Если убрать выход в случае False, то далше пишет ту страшную ошибку про чтение из памяти.
Maxs вне форума Ответить с цитированием
Старый 19.06.2009, 19:42   #25
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

В Direct3D нет тех glBegin(); glEnd(); И это немного затрудняет его первоначальное понимание, но и в opengl использование этих функций приводит только к потери скорости.
Для вывода вершин нужно использовать массив и отправлять данные сразу пачкой. В Direct3D только так и в OGL 3.0 тоже.
Раз он не показывает текстуры, это значит, что он и их не находит и этому подтверждение не нахождение модели. Попробуй положить модель в C:\ и указать полный путь"C:\1.x".
А ошибка возникает потому, что модель не загружена, память для массива не выделена, а мы пытаемся это еще и нарисовать
Kostia вне форума Ответить с цитированием
Старый 19.06.2009, 23:10   #26
Maxs
Заблокирован
 
Регистрация: 06.04.2009
Сообщений: 130
По умолчанию

Цитата:
Сообщение от Kostia Посмотреть сообщение
В Direct3D нет тех glBegin(); glEnd(); И это немного затрудняет его первоначальное понимание, но и в opengl использование этих функций приводит только к потери скорости.
Для вывода вершин нужно использовать массив и отправлять данные сразу пачкой. В Direct3D только так и в OGL 3.0 тоже.
Раз он не показывает текстуры, это значит, что он и их не находит и этому подтверждение не нахождение модели. Попробуй положить модель в C:\ и указать полный путь"C:\1.x".
А ошибка возникает потому, что модель не загружена, память для массива не выделена, а мы пытаемся это еще и нарисовать
Я же писал что так пробовал (С:\1.x). Про добавление второго куба у меня так и не получилось Я не понял как их так сразу "пачкой" отправлять. Напиши как это, плз.

Последний раз редактировалось Maxs; 19.06.2009 в 23:13.
Maxs вне форума Ответить с цитированием
Старый 20.06.2009, 08:57   #27
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Честно я уже забил на использование DirectX и Delphi - уж очень сильно извращаться приходилось и перешел на Си и OpenGL. И извращаться стало проще - в Си методов больше =)
И на OpenGL можно более наглядней понять все тонкости работы с 3D.

А вообще попробуй сам написать загрузчик моделей, хороший формат - это *.obj.
Постараюсь написать небольшой урок по загрузки 3D модели из файла.
Kostia вне форума Ответить с цитированием
Старый 20.06.2009, 09:39   #28
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Самое первое что хочу пояснить - это матрицы проекции. Существует несколько способ задать матрицу. Ее можно задать ортогональную или перспективную и определить направление оси Z.
D3DXMatrixPerspectiveFovLH(matProje ction, pi/4, Aspect, 0.1, 2000.0);
Задает перспективную матрицу
Параметры:
1. Сама матрица
2. Где-то читал, что это какой угол обзора или что там, но при 45 градусах картинка редрерится самая хорошая, при изменение этого параметра можно получить это:

3. Обычно width/height, можно сказать, что определяет систему координат, например, если указать 1, то вся форма будет иметь координаты (-1;-1; 1;1) и не важно квадратная она и вытянутая, таким образом меняются пропорции 3D объектов.
4 и 5 передняя и задняя плоскости отсечениея, т.е. ближе и дальше указанных глубин ничего рисоваться не будет.

Чтобы все было OK, нужно пересчитывать матрицу проекции при изменении размера окна:

Код:
procedure TForm1.FormResize(Sender: TObject);
var
  matProjection: D3DMATRIX;
begin
  if pD3DDevice<>nil then
  begin
    //D3DXMatrixOrthoLH(matProjection,ClientWidth,ClientHeight,0.1,1000);
    D3DXMatrixPerspectiveFovLH(matProjection, pi/4, ClientWidth/ClientHeight, 0.1, 2000.0);
    pD3DDevice.SetTransform(D3DTS_PROJECTION, matProjection);
  end;
end;
Теперь ортогональная настройка.
D3DXMatrixOrthoLH(matProjection,Cli entWidth,ClientHeight,0.1,1000);

1. Сама матрица
2 и 3 Ширина и высота системы координат, можно запросто установить замеры формы и после сдвинуть матрицу от центра в левый верхний угол, и мы получим координатную сетку как и всегда. И да ее еще перевернуть нужно:
Код:
D3DXMatrixOrthoLH(matProjection,ClientWidth,ClientHeight,0.1,1000);
matProjection._41:=matProjection._41-1;
matProjection._42:=matProjection._42+1;
matProjection._22:=-matProjection._22;
Но нужно точно понимать что означает каждый элемент матрицы, этой информации полно в интернете.
Kostia вне форума Ответить с цитированием
Старый 20.06.2009, 10:06   #29
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Теперь пара нюансов на счет задания вершин. К сожалению или к счастью в Direct3D есть интерфейс куда нужно загрузить все данные об вершинах и только через него можно выводить изображение на экран.
Код:
type
  TCustomVertex = packed record
    x,y,z: Single;
    color: DWORD;
end;

var
VertexBuf: IDirect3DVertexBuffer9;

procedure TForm1.FormActivate(Sender: TObject);
const
  Pixel:array[0..2]of TCustomVertex = (
  (x: 0; y:0; z:1; color: $000000FF),
  (x: 100; y:0; z:1; color: $0000FF00),
  (x: 0; y:100; z:1; color: $00FF0000)
   );
var
  pPixel:Pointer;
begin
  DX3DInit(pD3D,pD3DDevice,Form1.Handle,640,480,D3DFMT_A8R8G8B8,False);

  pD3DDevice.CreateVertexBuffer(SizeOf(Pixel),0, D3DFVF_XYZ or D3DFVF_DIFFUSE,
                                D3DPOOL_DEFAULT,VertexBuf,nil);

  VertexBuf.Lock(0,SizeOf(Pixel),pPixel,0);

  CopyMemory(pPixel,@Pixel,SizeOf(Pixel));

  VertexBuf.Unlock;

  Timer1.Enabled:=true;
end;
В Direct3D нужно точно помнить в какую сторону нужно задавать вершины. Для того чтобы вы видели грань перед собой, то вершины нужно задавать против часовой стрелки, а т.к. я перевернул матрицу проекции в прошлом посту, то их нужно задавать по часовой стрелки.

Но для того чтобы нарисовать квадрат, можно задавать вершины буквой Z, точно также как она и пишется.

Код:
procedure DrawQuadrate(Rect: TRect);
var
  pPixel:Pointer;
  Quad: array[0..3]of TCustomVertex;
begin
  Quad[0].x:=Rect.Left;
  Quad[0].y:=Rect.Top;
  Quad[0].z:=1;
  Quad[0].color:=$FF00FF00;

  Quad[1].x:=Rect.Right;
  Quad[1].y:=Rect.Top;
  Quad[1].z:=1;
  Quad[1].color:=$FF00FF00;

  Quad[2].x:=Rect.Left;
  Quad[2].y:=Rect.Bottom;
  Quad[2].z:=1;
  Quad[2].color:=$FF00FF00;

  Quad[3].x:=Rect.Right;
  Quad[3].y:=Rect.Bottom;
  Quad[3].z:=1;
  Quad[3].color:=$FF00FF00;

  VertexBuf.Lock(0,SizeOf(Quad),pPixel,0);
  CopyMemory(pPixel,@Quad,SizeOf(Quad));
  VertexBuf.Unlock;

  pD3DDevice.SetStreamSource(0,VertexBuf,0,SizeOf(TCustomVertex));
  pD3DDevice.SetFVF(D3DFVF_XYZ or D3DFVF_DIFFUSE);
  pD3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
end;
Полный пример с комментариями в архиве.
Вложения
Тип файла: rar Triangle.rar (15.1 Кб, 48 просмотров)
Kostia вне форума Ответить с цитированием
Старый 20.06.2009, 10:16   #30
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Код:
pD3DDevice.CreateVertexBuffer(SizeOf(TCustomVertex)*4,0, D3DFVF_XYZ or D3DFVF_DIFFUSE,
                                D3DPOOL_DEFAULT,VertexBuf,nil);
Если вы будите делать 2D игру, то достаточно только одного буфера для хранения 4х вершин, а потом просто записывать в него новые данные.
PS. В OpenGL все гораздо проще и удобнее сделано.
Код:
pD3DDevice.SetStreamSource(0,VertexBuf,0,SizeOf(TCustomVertex));
Эта функция связывает буфер вершин с потоком данных. В ней указываем сам буфер и кол-во байт на одну ячейку.
Код:
pD3DDevice.SetFVF(D3DFVF_XYZ or D3DFVF_DIFFUSE);
Эта ф-ия устанавливает формат одной вершины
D3DFVF_XYZ - говорит что в одной ячейки имеется 3 float координаты(single для delphi)
D3DFVF_DIFFUSE - и еще что есть у этой вершины цвет.
Код:
pD3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
Рисует примитив
D3DPT_TRIANGLESTRIP - указывает на то, что модель состоит из треугольников
0 - номер вершины с которой нужно начинать
2 - кол-во примитивов(треугольников)

Про флаги размещения в памяти можно прочесть тут http://www.nestor.minsk.by/kg/2008/46/kg84602.html

Последний раз редактировалось Kostia; 20.06.2009 в 10:26.
Kostia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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