![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Фон в 3D игре [Delphi, Windows, DirectX (Direct3D)]
Колбасьев © (2004-08-21 18:13:00)Как нарисовать фон, т.е. чтобы картинка рисовалась как в DirectDraw и позади трехмерной сцены? Видел например в PowerDraw есть команда SetBackground, а как это сделать в просто DirectX?
Надо нарисовать, не используя квадрат, поставленный на большом расстоянии.
NailMan (2004-08-24 13:35:00) [1]Колбасьев ©
HUD-а пока нет. Именно он есть вершина одновызовного рендера всех элементов. Я сейчас над ним упорно работаю.
Сцылка вот: http://nailman.cyborghome.ru/ut_tech_demo.htm
---
WBR, NailMan aka 2:5020/3337.13
Колбасьев (2004-08-23 12:56:00) [2]
> > Раньше!
>
> Почему? Ведь нарисованное позже без буфера глубины и видно
> будет "поверх" остального.
> У меня правда ни так, ни так не видно. Если раньше, то мелькнет
> 1 раз, и все. Позже - вообще ноль эффекта.
Тьфу... Раньше - если фон, точно. А позже - если интерфейс.
Кое-что подправил. Все рисуется. Всем большое спасибо!!!
Колбасьев (2004-08-23 11:41:00) [3]Спасибо. У тебя нет демки чего-нибудь твоего. Посмотреть бы...(если конечно не жалко).
NailMan (2004-08-22 23:56:00) [4]Как и было сказано, надо юзать именно RHW-формат вершины. Отрнасформированным этот формат естественно считается в экранных координатах. отрансформированными и освещенными заодно.
Разрешение узнать как 2-пальца об асфальт - ты же при создании девайса сам и задаешь их. Если тебе надо иметь независимые координаты(независимо от разрешения), то тебе потребуется придумать какие-то свои относительные координаты и переводить экранные в них и обратно, но это имхо лишний гемор и тормоз.
SetProjectionMatrix(matProj, 1, 1, 0.01, 20);
Если ты в проекте не будешь применять нетрансформированные примитивы(обычные или нормальные 3Д-примитивы), то можешь матрицы камеры вообще не устанавливать - нафиг надо.
Что касаемо цифер 0.01 и 20 - Это никак NearClip и Farclip? Если да, то newarclip Не должен быть менее 1, а farclip любой удобоваримый(ну не больше нескольких миллионов ;-) ). При таких маленьких значениях nearclip возможны некислые глюки с отсечениями.
Что касаемо важности RHW - обязательно надо ставить в "1". Фактически это флаг который указывает что ты юзаешь именно оттрансформированные и освещенные в экранном пространстве вершины.
Z-можно не выключать, а пользоваться этой халявой для блендинга.
Скажем быстрей всего будет рисовать(вызывать DrawPrimitive) не поквадно(по 2 треугольника образующих квад), а максимальное число квадов имеющих одну текстуру. Скажем я в своем GUI юзаю свой класс экранного спрайта. Когда я хочу отисовать какой-то элемент меню с большим числом кучсочков, я лочу вертекс-буфер(формат ессно RHW), добавляю в него квады, анлочу и вывожу все треугольники(их число при добавлении суммируется) одним вызовом DrawPrimitive.
Но в чем фишка Z-компоненты вершины в таком формате вершины? Да очень просто - эта компонента дает тебе возможность наслаивать элементы один на другой и пользовать блендинг в этом самом одновызовном рендеринге.
Скажем листбокс конструктивно у меня состоит из панели с рамкой и некоторых органов управления. При заполнении элементов панели(их около 10) в буфер спрайта я ему задаю Z=1(панель является подложкой), а всем остальным задаю Z=0, и при одном вызове DrawPrimitive все между собой правильно блендится.
Еще очень наглядно у меня эта фича реализована в подслойке моих менюшек - там 3 слоя с ползающими текстурами и у каждого слоя(один квад) своя Z координата. В итоге когда все блендится в одном вызове DrawPrimitive - это меньше тормозит нежели вызывать для каждого слоя (с одинаковыми Z) DrawPrimitive с тем же эффектом блендинга.
---
WBR, NailMan aka 2:5020/3337.13
Колбасьев (2004-08-22 21:18:00) [5]
> Раньше!
Почему? Ведь нарисованное позже без буфера глубины и видно будет "поверх" остального.
У меня правда ни так, ни так не видно. Если раньше, то мелькнет 1 раз, и все. Позже - вообще ноль эффекта.
> Пример: x = 0..800, y = 0..600. Как в DirectDraw.
Это, конечно, хуже, придеться разрешение экрана выяснять...
Могу и код примерный выложить.Там строк 20-ть... Но будет ли толк.
А насчет ФПС ни кто не подскажет?
Sapersky (2004-08-22 19:06:00) [6]рисую (позже всего остального)
Раньше! И если используешь формат, который я здесь приводил, поставь белый цвет ($FFFFFFFF).
1 в x и y равна размеру экрана по осям?
Пример: x = 0..800, y = 0..600. Как в DirectDraw.
z = 0..1 - слои?
Значение, которое пишется в Z-буфер. Лучше отключить Z-буфер и не думать (т.е. ставить любое).
и что такое rhw?
Не помню толком. Но оно надо. И оно дожно быть равно 1.
Что конкретно значит "с трансформированными вершинами"
RTFM. Help к DX SDK или Краснова (есть на d3dengine.narod.ru ).
cyborg (2004-08-22 08:43:00) [7]Отключаешь Z буффер, рисуешь прямоугольник, включаешь Z буффер.
Darthman (2004-08-21 22:17:00) [8]Ты, как я понял в Direct3D делаешь? В OpenGL я бы тебе сразу кодом подсказал как сделать, там не проблема это... Директ3Д нелюблю и не пользую просто.
Колбасьев (2004-08-21 20:51:00) [9]Что-то ничего не рисуется... Заполнил буффер, установил текстуру, рисую (позже всего остального). Ничего...
1 в x и y равна размеру экрана по осям? z = 0..1 - слои? и что такое rhw?
Что конкретно значит "с трансформированными вершинами" (как они трансформированы %-|)?
Колбасьев (2004-08-21 20:22:00) [10]Сейчас проверю... Вроде то - спасибо.
Sapersky (2004-08-21 20:14:00) [11]Как нарисовать фон, т.е. чтобы картинка рисовалась как в DirectDraw и позади трехмерной сцены?
Использовать формат с трансформированными вершинами, например, такой:
Type
TSprVertex = record
x, y, z, rhw : Single;
c : DWord;
u, v : Single;
end;
Const
SprVertexDesc = D3DFVF_XYZRHW or D3DFVF_DIFFUSE or D3DFVF_TEX1;
x и y задавать в оконных (экранных) координатах. Значение z в диапазоне 0..1, влияет только на z-буфер. rhw должно быть равно 1.
Рисуется как обычно, но никакие матрицы на это дело, естественно, не влияют.
Колбасьев (2004-08-21 20:04:00) [12]Поподробнее, что-то не дошло...
Надо на расстоянии от себя по направлению взгляда рисовать на двух треугольниках, составляющих квадрат?
А как определить размеры квадрата (в графике (и ее матричной геометрии) я на ас)?
И еще вопрос (по моему я его уже задавал, но, увы, остался без ответа):
У меня игровое поле 50х50 клеток, по 2-а треугольника в
каждой :-) , => 2500х2х3 = 1500 вершин.
И я устанавливаю:
SetProjectionMatrix(matProj, 1, 1, 0.01, 20);
Других объектов нет, а FPS примерно 34-35. У меня GeForce 2, P3 733 МГц. По моему FPS маленькое. Раньше (но не при таком матрице проекции, вместо 20 10 :-|) было 101-102 (хотя полигонов было несколько тысяч).
Вопрос: От чего вообще зависит FPS и сильно уменьшается?
Darthman (2004-08-21 19:25:00) [13]правильно, надо использовать как квадрат в ортогональной проекции, потом очистить z buffer и рисовать что тебе надо, картинка будет позади.