.[ ČeskéHry.cz ].
Problém s glClear (2)
Jdi na stránku 1, 2  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
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 8. leden 2015, 19:56:03    Předmět: Problém s glClear (2) Odpovědět s citátem

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. Smile
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 8. leden 2015, 20:40:00    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
michalferko



Založen: 29. 09. 2008
Příspěvky: 83

PříspěvekZaslal: 8. leden 2015, 20:59:48    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 8. leden 2015, 21:15:19    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1558

PříspěvekZaslal: 8. leden 2015, 21:36:50    Předmět: Odpovědět s citátem

Njn, dělat s FBO v OpenGL bývá občas porod.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 8. leden 2015, 21:46:47    Předmět: Odpovědět s citátem

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... Wink
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
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 8. leden 2015, 22:13:46    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 8. leden 2015, 22:15:55    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1536
Bydliště: u Prahy

PříspěvekZaslal: 8. leden 2015, 22:21:23    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1558

PříspěvekZaslal: 9. leden 2015, 10:28:59    Předmět: Odpovědět s citátem

To co píše Ladis, staré Intely jedině přes DX9.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 9. leden 2015, 14:56:16    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 9. leden 2015, 15:28:17    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 9. leden 2015, 16:41:29    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 9. leden 2015, 16:49:44    Předmět: Odpovědět s citátem

]semo[ napsal:
Ale je vůbec možný, aby rendertextura používala depthbuffer z okna? Už jsem s OpenGL dlouho nedělal Smile

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 9. leden 2015, 17:24:13    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
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
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
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