Computer Games Forum
 

Go Back   Computer Games Forum > Tech > The Workshop > Game Design

Notices

Căutare produse PC Garage: Şterge căutarea

Reply
 
LinkBack Thread Tools
Old 30-01-2007, 09:35   #1 (permalink)
Registered User
 
Join Date: Jan 2007
Talking DirectX D3D VC++ randarea obiectelor X, multiplicarea lor

Are cineva idee cum se randeaza de mai multe ori, in alte locatii un obiect X? Sa spunem ca l-am incarcat in memorie(obiectul X fiind o piatra) si...vreau sa imi pozitionez obiectul de 20 ori in diferite zone ale hartii create..adica fara sa il incarc de 20 de ori in memorie, doar sa il repozitionez si randez..?
 
MOica is offline    Reply With Quote
Old 30-01-2007, 10:25   #2 (permalink)
Registered User
 
andrei5008's Avatar
 
Join Date: Aug 2001
Location: Azeroth
După ce încarci obiectul în memorie (adica VB, texturi, setari render state-uri), aplezi DrawPrimitives de câte ori vrei tu. Şmecheria e să setezi Matricile (eventual WorlsMatrix) înaintea fiecărei apel.
__________________
Out there I am a simple geologist, but in here, I am
 
andrei5008 is offline    Reply With Quote
Old 30-01-2007, 11:40   #3 (permalink)
Registered User
 
Dark's Avatar
 
Join Date: Nov 1999
Quote:
aplezi DrawPrimitives de câte ori vrei tu
Voi presupune ca stii ca despre world matrix si astfel de povesti asa ca-ti zic cum se face daca vrei sa desenezi X instante cu mai putin de X draw call-uri. Daca nu stii despre world matrix, cauta pe google tutoriale de grafica 3D.

Scrie "instancing" in indexul help-ului de la DX SDK si o sa-ti povesteasca despre unul din exemplele care vine cu SDK-ul, care se afla in Samples\C++\Direct3D\Instancing. Vezi acolo ca-ti arata mai multe tehnici. In principiu, pe placile cu shader model 3 (adica de la GF6 si Radeon X1xxx in sus) ai suport hardware si se foloseste punind geometria in stream-ul 0 si matricile in stream-ul 1. Mai trebuie sa-i zici si:

[code]
dev->SetStreamSourceFreq(0, (D3DSTREAMSOURCE_INDEXEDDATA | count));
dev->SetStreamSourceFreq(1, (D3DSTREAMSOURCE_INSTANCEDATA | 1));
[/code]

Dupa aia pictezi ca si cum ar fi o singura instanta, cu DrawIndexedPrimitive(), dar apar "count" cite ai zis tu acolo.

ATI expun o extensie pentru DX9 pe placile lor cu SM2 (radeon 9 si X) in modul lor preferat - prin D3DRS_POINTSIZE. Trebuie sa dai:

[code]
dev->SetRenderState(D3DRS_POINTSIZE, MAKEFOURCC('I', 'N', 'S', 'T'))
[/code]

Dupa asta se foloseste la fel ca-n SM3. Vezi ca in Radeon SDK e un exemplu in Samples\DirectX 9.0\Instancing.

Daca ai nevoie sa suporti si GeForce5, nu poti face asa. De asemenea, daca ai nevoie de mai multe date per-instance (adica daca obiectele nu-s identice peste tot) nu-i suficient ce ti se ofera cu hardware instancing. In cazul asta poti folosi shader instancing, adica:

- pui geometria de mai multe ori intr-un vertex buffer
- pui ID-ul instantei (0, 1, 2 ...) intr-o componenta libera din vertecsii geometriei (de obicei in w)
- scrii un shader care primeste matricile instantelor prin constante si selecteaza ce vertex transforma cu ce matrice folosind componenta aia in care ai pus ID-ul.

Ideea cu tehnica asta e sa gasesti o balanta intre timpul de CPU pe care-l scutesti facind DIP de mai putine ori si memoria pe care o halesti duplicind geometria. Daca de exemplu pui 5 instante intr-un VB si desenezi 20 de pietre, o sa halesti de 5 ori mai putin CPU cu DIP. Ambele exemple pe care le-am mentionat (ala din DXSDK si ala din Radeon SDK) implementeaza si tehnica asta. In practica o sa-ti dea dureri de cap substantiale. Ultima data cind am folosit asa ceva (adica acum vreo 8 luni), driverul Nvidia intra in panica si facea varza totul daca sareai de un anumit numar de constante. Le-am trimis un repro case si au reparat repro case-ul, dar in joc tot nu mergea.
__________________
Scarbit de fapta ta cea rea
Degeaba plangi, acum, copile,
Ci du-te'n casa-acum si zi-le
Parintilor, isprava ta.

Last edited by Dark; 30-01-2007 at 12:01..
 
Dark is offline    Reply With Quote
Advertisment
Reply

  Computer Games Forum > Tech > The Workshop > Game Design

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On
Forum Jump


All times are GMT +2. The time now is 18:14.


Advertisement System V2.5 By   Branden
This site is copyrighted ©1997 - 2008, Computer Games Online SRL