Seite 1 von 1

Texture Artefakte im Alpha-Bereich

Verfasst: 07.11.2012, 10:52
von snapdragon
Ich habe auf Eure Anregungen hin meinen SpriteBatcher (http://zfxce.zfx.info/viewtopic.php?f=5 ... 318#p34318), so angepasst, das dieser nun Sprites mit unterschiedlicher Texturreferenz batchen kann. Beim Batcher handelt es sich um ein VBO, dass solange die Geometriedaten batched, bis ein Sprite mit neuer Textur hinzugefügt wird. In diesem Fall wird erst der gesamte Inhalt des VBO zusammen mit der im zugeordneten aktiven Textur gerendert und anschließend die Texturreferenz auf die neue gesetzt und alle vorhandenen Geometriedaten gelöscht (Bei jedem Render Call führe ich explizit ein Bind/Unbind der aktiven Textur durch).

Das ganze funktioniert hervorragend, solange ich immer nur ein Sprite pro Textur erzeuge. Füge ich weitere Sprites hinzu, die gebatched werden, dann erhalte ich Texturartefakte, und zwar nur in den hinzugefügten Sprites. Hier wird im Alphabereich der Textur Content der Texturen der anderen Sprites mit gerendert:

http://s7.directupload.net/file/d/3066/5bdmiwxo_jpg.htm

Das oben angefügte Beispiel Zeigt, wie ich ein Regal, ein Ritter und ein Fass render (Back to Front). Alles sauber, alles bestens. Füge ich jetzt ein weiteres Fass hinzu, egal wo, dann habe ich nur für dieses hinzugefügte Fass die beschriebenen Artefakte, die ich mir nicht erklären kann. Um den ganzen noch einen oben drauf zu setzen habe ich noch mal ein Regal hinzugefügt da, und siehe da, ich erhalte nun nur für dieses Regal die Artefakte, die restlichen Sprites werden korrekt gerendert, auch die Fässer.

Zunächst Dachte ich, es könnte am Tiefenbuffer liegen und habe mit glDepthMask und glDisable(GL_DEPTH_TEST) diesen deaktiviert. Dies bringt jedoch keine Änderung.

Hat jemand eine Idee wo diese Artefakte her kommen können? Ich kann mir das aktuell nicht erklären.

Re: Texture Artefakte im Alpha-Bereich

Verfasst: 07.11.2012, 10:58
von Schrompf
Debugge Deine Sprite-Auf-Textur-Hinzufügen-Funktion. Oder schreibe die Ergebnis-Textur mal als Bild raus und schau es Dir an. Für mich sieht das nämlich nicht nach falscher Benutzung der GPU aus, sondern nach einem Logikfehler im Code.

Re: Texture Artefakte im Alpha-Bereich

Verfasst: 07.11.2012, 11:27
von snapdragon
Schon getestet ;) Das Debugging sieht soweit i.O. aus, Texture switch und Menge der Aufrufe sind i.O. Auch im geDEBugger werden die Texturreferenzen korrekt angezeigt.

Das Sprite hinzufügen ist nichts besonderes hier wird nur der boost::shared_ptr auf die Texturreferenz neu gesetzt:

Code: Alles auswählen

/* If we have an actual texture active, first render all
       actual batched data which references this texture */                       
    if(m_activeTexture!=0 && m_data.size()>0){
         this->render();  
    }

    // finally switch texture  
    m_activeTexture = texture;
Und beim Rendern wird lediglich folgendes ausgeführt:

Code: Alles auswählen

    //flush data to GPU
    m_buffer->bind();
    m_buffer->writeData(0, m_data.size()*sizeof(VERTEX_2D), &m_data[0]);
    
    // perform rendering
    m_activeTexture->bind(0);
    m_buffer->render(brGraphics::TYPE_TRIANGLES);   
    m_activeTexture->unbind(0);
    m_buffer->unbind(); 

    // clear obsolete batched data
    m_data.clear();
Hinter bind/unbind steckt nichts anderes als:

Code: Alles auswählen

 glActiveTexture(GL_TEXTURE0+unit);
 glBindTexture(GL_TEXTURE_2D, m_textureID);
 glEnable(GL_TEXTURE_2D);

bzws.
 glDisable(GL_TEXTURE_2D);
Witzig ist, render ich multiple Sprites ohne texture switch, dann werden diese korrekt dargestellt. Aber ich sehe hier keinen Fehler.

Re: Texture Artefakte im Alpha-Bereich

Verfasst: 07.11.2012, 12:22
von Schrompf
Ich sagte ja bereits: der Rendercode ist wahrscheinlich ok. Du schriebst aber: "es funktioniert, solange ich immer nur ein Sprite pro Textur erzeuge". Das interpretiere ich als Zusammenstellung eines Textur-Atlas, auf dem Du mehrere Sprites vereinst, damit Du die Sprites nur noch per Texturkoordinaten umschalten kannst und mehr Sprites auf einmal batchen kannst. Das ist übrigens der Standard-Ansatz. Und mir scheint nach Deiner Beschreibung, dass bei dieser Zusammenstellung des Texturatlas irgendwas überschrieben wird.

Re: Texture Artefakte im Alpha-Bereich

Verfasst: 07.11.2012, 12:58
von snapdragon
Nicht ganz, hab mich etwas unspezifisch ausgesrpochen. Mit ein Sprite pro Textur meinte ich ein Sprite pro referenzierter (aktiver) Textur. Hier verbergen sich also mehrere Atlas Texturen hinter, im Konkreten Fall 3, eines für die Obstacles (Regale), eines für den Ritter inkl. Animationen und eine für dass Fass inkl. Animation.

Dies musste ich so machen, da einzelne Atlas Texturen aufgrund der möglichen Animationen bereits an das HW Limit heran kammen. D.h. mit Switch meine ich, dass die Referenz auf den Atlas im Batcher umgebogen wird. Die einzelnen Sprites nutzen natürlich Deine beschriebene Technik, was auch wunderbar klappt (leider kann ich im Bild die Animation des Ritters nicht zeigen ;) )