Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 8. leden 2015, 19:56:03 Předmět: Problém s glClear (2) |
|
|
Zdravím, pracuji na Sollertii a zasekl jsem se u glClear. Zdá se, že pokud mám FBO texturu větší než rozměry okna, tak glClear nemaže pixely mimo obrazovku, což je na pytel a pak to vytváří něco takového:
Textura má velikost 1024x1024, velikost okna je 1280x800, takže se nějakých 224 pixelů v ose Y nesmaže.
Kdysi jsem si psal vlastní clear, který fungoval, ale v tomto případě nemaže pro změnu vůbec nic.
Kód vypadal takto:
kód: |
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_ALWAYS);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0, 1.0, 1.0, 0.0, -1.0, 0.0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glColor4f(clearColorValues[0], clearColorValues[1], clearColorValues[2], clearColorValues[3]);
glRectf(0.0f, 0.0f, 1.0f, 1.0f);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glDepthFunc(GL_LEQUAL); |
Nemá někdo nějakou radu? Byl bych moc rád, kdyby Sollertia fungovala i na tom mém starém notebooku, i když si budu kupovat v dohledné době notebook nový (abych si mohl zahrát Zaklínače 3).
Byl bych úplně spokojený, kdyby mi někdo našel chybku v tom mém alternativním kódu pro clear a opravil jí...
Děkuji moc. _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 8. leden 2015, 20:40:00 Předmět: |
|
|
PPřišel jsem na to, že color buffer se normálně smaže, ale depth buffer ve FBO se maže jen "onscreen", ale "offscreen" se mu nechce...
Když jsem před tu svou metodu přidal glClear(GL_COLOR_BUFFER_BIT); tak se vše začalo mazat správně...
To znamená, že buď na tom mém notebooku nelze mazat depth buffer offscreen a nebo mám něco nastavené špatně při vytváření FBO... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
michalferko
Založen: 29. 09. 2008 Příspěvky: 83
|
Zaslal: 8. leden 2015, 20:59:48 Předmět: |
|
|
a menis viewport? to by podla mna mohol byt problem.
Pripadne skus spravit nahradu glClear, teda render fullscreen quadu a v shaderi nastavis color a depth na clear value. To spravis za par minut. _________________ Moje minihry a ine projekty |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 8. leden 2015, 21:15:19 Předmět: |
|
|
Jj, viewport měním...
Zajímavé je, že když mám druhou FBO texturu a zapíši do ní hned po tom, co jsem zapisoval to té první, tak se ta chyba neprojeví ani v jednom, ale jakmile tu druhou zakomentuji, tak se ta chyba v první opět objeví... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 8. leden 2015, 21:36:50 Předmět: |
|
|
Njn, dělat s FBO v OpenGL bývá občas porod. _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 8. leden 2015, 21:46:47 Předmět: |
|
|
Nakonec jsem to udělal tak, že jsem si vytvořil mimo hru (v hlavní renderovací smyčce) FBO s maximálními rozměry, pak v každém snímku pouze nastavím viewport a vše ihned vrátím zpět. Chyba tím zmizela... prozatím...
Sice nevím, proč se to děje a proč se to děje jen na integrované kartě od intelu, ale hlavně že to teď nedělá... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 8. leden 2015, 22:13:46 Předmět: |
|
|
Teď to tedy vypadá nějak takto:
Jinak, modely Morflingů používám jako placeholdery, zatím chci vyřešit všechnu logiku a grafiku moc neřeším (ano stíny a výběr jsou sice grafika, ale do toho jsem se pustil, abych si odpočinul). _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 8. leden 2015, 22:15:55 Předmět: |
|
|
Intel na windows ma tie najhorsie OpenGL ovladace co su. to radsej ist na Linux pretoze tam su kvalitnejsie. myslim ze hlavne starsie cipy maju hrozne OpenGL drivery na windows. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 8. leden 2015, 22:21:23 Předmět: |
|
|
No těžko budou hráči přebootovávat do Linuxu. Ještě je možnost použít Direct3D, ať už přímo, nebo přes OpenGL ES -> Direct3D 9 / 11 (Angle), protože D3D drivery má Intel o dost lepší a výkonější než OGL. Holt je třeba myslet na to, že většina počítačů jsou notebooky a téměř všechny maj grafiku Intel (některé maj na sběrnici připojenou i NVidia/AMD GPU, které kreslí offscreen, a to se pak kopíruje do obrazu na Intelu - "muxless" řešení, výkonné GPU nemá žádné výstupy na displeje). |
|
Návrat nahoru |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 9. leden 2015, 10:28:59 Předmět: |
|
|
To co píše Ladis, staré Intely jedině přes DX9. _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 9. leden 2015, 14:56:16 Předmět: |
|
|
No, to bych zas netvrdil, že "jedině přes DX9". Jsou sice špatný, ale jde to.
K tomu FBO: jak to vytváříš? Jak vytváříš Depth Buffer pro tu texturu? Nemáš tam někde nějaký glGetErrory? _________________ 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, 15:28:17 Předmět: |
|
|
Nechtělo se mi to popisovat, tak sem dám kód metody, která vytvoří FBO.
kód: |
/*
* Vytvoření dynamické textury.
*/
bool Texture::createTexture(UnInt width, UnInt height, bool useDepthTexture, bool useAlpha, bool screenTextureFlag)
{
// Upravíme vstupní rozměry.
int iMaxTextureSize = 0;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &iMaxTextureSize);
UnInt maxTextureSize = (UnInt) iMaxTextureSize;
if (width > maxTextureSize || height > maxTextureSize)
{
if (width > height)
{
float ratio = ((float) maxTextureSize) / width;
width = maxTextureSize;
height = (UnInt) (height * ratio);
}
else
{
float ratio = ((float) maxTextureSize) / height;
height = maxTextureSize;
width = (UnInt) (width * ratio);
}
}
// Uvolníme předchozí texturu.
release();
depthTextureUsed = useDepthTexture;
// Pokud nemáme validní knihovnu rozšíření, tak končíme.
if (extLib.isNull())
{
return false;
}
// Vytvoříme FBO.
extLib->glGenFramebuffers(1, &fboIndex);
if (!fboIndex)
{
release();
return false;
}
extLib->glBindFramebuffer(GL_FRAMEBUFFER, fboIndex);
// Vytvoříme RT hloubky.
if (!useDepthTexture)
{
extLib->glGenRenderbuffers(1, &depthIndex);
if (!depthIndex)
{
release();
return false;
}
extLib->glBindRenderbuffer(GL_RENDERBUFFER, depthIndex);
extLib->glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height);
}
else
{
glGenTextures(1, &depthIndex);
if (!depthIndex)
{
release();
return false;
}
glBindTexture(GL_TEXTURE_2D, depthIndex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
glBindTexture(GL_TEXTURE_2D, 0);
}
// Generujeme texturu.
glGenTextures(1, &glIndex);
if (!glIndex)
{
release();
return false;
}
UnInt textureFormat = useAlpha ? GL_RGBA : GL_RGB;
glBindTexture(GL_TEXTURE_2D, glIndex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, textureFormat, width, height, 0, textureFormat, GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_2D, 0);
// Připojíme attachmenty.
extLib->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, glIndex, 0);
if (!useDepthTexture)
{
extLib->glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthIndex);
}
else
{
extLib->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthIndex, 0);
}
// Ověříme validitu.
if (extLib->glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
{
release();
return false;
}
// Odpojíme buffery.
extLib->glBindRenderbuffer(GL_RENDERBUFFER, 0);
extLib->glBindFramebuffer(GL_FRAMEBUFFER, 0);
textureDataSize = width*height*(useAlpha ? 4 : 3);
dynamicTexture = true;
screenTexture = screenTextureFlag;
texWidth = width;
texHeight = height;
fboUsed = false;
alphaUsed = useAlpha;
return true;
} |
Myslím, že v celku obyčejný kód... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 9. leden 2015, 16:41:29 Předmět: |
|
|
hmm... a useDepthTexture je true, nebo false? Proti mýmu kódu tam máš odlišnost v tom, že depth texturu děláš jinak. Neříkám že špatně, pravděpodobně chytřejc, než já. Já mám depthtexturu jako color_attachment s floatovým formátem a k tomu pak obyč. 24bit depth_attachment. Ale je vůbec možný, aby rendertextura používala depthbuffer z okna? Už jsem s OpenGL dlouho nedělal :-)
A co ty glGetErrory? Jsou? _________________ 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, 16:49:44 Předmět: |
|
|
]semo[ napsal: |
Ale je vůbec možný, aby rendertextura používala depthbuffer z okna? Už jsem s OpenGL dlouho nedělal |
Tohle prosím vysvětli, protože v tom by mohl být zakopaný pes...
Btw. useDepthTexture slouží k tomu, aby se jako depth_attachment použila floatová textura místo renderbufferu. Ale ať už použiji texturu nebo renderbuffer, stejně se mi depthbuffer nemaže offscreen... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 9. leden 2015, 17:24:13 Předmět: |
|
|
citace: |
rendertextura používala depthbuffer z okna |
To myslím normálně funguje, používám to u deferred rendereru. DepthBuffer je jeden a kus renderuji do FBO a pak dál průhledné objekty přes klasický forward s pořád tím jedním bufferem.
Postni ještě ten kód, kde tu texturu připojuješ na render (vč. změny viewportu). _________________ Perry.cz |
|
Návrat nahoru |
|
|
|