W
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.png
Einen 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
wolfgke
P. S.: Immerhin das grau ist weg