Also, ich hab mich die letzten Tage noch genauer mit "2D in OpenGL" beschäftigt und mir einen Loader für beliebige Grafiken (also nicht-Zweierpotenz) gebastelt, der dann entsprechend kachelt. Funktioniert alles wunderbar, aber sobald die Grafik nicht exakt in ihrer ursprünglichen Auflösung angezeigt wird, gibt's die berüchtigten Kantenartefakte beim Übergang von einer Textur auf die andere (wenn GL_LINEAR aktiviert ist, bei GL_NEAREST sieht alles aus wie gedacht).
Ich habe mir dann das Redbook genauer angeschaut. Dort wird empfohlen, den Rand der Textur (also Border = 1) zu verwenden und da quasi den Anfang der nächsten Textur reinzusetzen. Gut, habe ich gemacht, ändert aber leider gar nichts. Der Inhalt des Randes ist definitiv korrekt, ich habe das nochmal genau überprüft.
Jetzt die Frage: Wird dieser Texturrand von den momentanen Grafikkarten (ich habe eine GF4 Ti4200) nicht korrekt interpretiert? Oder mache ich etwas falsch?
Der Rand ist nur im GL_CLAMP-Modus aktiv. Da Texturen standardmäßig auf GL_REPEAT gesetzt sind, wurde mein Texturrand ignoriert.
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
ist also des Rätsels Lösung.
Jetzt bin ich auch noch auf den GL_CLAMP_TO_EDGE-Modus gestoßen, der den selben Effekt hat aber ohne den Texturrand auskommt (also einfacher zu handhaben ist). Was ist im Zweifel vorzuziehen - GL_CLAMP samt definiertem Rand oder GL_CLAMP_TO_EDGE?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Bei NVidia-Karten musst du Achtung walten lassen! Die haben GL_CLAMP nämlich (entgegen den Specs) mit der Funktionsweise von GL_CLAMP_TO_EDGE in ihren Treibern implementiert. Da gibts AFAIK auch ne Option namens "konformes Clampverhalten" (OGL) oder so. Also nutze besser explizit GL_CLAMP_TO_EDGE, da es sonst auf Karten die sich zu den Specs konform verhalten zu "Fehlern" (danke NVidia...) kommen kann.
Das bedeutet also, dass es auf NVidia-Karten definitiv das selbe ist, richtig?
Aber für meinen speziellen Einsatzzweck (anzeigen von 2D-Grafiken in mehreren Teilen) sind die beiden Lösungen doch gleichwertig, oder etwa nicht?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Ja, auf NV-Karten gibts halt dank der nonkonformen Implementation (solange man das nicht im Treiber deaktiviert, was aber bei älteren Treibern nicht machbar ist) keinen Unterschied (hab da selbst schonmal Ärger mit gehabt als ich zu ATI gewechselt bin).
Vorziehen würde ich auf jedenfall GL_CLAMP_TO_EDGE. Zum einen weil, wie du bereits gesagt hast, diese Methode im Endeffekt weniger Aufwand bedeutet, und zum anderen weil die Sache mit den Rändern+GL_CLAMP auf Karten kleinerer Hersteller (ich hatte ne zeitlang ne KyroII, da hat eigentlich alles fernab der Mainfeatures von OGL Probleme gemacht, wenns denn unterstützt wurde) schonmal Probleme machen kann.
Naja, GL_CLAMP_TO_EDGE ist "erst" mit OpenGL 1.2 eingeführt worden, GL_CLAMP und den Textur-Rand gibt's schon seit OpenGL 1.0. Von daher ist GL_CLAMP wohl eher ein "Corefeature" von OpenGL.
Andererseits kommt GL_CLAMP_TO_EDGE der Technik von DirectX am nächsten, was möglicherweise auf eine bessere Unterstützung durch die Grafikkarten hindeutet.
Da ich hier aber eben nur eine Grafikkarte habe, ist das alles nur Spekulation, weshalb mich eben interessieren würde, ob jemand etwas genaues darüber weiss.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Corefeatures sind ja seit GL1.2 beide, ist ja keine Erweiterung in Form von _ARB oder _EXT mehr angehängt. Und da eigentlich so ziemlich jede OpenGL-Implementation mindestens OpenGL 1.2 unterstützt würde ich persönlich auch GL_CLAMP_TO_EDGE nutzen. Kommerzielle GL-Titel nutzen das auch (wird häufig logischerweise zur Texturierung von Skyboxen verwendet), und falls du mal nicht genau weisst welche(r) Karte(Treiber) welches Feature unterstützt, dann schau mal in der OpenGL Hardware Registry auf Toms Seite. Die alte (ist ja seit langem ein Corefeature) Extension dafür ist übrigens GL_EXT_texture_edge_clamp, aber danach kann man natürlich nicht mehr gehen.
P.S. : Habe bisher zum Glück noch keine Graka erlebt die GL_CLAMP_TO_EDGE nicht unterstützt hat. Selbst meine alte KyroII hat das brav unterstützt.
Okay, das klingt gut. Zudem ist es wie schon gesagt, einfacher zu handhaben. Schade, dass das Redbook (Dritte Ausgabe, für 1.2) immer noch GL_CLAMP als die bevorzugte Methode für gekachelte Texturen angibt (GL_CLAMP_TO_EDGE wird nur am Rande erwähnt). Aber nun gut...
Mitglieder in diesem Forum: Bing [Bot], Google [Bot] und 19 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.