.[ ČeskéHry.cz ].
OpenGL vertex Buffery a další

 
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
Khaj



Založen: 16. 01. 2008
Příspěvky: 49

PříspěvekZaslal: 22. únor 2009, 11:11:57    Předmět: OpenGL vertex Buffery a další Odpovědět s citátem

Přecházím z DirectX na OpenGL a měl bych pár dotazů k nejasnostem u VBO a shaderů.

1. Musím používat glInterleavedArrays, když mám více věcí v jednom bufferu, nebo si to stačí ošéfovat pomocí Stride v glVertexAttribPointer?

2. Index Buffer se jmenuje element_Array_buffer ?

3. Kde se můžu dozvědět, který index v glVertexAttribPointer náleží pozici, který normále, který texturovému koordinátu[i] atp?

Arrow Nerad bych se v oběktovém návrhu dopracoval k
switch(index)
case 0: glVertexPoiner ... case 1: glNormalPointer....
Anebo je to grafárna od grafárny driver od driveru různé?

4. Jaké konstantní registry ve vertex shaderu zaujímá která matice? Mnohem víc se mi líbí glUniform než glMatrixMode (atd) a nechci si to rozdělovat na 2 proudy - FFP a shadery (možnost využívat pojmenované matice v GLSL shaderu jsem si zamiloval).
Anebo je to pokaždé jinak?

5. Co se děje, když se nevejde VBO, PBUFFER, textura nebo něco podobného do paměti? Nebo je to natolik inteligentní, že si to umí uložit do RAM?
Můžu taky ztratit eh ... device asi ne, ale něco podobného (při ctrl+alt+del .... kdesi jsem četl něco o user mode atd ale to mi toho moc neřeklo).

Díky moc za odpovědi.
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: 22. únor 2009, 11:37:29    Předmět: Odpovědět s citátem

1. Stačí stride.
2. Ano.
3. To je na tobě, jak si to určíš. Viz glBindAttribLocation - přiřazuje vertex atribut konkrétní proměnné v GLSL shaderu (nejsou tam sematics za ":" jako v HLSL). Druhá možnost je používat glNormalPointer, glTexCoordPointer... pak máš v shaderu proměnné gl_Normal, gl_MultiTexCoord[i]... tento způsob bych nepoužíval.
4. Stačí glUniform. FFP bych dnes už nepoužíval.
5. Správu paměti řeší driver a nemůžeš to ovlivnit. Device ztratit nemůžeš.

Dotaz ode mě: Co tě přimělo přejít na OpenGL?
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Khaj



Založen: 16. 01. 2008
Příspěvky: 49

PříspěvekZaslal: 1. březen 2009, 11:31:07    Předmět: Odpovědět s citátem

Promiň, nějak jsem se zabral do studia GL, že jsem zapomněl odpovědět Smile

Na OpenGL mi přimělo přejít
-absence jakékoli instalace na rozdíl od DX (+možnost přikompilovat glee do zdrojáků a redukovat výstavu dllek u exace)

-outlinky modelů bez shaderů a obecně čáry s různou velikostí (bez d3dX)

-funkcionalita navždy ... hlavně jako DX10 bez vist pomocí extenzí

-driver si umí kompilovat shadery sám (eh ... jak specifikuju SM?)
+ inteligentně si umí přemapovat gl_...

-nikdo (mrkvosoft) se mi nesnaží (pomalu ale jistě) vnucovat Managed "Jo My Jsme Pro Nooby" DirectX a kompilování shaderů jako "efekty"
(nemluvě o tom, že pokud se mrkve rozhodnou, tak už nikdy nikde neseženu jak COEF tak OMF libky na nový verze)

-nikdy mi nic bez rozloučení nezmizne (nepočítaje PBuffery)

-jak se zdá, nemusím se starat o velikost backbufferu při změně velikosti okna

Na druhou stranu mi mrzí
-trochu menší přehlednost ... ale zvyknu si
-pow2 textury (a rendertargety)... ale to fakt nepotřebuju

Když už jsem tu Wink .... jakej je rozdíl mezi FBO a PBO? A jak přiřadím PBO do rendertargetu číslo x?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ondras



Založen: 12. 09. 2007
Příspěvky: 66

PříspěvekZaslal: 1. březen 2009, 12:57:55    Předmět: Odpovědět s citátem

Cau,

no PBO vs FBO, PBO je v podstate jen VBO ktery pouzivas pro jine ucely. Myslim si, ze do nej nemuzes primo kreslit. Musis tam kopirovat(deje se to na karte). vice http://hacksoflife.blogspot.com/2006/10/vbos-pbos-and-fbos.html


FBO je novejsi a umoznuje primo kreslit do textury bez nutnosti do ni kopirovat. Tohle si ja prestavuju pod pojmem RenderTarget. Problem je ten, ze cteni textur ve Vertex shaderu umoznuji jen novejsi karty a tomu se da prave pres PBO vyhnout. Pekne tutorialy
http://www.gamedev.net/reference/articles/article2331.asp
http://www.gamedev.net/reference/articles/article2333.asp
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: 1. březen 2009, 13:23:52    Předmět: Odpovědět s citátem

