Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.12;
Скачать: CL | DM;

Вниз

Z-Буфер и полноэкранный режим   Найти похожие ветки 

 
Kobik.   (2006-09-07 10:45) [0]

Делаю 2д fullscreen игру на D5 + Direct3D8 (все еще по Краснову :) )
Вот процедура инициализации

procedure InitD3D(Handle:HWND);
var
 d3ddm : TD3DDISPLAYMODE;
 d3dpp : TD3DPRESENT_PARAMETERS;
begin
if FD3D = nil then FD3D := Direct3DCreate8(D3D_SDK_VERSION);
if FD3D = nil then
  begin
  log_write("Ошибка: После инициальзации FD3D = nil !!!");
  Exit;
  end;

FD3D.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, d3ddm);

ZeroMemory(@d3dpp, SizeOf(d3dpp));
with d3dpp do
  begin
  Windowed := false;
  SwapEffect := D3DSWAPEFFECT_DISCARD;
  EnableAutoDepthStencil:=true;
  AutoDepthStencilFormat:=D3DFMT_D16;
  BackBufferWidth:=1024;
  BackBufferHeight:=768;
  BackBufferFormat := d3ddm.Format;
  end;

FD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Handle,
                            D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                            d3dpp, FD3DDevice);
if FD3DDevice=nil then log_write("Ошибка: После инициальзации FD3DDevice = nil !!!")
                  else log_write("инициальзация IDIRECT3D8 удачно завершена");
end;


Добавил две строки (помечены //* ) поcле чего появилась ошибка. FD3DDevice = nil.
Хотя в оконном режиме работает.

Ну еще пробовал менять форматы, но это ничего не дает. Подскажиет, в чем ошибка?


 
Kobik.   (2006-09-07 10:46) [1]

блин, написал помечены, а пометить забыл =)

вот эти две строки:
 EnableAutoDepthStencil:=true;
 AutoDepthStencilFormat:=D3DFMT_D16;


 
XProger ©   (2006-09-07 11:12) [2]

D3DFMT_D8 устроит?


 
Kobik.   (2006-09-07 14:16) [3]

хех, да такого вроде и вообще нету =)

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

const
 D3DFMT_UNKNOWN              = 0;

 D3DFMT_R8G8B8               = 20;
 D3DFMT_A8R8G8B8             = 21;
 D3DFMT_X8R8G8B8             = 22;
 D3DFMT_R5G6B5               = 23;
 D3DFMT_X1R5G5B5             = 24;
 D3DFMT_A1R5G5B5             = 25;
 D3DFMT_A4R4G4B4             = 26;
 D3DFMT_R3G3B2               = 27;
 D3DFMT_A8                   = 28;
 D3DFMT_A8R3G3B2             = 29;
 D3DFMT_X4R4G4B4             = 30;

 D3DFMT_A8P8                 = 40;
 D3DFMT_P8                   = 41;

 D3DFMT_L8                   = 50;
 D3DFMT_A8L8                 = 51;
 D3DFMT_A4L4                 = 52;

 D3DFMT_V8U8                 = 60;
 D3DFMT_L6V5U5               = 61;
 D3DFMT_X8L8V8U8             = 62;
 D3DFMT_Q8W8V8U8             = 63;
 D3DFMT_V16U16               = 64;
 D3DFMT_W11V11U10            = 65;

 D3DFMT_UYVY = Byte("U") or (Byte("Y") shl 8) or (Byte("V") shl 16) or (Byte("Y") shl 24 );
 D3DFMT_YUY2 = Byte("Y") or (Byte("U") shl 8) or (Byte("Y") shl 16) or (Byte("2") shl 24 );
 D3DFMT_DXT1 = Byte("D") or (Byte("X") shl 8) or (Byte("T") shl 16) or (Byte("1") shl 24 );
 D3DFMT_DXT2 = Byte("D") or (Byte("X") shl 8) or (Byte("T") shl 16) or (Byte("2") shl 24 );
 D3DFMT_DXT3 = Byte("D") or (Byte("X") shl 8) or (Byte("T") shl 16) or (Byte("3") shl 24 );
 D3DFMT_DXT4 = Byte("D") or (Byte("X") shl 8) or (Byte("T") shl 16) or (Byte("4") shl 24 );
 D3DFMT_DXT5 = Byte("D") or (Byte("X") shl 8) or (Byte("T") shl 16) or (Byte("5") shl 24 );

 D3DFMT_D16_LOCKABLE         = 70;
 D3DFMT_D32                  = 71;
 D3DFMT_D15S1                = 73;
 D3DFMT_D24S8                = 75;
 D3DFMT_D16                  = 80;
 D3DFMT_D24X8                = 77;
 D3DFMT_D24X4S4              = 79;

 D3DFMT_VERTEXDATA           = 100;
 D3DFMT_INDEX16              = 101;
 D3DFMT_INDEX32              = 102;


 
