Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Khaj
Založen: 16. 01. 2008 Příspěvky: 49
|
Zaslal: 22. únor 2009, 11:11:57 Předmět: OpenGL vertex Buffery a další |
|
|
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?
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 |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 22. únor 2009, 11:37:29 Předmět: |
|
|
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 |
|
|
Khaj
Založen: 16. 01. 2008 Příspěvky: 49
|
Zaslal: 1. březen 2009, 11:31:07 Předmět: |
|
|
Promiň, nějak jsem se zabral do studia GL, že jsem zapomněl odpovědět
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 .... jakej je rozdíl mezi FBO a PBO? A jak přiřadím PBO do rendertargetu číslo x? |
|
Návrat nahoru |
|
|
Ondras
Založen: 12. 09. 2007 Příspěvky: 66
|
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 1. březen 2009, 13:23:52 Předmět: |
|
|
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 .... 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 |
|
|
JohnyDog
Založen: 17. 08. 2007 Příspěvky: 66
|
Zaslal: 1. březen 2009, 18:14:36 Předmět: |
|
|
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 |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 1. březen 2009, 18:50:06 Předmět: |
|
|
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 |
|
|
|