Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
mafian89
Založen: 21. 10. 2012 Příspěvky: 51
|
Zaslal: 2. březen 2015, 19:59:50 Předmět: [OPENGL + GLSL] Rendering do 3D textury |
|
|
Zdravím,
snažím se naimplementovat metodu Light Propagation Volumes, ale zasekl jsem se už na začátku. Je potřeba scénu rozřezat uniformní mřížkou (např. na 32x32x32 buňek). Velikost buňky mám spočítanou (z bounding boxu). A teďka ji potřebuji naplnit (z Reflective Shadow Mapy). Tady je kámen úrazu. Pořádně nevím, jak to udělat. První myšlenka byla vytvořit si 3D texturu reprezentující mřížku a nastavit ji jako render target (za použití FBO). Jenže to vypadá, že to v OpenGL nějak nejde (nebo jsem zatím nedošel na způsob, jak to udělat). Tak bych se chtěl zeptat, zda je možné nabindovat 3D texturu do FBO jako např. Color attachment? Nebo musím jít jinou cestou?
Díky za každý názor |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
|
Návrat nahoru |
|
|
mafian89
Založen: 21. 10. 2012 Příspěvky: 51
|
Zaslal: 2. březen 2015, 21:17:45 Předmět: |
|
|
Díky, o tom vím. Jen mi přijde trochu plýtvání časem, když budu mít 32 vrstev, tak dělat 32 průchodů, navíc potřebuji pro každý kanál jednu 3d texturu a ještě nějaké další - takže by ten počet cyklů rostl docela rychle. Tak jsem doufal, že bude možné nějak nabindovat texturu jako celek a adresovat v shaderech. Asi budu muset přejít na jiný postup. |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 2. březen 2015, 21:53:18 Předmět: |
|
|
alternativa ktora ma napada je renderovat to do dlazdic. alebo este sa da pouzit MRT aj ked tu nie som si isty ci to nebude spadat do undefined behavior ak pouzijes jednu 3D texturu ako jednotlive vrstvy. ale aj tak tam bude tak 6-8 vrstiev naraz. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
mafian89
Založen: 21. 10. 2012 Příspěvky: 51
|
Zaslal: 2. březen 2015, 22:47:51 Předmět: |
|
|
Přesně ty dlaždice mě napadly také. Pak by teoreticky šlo využít i image load/store operací v shaderech, ale tam je zase problém, že umí atomicAdd jen na signed/unsgined inty. Každopádně díky |
|
Návrat nahoru |
|
|
Vilem Otte
Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
|
Návrat nahoru |
|
|
mafian89
Založen: 21. 10. 2012 Příspěvky: 51
|
Zaslal: 16. březen 2015, 08:02:31 Předmět: |
|
|
Nějak jsem se moc nepohnul z místa. Tak mě napadlo, jestli by nešla nabindovat 3D textura do FBO(jak zmiňoval nou) a pak v geometry shaderu vybrat vrstva do která se bude kreslit (pomocí gl_Layer). Když jsem to tak udělal, tak je celá textura černá (samé nuly - kromě první vrstvy, kde je clear color).
GS vypadá takto:
kód: |
#version 430
layout(points )in;
layout(points ,max_vertices = 1 )out;
void main(){
gl_Position=gl_in[0].gl_Position; //zatim pro jeden bod
gl_Layer = 1;
EmitVertex();
EndPrimitive();
} |
VS jen přeposílá pozici a FS jen zapisuje barvu. Podle tohoto kódu bych čekal, že se něco zapíše do vrstvy 1 (tj. druhé), ale jak jsem říkal, jsou tam samé nuly. Je něco vyloženě špatně? Případně můžu odpoledne udělat minimalní vzorek kódu Díky za případné tipy. |
|
Návrat nahoru |
|
|
mafian89
Založen: 21. 10. 2012 Příspěvky: 51
|
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 16. březen 2015, 18:47:05 Předmět: |
|
|
tak som si pozrel specifikaciu poriadne a musis pouzit glFramebufferTexture() aby fungoval gl_Layer. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
mafian89
Založen: 21. 10. 2012 Příspěvky: 51
|
Zaslal: 16. březen 2015, 19:39:28 Předmět: |
|
|
Díky za tip. Vyzkoušel jsem to a jediné, co jsem dostal byl unknow error při checku na FBO completness. Dělám chybu někde při připojování? Myslím, že to mám ok:
kód: |
//predtim vytvorim FB pomoci glGenFramebuffers(1, &_fboId);
glBindTexture(GL_TEXTURE_3D, textureId); //texture ID je vytvořená textura
glBindFramebuffer(GL_FRAMEBUFFER, _fboId);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,textureId, 0);
static const GLenum draw_buffers[] =
{
GL_COLOR_ATTACHMENT0
};
glDrawBuffers(1, draw_buffers); |
EDIT: Našel jse, chybu. Nebyla tady, ale vznikla při tom, když jsem připojil render buffer.. |
|
Návrat nahoru |
|
|
|