.[ ČeskéHry.cz ].
Instancing v OGL

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
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

PříspěvekZaslal: 27. listopad 2008, 14:59:04    Předmět: Instancing v OGL Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 27. listopad 2008, 15:20:20    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
am!go



Založen: 19. 08. 2007
Příspěvky: 61
Bydliště: Praha

PříspěvekZaslal: 27. listopad 2008, 16:31:42    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 27. listopad 2008, 18:13:14    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 27. listopad 2008, 18:41:08    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 27. listopad 2008, 19:35:07    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 27. listopad 2008, 19:40:20    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
am!go



Založen: 19. 08. 2007
Příspěvky: 61
Bydliště: Praha

PříspěvekZaslal: 28. listopad 2008, 14:37:35    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 28. listopad 2008, 20:06:56    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 28. listopad 2008, 21:19:54    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 28. listopad 2008, 21:38:05    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna