![]() |
| | #1 (permalink) | ||
| Registered User Join Date: Jan 2007 |
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..?
| ||
|
| | #2 (permalink) | ||
|
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 | |||
|
| | #3 (permalink) | ||
| Quote:
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.. | |||
|
| Advertisment | |
![]() |
|
| Thread Tools | |
|
|