OGL: Grau bei hoher Tiefe (vermutlich Mipmap-Problem)
-
Nachdem ich mal zu Testzwecken die anisotrope Filterung auf 16x gestellt habe (zu Testzwecken - aber auch nur dann
- kann man ruhig ordentlich klotzen!), ist das Problem nahezu vollständig verschwunden (außer ich mache ganz böse flache Winkel, die jedoch im Spiel wohl nicht erscheinen werden).Bleibt für mich noch eine Erklärung übrig, warum das ganze grau wurde, wo die Textur doch im großen und ganzen braun ist (mit vielleicht einigen Pixeln in Graustufen).
-
weil die mipmaps diese farbe haben, vermutlich ein 08/15 mittelwert-mipmap-algorithmus.
-
Inwiefern sollte das helfen? So wie ich es (unvollständig) beim Googlen nach anisotroper Filterung verstanden habe, liegt das Problem doch eher an der extremen Stauchung in einer Richtung.
Nicht, dass ich ein Problem damit hätte, so etwas mal eben schnell in den Rechner zu hacken. Ich möchte nur verhindern, dass ich merke: das bringt nichts (nachdem ich die Arbeit hatte).
-
wolfgke schrieb:
Inwiefern sollte das helfen? So wie ich es (unvollständig) beim Googlen nach anisotroper Filterung verstanden habe, liegt das Problem doch eher an der extremen Stauchung in einer Richtung.
Die hohe Stauchung sorgt fuer hohe MipMap Level (bei anisotroper Filterung muss die Stauchung in beiden Dimensionen auftreten). Sind diese Level jetzt nicht grau sondern braun, dann hast du dort auch 'nen braunen Streifen. f'`8k
(Scheisse im Autoreifen, gibt beim Bremsen braune Streifen

Gruß, TGGC (\-/ has leading)
-
wolfgke schrieb:
Inwiefern sollte das helfen? So wie ich es (unvollständig) beim Googlen nach anisotroper Filterung verstanden habe, liegt das Problem doch eher an der extremen Stauchung in einer Richtung.
das ist kein problem, sondern ein algorithmus. je groesser die stauchung, desto kleiner die mipmaplevel die gewaehlt wird, und wenn di bei dir eine ungewuenschte farbe hat, siehst du das eben. benutz einfach ein gutes texturtool um die mipmaps zu generieren.
-
Nein, ihr habt mich überzeugt. Ich werde Code zur manuellen Erstellung der Mipmaps einbauen. Ich hoffe, es wird helfen.
Ich hoffe, das Problem ist damit geklärt.

-
wolfgke schrieb:
Nein, ihr habt mich überzeugt. Ich werde Code zur manuellen Erstellung der Mipmaps einbauen. Ich hoffe, es wird helfen.
Ich hoffe, das Problem ist damit geklärt.

nette hoffnung, aber bei der menge an algorithmen die es gibt, wirst du schwierigkeiten haben den richtigen zu finden.
wenn es dir um qualitaet geht (und nicht sehr um geschwindigkeit, weil du das z.b. beim konvertieren der bilder in dein texturformat einmals nur machst) dann
-nutze immer die oberste texturebene um die darunterliegenden mipmaps zu generieren.
-rechne rughi mit float, ist zwar nicht das schnellste, aber es kann genauigkeit bringen
-konvertiere eventuell das format in ein Luminanz format mit zusaetzlichen farbinfos, denn oft behandelt man die luminanz und die farben anders
-es gibt keinen algorithmus fuer perfekte mipmaps, je nach fall wird mal der eine, mal der andere besser sein, also schmeiss keinen weg, wenn du mal einen testfall hast bei dem dein algo versagt
-oft kann eine gammakorrektur viel helfen
-oft ein groesserer kernel filter (also mehr pixel zum extrapolieren eines mippixels benutzen, als die die auf den ersten offensichtlich erscheinen.usw.
ich wuerde an deiner stelle ein texturtool verwenden, z.b. die von nvidia (dds tools)
-
Wenn man das weiter denkt, ergeben sich natuerlich gleich noch weitere Forderungen . Dein MipMap-Generator muss durch die Grafiker bedienbar sein. Die Einstellungen (Algorithmus waehlen...) muessen abgespeichert werden, sie sind dann quasi Teil der Originalgrafik. Und es muss einen einfachen Weg geben, fuer alle Texturen alle MipMaps neu zu erstellen. f'`8k
Gruß, TGGC (\-/ has leading)
-
Danke für euren Tipps. Es scheint, dass "manuell-algorithmisch" generierte Mipmaps tatsächlich das Problem lösen (bei dem Problem, das im Moment noch auftritt, tippe ich auf einen selbstverschuldeten Bug).
Von daher werde ich ersteinmal den Bug fixen. Wenn ein Problem auftritt, bei welchem ich Hilfe brauche, werde ich mich nochmal melden.
Danke so weit.
wolfgke
-
OK, ich dachte, ich hätte jetzt alles ausprobiert. Ich habe eine "schöne" Mipchain von Hand im Bildbearbeitungsprogramm durch Skalieren der Originaltextur in unterschiedliche Größen (1x1 bis Original 256x256) erstellt.
Außerdem eine Funktion zum Erstellen der Mipchain:
CMipChain::CMipChain(std::vector<std::string> in_filenames) { for (std::vector<std::string>::iterator i=in_filenames.begin(); i!=in_filenames.end(); i++) { CTgaTexture *texture=new CTgaTexture(); if (!LoadTGA(texture, (*i).c_str())) throw string("Error: Could not load texture ")+(*i)+"\n"; mipchain.push_back(texture); } }(mipchain ist als ein std::vector<CTgaTexture*> definiert)
Soweit funktioniert das alles. Auch die Funktion zum Erstellen der OGL-Texturen (Auszug):
GLuint type=GL_RGBA; // Set The Default GL Mode To RBGA (32 BPP) // Build A Texture From The Data glGenTextures(1, &(in_chain->mTexID)); // Generate OpenGL texture IDs glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter); // als min_filter wird GL_LINEAR_MIPMAP_LINEAR und als mag_filter GL_LINEAR übergeben // nichts wirklich wichtiges -> Einstellen Texturmodi repeat etc. // ... // nun das Erstellen der Mipchain for (unsigned int i=0; i<in_chain->getTextureCount(); i++) { glTexImage2D(GL_TEXTURE_2D, i, in_chain->getTexture(i)->getBPP()/8, in_chain->getTexture(i)->getWidth(), in_chain->getTexture(i)->getHeight(), 0, type, GL_UNSIGNED_BYTE, in_chain->getTexture(i)->imageData); } }Nun entsteht jedoch in einem gewissen Abstand ein grüner (interessanterweise in der Debug-Konfiguration ein cyanfarbener) Kreis, der allerdings nicht durchgehend bis zur maximalen Distanz geht, sondern ab einer gewissen Distanz wieder aufhört.
Bilder:
http://www.uni-magdeburg.de/wkeller/img/bug debug.png
http://www.uni-magdeburg.de/wkeller/img/bug release.pngEinen Fehler im TGA-Loader kann ich mit sehr, sehr hoher Wahrscheinlichkeit ausschließen, da auch im Falle, dass ich die Mipmaps durch einen eigenen Algorithmus innerhalb des Programms aus einer einzigen geladenen Textur erstellte, dieser Fehler auftrat. Zudem habe ich zu Testzwecken alle Elemente der Membervariable imageData vor dem Füllen mit den Texturdaten noch über memset mit 0 gefüllt.
Auch anisotrope Filterung half nichts (erwartungsgemäß, da die Farben grün und Cyan gar nicht in der Textur auftauchen). Ich bin ratlos.
Hilfe!
Grüße
wolfgkeP. S.: Immerhin das grau ist weg
