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.
Texture Artefakte im Alpha-Bereich
- Schrompf
- Moderator
- Beiträge: 5161
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Texture Artefakte im Alpha-Bereich
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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
-
- Beiträge: 28
- Registriert: 24.09.2012, 14:49
Re: Texture Artefakte im Alpha-Bereich
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:
Und beim Rendern wird lediglich folgendes ausgeführt:
Hinter bind/unbind steckt nichts anderes als:
Witzig ist, render ich multiple Sprites ohne texture switch, dann werden diese korrekt dargestellt. Aber ich sehe hier keinen Fehler.
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;
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();
Code: Alles auswählen
glActiveTexture(GL_TEXTURE0+unit);
glBindTexture(GL_TEXTURE_2D, m_textureID);
glEnable(GL_TEXTURE_2D);
bzws.
glDisable(GL_TEXTURE_2D);
- Schrompf
- Moderator
- Beiträge: 5161
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Texture Artefakte im Alpha-Bereich
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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
-
- Beiträge: 28
- Registriert: 24.09.2012, 14:49
Re: Texture Artefakte im Alpha-Bereich
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 ;) )
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 ;) )