Cash ©   (2006-09-07 14:41) [4]

Kobik.   (07.09.06 14:16) [3]:
А какой результат возвращает CreateDevice?
Я не про девайс, а про HResult.

16-ти битная глубина везде поддерживается, так что лучше ее юзать.
MultiSampleType в d3dpp чему равен?
А hDeviceWindow, там же? Без него он в полный экран не перейдет!

Чуится мне, что CreateDevice вернет это "-2005530516", это дескриптор
D3DERR_INVALIDCALL, он возвращается, если какой либо входной параметр
не соответствует допустимым значениям.


 
Kobik.   (2006-09-07 15:27) [5]

хех весело. Если я ничего не перепутал, то CreateDevice вернул D3DERR_OUTOFVIDEOMEMORY


 
Kobik.   (2006-09-07 15:34) [6]

Кошмар =) Оказывается просто не хватает видяхи на 8Мб. (У меня в ноуте интергированная, можно настраивать количество памяти - берет из оперативки). Поставил 32 и все заработало.

А без использования этого Z-буфера все без проблем шло, да и нормальные  игры не жаловались...


 
Cash ©   (2006-09-07 19:11) [7]

Kobik.   (07.09.06 15:34) [6]:
Во блин прикол! 8)
А все таки, ты hDeviceWindow выставляешь? или нет?


 
Kobik.   (2006-09-07 21:33) [8]

Да, зря я не обрабатываю ошибки. Так бы мог и сам сразу понять в чем дело. Ну ничего, сейчас буду исправляться... :)

hDeviceWindow не выставляю. Если сделать hDeviceWindow:=Handle; то ничего не изменяется. Или что туда вообще надо пихнуть? =)
А так hDeviceWindow=0 и все работает.

А этот Z-буфер тормозов добавил заметно, в моем случае оказалось проще без него сделать... (2D всетаки)


 
Cash ©   (2006-09-08 16:04) [9]

Ну ваще так: если ты юзаешь полноэкранный девайс, то hDeviceWindow
необходимо выставить на Handle твоего окна.
В противном случае, девайс сам захватит Handle активного окна.
И следует молиться, чтобы это окно было твоим! (я серьезно!)
Девайс на этот хендл рендерить будет.

А Present девайсу ты как вызываешь? там параметр hDestWindowOverride
вставляешь?

Про Z-buffer, эта вещь оправдана, если нет альтернативы, или если
юзаешь 3D. У тебя на ноуте эта функция видать не поддерживается
аппаратно.

Кста, тыж 2D делаешь, расскажи про свои форматы вершин.


 
Kobik.   (2006-09-09 14:12) [10]

1) Хмм. Ладно, спасибо. hDeviceWindow поставил.

2) FD3DDevice.Present(nil, nil, 0, nil); т.е. hDestWindowOverride опять = 0...
Тот же Handle окна нужен?

3) Формат вершин такой:
 TCUSTOMVERTEX = packed record
   X, Y, Z  : Single;
   nX, nY, nZ : Single;
   Color:DWORD;
   U, V: Single;
 end;

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


 
Cash ©   (2006-09-09 15:50) [11]

Kobik.   (09.09.06 14:12) [10]:
Тот же Handle окна нужен?
Не-е-е, если ты его в hDeviceWindow уже установил, то этого уже не надо,
девайс теперь точно знает на что надо рисовать. :)
Там ваще, одно из двух, либо hDeviceWindow, либо hDestWindowOverride
надо направлять на свой хендл. А то может чой ни то дурацкое вылезти.

Формат вершин такой:
То есть рендеришь в ортогональной проекции? 8-/
Бр-р-р. И при рендеринге ты девайсу задаешь в SetVertexShader дескриптор
этого формата?
То есть это: D3DFVF_XYZ or D3DFVF_NORMAL or D3DFVF_DIFFUSE or D3DFVF_TEX1.

И какой садюга тебя этому научил??? :)))

Там для чистого 2D есть формат позиции D3DFVF_XYZRHW, тогда вершина
должна содержать X, Y, Z, rhw координаты, последняя должна быть в 1.0,
а Z - варьироваться от 0.0 (близко) до 1.0 (далеко) (вот здесь и
понадобится Z-buffer, если хоцца).
RHW вершины нельзя совмещать с D3DFVF_XYZ или D3DFVF_NORMAL
форматами. (т. е. нормаль придется убрать, а свет - выключить, за то
будет работать быстрее).
А цветом вершин можно делать подсветку натягиваемой текстуры.


 
Cash ©   (2006-09-09 15:54) [12]

Да! и на RHW вершины не действуют методы SetTransform и т. д. у девайса.
А рендерятся они так, как через DDraw, т. е. самое что ни на есть 2D!
(Самый COOL для отрисовки интерфейса).


 
Kobik.   (2006-09-09 17:10) [13]

Да, точно так D3DFVF_CUSTOMVERTEX = D3DFVF_XYZ or D3DFVF_NORMAL or D3DFVF_DIFFUSE or D3DFVF_TEX1;
Никто не учил конечно, сам я до такого докатился =))

От света отказываться не очень хочется. Тем более при выводе текстур, которые не надо осещать я просто    SetRenderState(D3DRS_LIGHTING, DWORD (false));, вроде должна быть нормальная скорость вывода...

>А цветом вершин можно делать подсветку натягиваемой текстуры.  
Но ведь в D3DFVF_XYZRHW нет параметра цвета???  

>Да! и на RHW вершины не действуют методы SetTransform и т. д. у девайса.
Опять же, SetTransform очень удобно для разных эффектов (например приближение камеры) и вроде как должно работать быстрее, чем изменение координат вершин (где-то про это слышал)

----------------
Хм, может стоит для разных вещей использовать вершины разных типов? Когда-то уже задавал этот вопрос и мне ответили - не парься, пихай все в одно =)


 
Cash ©   (2006-09-09 19:29) [14]

> От света отказываться не очень хочется.
Т. е. 2D с подсветкой? Я в этом отношении взял DX9.c и шейдеры, скажу,
это более удобно, и SetTransform по своему (в шейдере) сделал, для RHW
вершин.

> Но ведь в D3DFVF_XYZRHW нет параметра цвета???
Гы-гы-гы, зато есть D3DFVF_DIFFUSE! юзай их через or и в запись вершины
клади D3DCOLOR Diffuse, или DiffuseColor: TColor.

> Хм, может стоит для разных вещей использовать вершины разных типов?
Это абсолютно верно! А те, кто так ответил... молчу... молчу...



Страницы: 1 вся ветка

Текущий архив: 2007.08.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.036 c
11-1150264932
MZUser
2006-06-14 10:02
2007.08.12
Создание DLL


15-1183967790
Kolan
2007-07-09 11:56
2007.08.12
Можно ли пределать файл помощи к простым клсамам?


2-1184326542
Romikremind
2007-07-13 15:35
2007.08.12
Проблемы с русским языком


9-1157313285
_Razor_
2006-09-03 23:54
2007.08.12
Текстурирование ландшафтов


2-1184267004
bagos
2007-07-12 23:03
2007.08.12
Как быть с такмими числами?