Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.091 c
1-1180845039
Hyrsa
2007-06-03 08:30
2007.08.12
Иконки


2-1184337631
Kolan
2007-07-13 18:40
2007.08.12
TPageControl в TScrolBox е какие есть варианты реализации?


2-1184093695
Ivolg
2007-07-10 22:54
2007.08.12
Вывести Hint в определенных координатах


4-1172489276
MEV
2007-02-26 14:27
2007.08.12
дамп памяти процесса


2-1184515931
Zagaevskiy
2007-07-15 20:12
2007.08.12
Язык системы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский