Текущий архив: 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.5 MB
Время: 0.048 c