Khaj napsal:
(eh ... jak specifikuju SM?)

Nijak, tady je trochu zmatek. Vždycky se kompiluje s tím SM, co umí hw.
- Jako základ ber SM2.0.
- Pokud je dostupné GL_ARB(ATI)_shader_texture_lod nebo NV_vertex_program3, je to SM3.0.
- Pokud je dostupné GLSL1.3, je to SM4.0.

Khaj napsal:

Na druhou stranu mi mrzí
-trochu menší přehlednost ... ale zvyknu si
-pow2 textury (a rendertargety)... ale to fakt nepotřebuju

Pow2 textury jsem nepochopil. Rendertargety = FBO.

Khaj napsal:

Když už jsem tu Wink .... jakej je rozdíl mezi FBO a PBO? A jak přiřadím PBO do rendertargetu číslo x?

FBO (framebuffer object) slouží na rendering do textur - je to jen objekt, ke kterýmu můžeš připojit texturu (nebo víc textur), depth-stencil buffer a renderovat do toho.

PBO (pixel buffer object) je úplně na něco jinýho a setkávám se s tím, že lidi to špatně chápou. Ve skutečnosti umožňuje uložit do vertex bufferu pixely. API pro vertex buffery je dost obecné a vlastně se dá použít na jakákoliv data. PBO pomáhá lépe využít DMA přenosy. Typické použití PBO je:

1) Vytvoření PBO a jeho namapování (lock), získáš tím pointer do VRAM, nebo do RAM. Uložíš tam pixely textury, třeba rovnou čtením z HDD. Odmapuješ (unlock). Zavoláš glTexImage, kde parametr na data bude NULL - to znamená, že se data berou z právě nabindovaného PBO. Výhoda: textura jde prakticky rovnou z HDD do VRAM, přes RAM jen minimálně. Hlavně tvoje aplikace si na ty data vůbec nesáhne. Vhodné pro asynchronní load textur, společně s vláknama je možno načítat textury bez většího vlivu na fps. Vhodné taky na efektivnější streamování videa do VRAM nebo prostě jakýkoliv jiný přenos pixelů (třeba u hybridního raytraceru).

2) Podobným způsobem se dá z VRAM získat nějaká textura nebo framebuffer. glReadPixels nebo glGetTexImage bere NULL pointer na data a obsah se uloží do nabindovaného PBO. Za 1-2 snímky to PBO můžeš namapovat (locknout), aniž by aplikace musela na GPU čekat, a pointer na pixely předáš jinýmu vláknu ke zpracování. Vhodné pro vytvoření screenshotu bez trhnutí, také vhodné pro nahrávání videa tvojí scény za běhu.

3) R2VB neboli Render-to-vertex-buffer jde pomocí PBO také udělat. PBO v podstatě neposkytuje nic jinýho, než kopírování dat mezi texturou, nebo framebufferem a vertex bufferem. Pomocí glGetTexImage se dá zkopírovat textura do vertex bufferu a pomocí glTexImage zase vertex buffer do textury (všude samozřejmě s NULL pointerem a nabindovaným vertex bufferem jako PBO).

Namapovaná PBO pamět není cachovaná, takže náhodný přístup nedoporučuju. Sekvenční přístup je OK.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
JohnyDog



Založen: 17. 08. 2007
Příspěvky: 66

PříspěvekZaslal: 1. březen 2009, 18:14:36    Předmět: Odpovědět s citátem

Khaj napsal:

-pow2 textury (a rendertargety)... ale to fakt nepotřebuju

Jestli myslis NPOT(non-power-of-two) textury, tak na to je u starsiho hw extenze GL_ARB(/EXT/NV)_texture_rectangle, od OpenGL 2.0 nahoru jsou uz defaultne podporovany textury vsech rozmeru, ale pokud karta neumi extenzi GL_ARB_texture_non_power_of_two (geforce FX?), tak to pojede v SW modu.
_________________
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: 1. březen 2009, 18:50:06    Předmět: Odpovědět s citátem

No zrovna rozhodnout, zda NPOT textury pojedou v SW nebo HW je docela těžký. Dle diskuzích různě po netu jsem došel k závěru, že jediným spolehlivým způsobem, jak zjistit hw podporu, je zpracovat GL_RENDERER string nebo zjistit device ID karty a dle toho rozhodnout. Podpora je buď úplná nebo částečná (např. nelze použít mipmapy, opakování textur...) a ještě k tomu se liší podle různých verzí hw. Taky hodně záleží na verzi driveru, např. ATI přidávala ARB_texture_non_power_of_two teprve nedávno a to do všech právě podporovaných Radeonů, i když hw podpora se různí (ale nějaká základní tam je vždycky). (přidání té extenze bylo jen na oko, v driveru nic neměnili, ono to tam bylo už ve formě GL2)
_________________
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