Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
am!go

Založen: 19. 08. 2007 Příspěvky: 61 Bydliště: Praha
|
Zaslal: 27. listopad 2008, 14:59:04 Předmět: Instancing v OGL |
|
|
Zdravim,
hledam v opengl nejakou techniku, jak zprovoznit instancing co nejvice podobny Hardware Instancingu u DX. Po nejakem badani na internetu sem natrefil na nejake nove extensions EXT_draw_instanced. Jenomze jsem nikde nenasel jak to mam vlastne pouzit a uz vubec ne s pouzitim vertex/index bufferu.
Ma uz nekdo s touhle metodou zkusenosti? |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 27. listopad 2008, 15:20:20 Předmět: |
|
|
http://www.opengl.org/registry/specs/ARB/draw_instanced.txt je specifikacia tohto rozsirenia. zavadza dve nove funkcie
kód: |
void DrawArraysInstancedARB(enum mode, int first, sizei count,
sizei primcount);
void DrawElementsInstancedARB(enum mode, sizei count, enum type,
const void *indices, sizei primcount);
|
maly by sa spravat presne rovnako ako glDrawArrays() a glDrawElements() jediny rozdiel je ze sa pokazde zvysi id ktore je dostupne v shadery pod gl_InstanceIDARB. zavola sa to primcount krat.
DrawArraysInstancedARB je ekvilavlent
kód: |
for (i = 0; i < primcount; i++) {
glUniform("gl_InstanceIDARB",i);
DrawArrays(mode, first, count);
} |
teda si naloaduje data do VBO k tomu nejake uniform pole obsahujuce polohu a rotaciu(vec4 a quaterion na rotaciu v half float aby to bolo male) _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
am!go

Založen: 19. 08. 2007 Příspěvky: 61 Bydliště: Praha
|
Zaslal: 27. listopad 2008, 16:31:42 Předmět: |
|
|
Diky, tak jestli jsem to spravne pochopil, tak si musim do vertex shaderu poslat pole tech pozic, rotaci nebo cehokoliv jinyho a podle toho indexu pristupu k prvkum toho pole. |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 27. listopad 2008, 18:13:14 Předmět: |
|
|
Přesně tak, instance ID používáš jako index do nějakého vlastního pole. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 27. listopad 2008, 18:41:08 Předmět: |
|
|
Eosie: na buildery si spomenul aj http://www.opengl.org/registry/specs/ARB/instanced_arrays.txt co som z toho pochopil tak je to vlastne rozsirenie draw_instanced o moznost ulozit to pole parametrov do VertexAttrib a teda to ma vyhodu vetsej velkosti a mozno aj rychlosti.
len ci som to pochopil tak pouzitie je nasledovne
1. nahram do VertexAttribArray parametre instacii
2. glGetAttribLocation na ziskanie indexu premennej v shadery ktora bude obsahovat parametre instancii
3. do glVertexAttribDivisorARB() predam index a pocet vertexov jednej instancie.
4. v shadery sa budu hodnoty v attrib premennej menit pekne podla instancii
inak zda sa mi ze toto je prakticky zalezistost ovladacov a teda by tieto rozsierenia mohly byt podporovane aj dost spetne prakticky vsetky OGL2 karty. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 27. listopad 2008, 19:35:07 Předmět: |
|
|
Uznávám, že ta specifikace je trochu nepřehledná.
Ad 3: Počet vertexů jedné instance přece specifikuješ v glDraw*.
Jinak vypadá to, že musíš stejně kreslit pomocí glDraw*InstancedARB, někde přece počet instancí určit musíš a tohle je jediná možnost. Škoda, že to ve specifikaci není výslovně napsaný. Třeba to vyplývá už z faktu, že instanced_arrays je v podstatě jen rozšířením draw_instanced. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 27. listopad 2008, 19:40:20 Předmět: |
|
|
Ještě Ad 3: Divisor určuje počet instancí, po kterých se posune na další index v poli. Ve většině případech to bude 1.
Mimochodem glVertexAttribDivisorARB je skoro to samý co SetStreamSourceFreq z D3D. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
am!go

Založen: 19. 08. 2007 Příspěvky: 61 Bydliště: Praha
|
Zaslal: 28. listopad 2008, 14:37:35 Předmět: |
|
|
Tak to me zajima, bych totiz potreboval docilit neceho co nejpodobnejsiho Hardware instaningu v D3D. To je jeden vertex buffer s geometrii a druhej pro ulozeni napriklad tech pozici a rotaci. |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 28. listopad 2008, 20:06:56 Předmět: |
|
|
hej to bude dost nutne kedze GL_MAX_VERTEX_UNIFORM_COMPONENTS ma byt aspon 512. to znamena ze pri predavani pozicie a rotacie v dvoch vec4 to vychadza na 512/2/4 = 64 objektov. a to este moze chciet predat nejake dodatocne informacie. ked by sa pouzily half float tak je stale len 128 instancii. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 28. listopad 2008, 21:19:54 Předmět: |
|
|
GL_MAX_VERTEX_UNIFORM_COMPONENTS je 256 na SM2.0 kartách a 96 na Intel G.M. Decelerator.
Místo matice si ulož pozici a quaternion, tj. 2x vec4. To dělá při 512 konstantních registrech asi 256 instancí per-draw-call. Nicméně je třeba ještě vzít v úvahu, že ty registry se obsazují i literálama v kódu (např. vec4(0) při přiřazení automaticky obsadí jeden volný konstantní registr). A pak jsou tu další parametry jako světlo...
Nikde jsem si nevšiml, že by šlo loadovat uniformní proměnné s typem half. Pokud vím, tak to obecně nejde. Něco mi uniklo? _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 28. listopad 2008, 21:38:05 Předmět: |
|
|
Pokud vím, tak jde menším trikem naloadovat 16x unsigned byte do jednoho konstantního registru a v shaderu rozbalit do mat4 (float4x4). _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
|