Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 9. leden 2015, 17:35:34 Předmět: |
|
|
perry: taky mám ten pocit, že tak nějak to fungovalo. Ale už si to nepamatuju, proto jsem tam hodil ten otazník a víc asi nevysvětlím. Taky sem myslel, jestli třeba interně nemají v driverech nějakou hrůzu, která emuluje FBO s pomocí renderu do screenu.
Ale zkus ještě tohle:
Blbé stavy - na intelu se mi to stávalo. Tam kde většinou textura už funguje, u intelu musíš zavolat glEnable(GL_TEXTURE_2D), atp. Třeba i tohle bych zkontroloval a zkusmo to přidal před glTexImage2D... Je to někdy peklo.
A zjistit hodnotu GL_MAX_VIEWPORT_DIMS, tim je velikost RT taky limitovaná. Pravděpodobně to tim nebude, ale tak pro úplnost. Pak bych šel po těch glErrorech a špatných stavech (glDepthMask, scissor test...). Zkus nějaký gl debugger... _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 9. leden 2015, 18:01:33 Předmět: |
|
|
perry napsal: |
Postni ještě ten kód, kde tu texturu připojuješ na render (vč. změny viewportu). |
kód: |
/*
* Počátek renderu do FBO.
*/
bool Texture::begin(void)
{
if (!dynamicTexture || fboUsed || extLib.isNull())
{
return false;
}
glPushAttrib(GL_VIEWPORT_BIT);
extLib->glBindFramebuffer(GL_FRAMEBUFFER, fboIndex);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glViewport(0, 0, texWidth, texHeight);
glEnable(GL_SCISSOR_TEST);
glScissor(0, 0, texWidth, texHeight);
fboUsed = true;
return true;
}
/*
* Konec renderu do FBO.
*/
void Texture::end(void)
{
if (!dynamicTexture || !fboUsed || extLib.isNull())
{
return;
}
glDisable(GL_SCISSOR_TEST);
extLib->glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDrawBuffer(GL_BACK);
glReadBuffer(GL_BACK);
glPopAttrib();
fboUsed = false;
} |
Tady bych řekl chyba nebude... prostě zlobí driver na intelu, protože na jiných kartách se to neděje... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 9. leden 2015, 19:13:35 Předmět: |
|
|
To vypadá celkem OK na připojení FBO. Nevím, co je / dělá
kód: |
extLib->glBindFramebuffer |
Resp. jako co to dělá na pozadí. Nikde totiž nevidim, že by to připojovalo ten depth buffer, co chceš vymazat. Já to připojuju samostatně
FBO
kód: |
GL_CHECK( glBindFramebuffer(GL_FRAMEBUFFER, this->frameBufferID) );
for (all textures){
GL_CHECK( glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + attachIndex, GL_TEXTURE_2D, this->textures[i]->textureID, 0) );
attachIndex++;
} |
textureID je ID vygenerované textury
Depth Buffer
kód: |
GL_CHECK( glBindRenderbuffer(GL_RENDERBUFFER, this->id) );
GL_CHECK( glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, this->id) ); |
id je pak ID vytvořeného depth bufferu (který ale není tetura)
Takhle to mám v GL ES2/3 ale i v klasickém 4/3. Jak je to ve starších verzích, nevím.
---
Jinak poznámka k logice. Proč tvoříš depth buffer dohromady s texturou? To vypadá tak divně. _________________ Perry.cz |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 9. leden 2015, 19:30:51 Předmět: |
|
|
Aha... a já myslel, že se to připojuje automaticky zavoláním glBindFramebuffer(GL_FRAMEBUFFER, ...)...
Takže všechny ty attachmenty musím připojit znovu, když chci do FBO zapisovat? _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 9. leden 2015, 19:35:06 Předmět: |
|
|
Teď jsem to tam zkusil napsat a pořád to dělá tu samou chybu, takže to prostě nemůže být v mém kódu, ale je to driverem... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 9. leden 2015, 19:37:35 Předmět: |
|
|
tak samozrejme pripojit texturu alebo renderbuffer k FBO staci raz. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 9. leden 2015, 20:01:28 Předmět: |
|
|
citace: |
tak samozrejme pripojit texturu alebo renderbuffer k FBO staci raz. |
ale pokud z ní chci číst v shaderu jako z textury, tak jí musím z toho FBO odpojit, ne? Nebo alespoň to bylo doporučováno někde v nějakém tutoriálu. Ono i bez toho odpojení z toho většinou jde číst, ale nějaký driver se může vztekat. Dřív u DX9 mi to občas právě blblo, pokud jsem texturu neodpojil jako render atrget a chtěl z ní číst (a naopak). _________________ Perry.cz |
|
Návrat nahoru |
|
|
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 10. leden 2015, 11:14:48 Předmět: |
|
|
jen pro jistotu: mas urcite zapnuty depth-write (glDepthMask(GL_TRUE)) pred glClear(...| GL_DEPTH_BUFFER_BIT), ze? |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 10. leden 2015, 11:24:20 Předmět: |
|
|
OpenGL specifikacia hovori ze dojde k nedefinovanemu spravaniu sa ak
- an image from texture object T is attached to the currently bound draw frame-
buffer at attachment point A
- the texture object T is currently bound to a texture unit U, and
- the current programmable vertex and/or fragment processing state makes it
possible (see below) to sample from the texture object T bound to texture
unit U
inak povedane ak textura T je zaroven zdrojom pre citanie a aj zapisovanie. teda staci aby FBO nebolo v dany moment aktivne. ak to blbne tak je to bug v driver. teda to doporucenie je pravdepodobne pre vyhnutiu sa tejto zapisovacej slucke.
quas4 napsal: |
jen pro jistotu: mas urcite zapnuty depth-write (glDepthMask(GL_TRUE)) pred glClear(...| GL_DEPTH_BUFFER_BIT), ze? |
to by nesposobilo ze mu zmaze len cast buffera. to by skor implikovalo pouzitie glScissor() _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 10. leden 2015, 11:31:38 Předmět: |
|
|
I bez glScissor() to dělá oné chování. Jak jsem řekl, myslím, že je to driverem, neboť na všech ostatních strojích, kde je nějaká rozumná grafická karta to problémy nedělá. Navíc jsem to vyřešil i na tomto notebooku přidáním jednoho dummy FBO s maximálními rozměry, do kterého nic nezapisuji, jen ho připojím a odpojím. Na výkon to nemá žádný znatelný dopad. _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
|