Ich habe ein seltsames Problem beim Zeichnen der Skybox-Textur auf einem Mac. Auf dem iPhone läuft alles gut. Ich habe versucht, den Wert von nahen und fernen Flugzeugen ohne Erfolg zu ändern.
Es ist eine Skybox mit sechs Texturen, und für jede Textur habe ich Folgendes festgelegt:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Woran könnte das liegen?
Bildschirmfoto:
BEARBEITEN:
Ich habe versucht, die Hintergrundfarbe auf Rot zu setzen, um sicherzustellen, dass sie durch die Textur blutet
Ich habe auch versucht, die Koordinaten der Textur zu ändern:
float err_corr = 0.5 / TEXTURE_SIZE;
GLfloat vertices[24] = {
-1.0f - err_corr, -1.0f - err_corr, 1.0f + err_corr,
1.0f + err_corr, -1.0f - err_corr, 1.0f + err_corr,
-1.0f - err_corr, 1.0f + err_corr, 1.0f + err_corr,
1.0f + err_corr, 1.0f + err_corr, 1.0f + err_corr,
-1.0f - err_corr, -1.0f - err_corr, -1.0f - err_corr,
1.0f + err_corr, -1.0f - err_corr, -1.0f - err_corr,
-1.0f - err_corr, 1.0f + err_corr, -1.0f - err_corr,
1.0f + err_corr, 1.0f + err_corr, -1.0f - err_corr,
};
Und die Box wird in dieser Reihenfolge gezeichnet:
GLubyte indices[14] = {0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1};
LÖSUNG:
Die Lösung besteht darin, GL_CLAMP_TO_EDGE für die Cubemap selbst festzulegen!
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
undglTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Fügen Sie '0.5f / texture_width' von der linken und rechten Seite der Textur und '0.5f / texture_height' von oben und unten ein. Sie sehen Sampling-Artefakte - Textur-Sampler werden normalerweise in der Mitte von Texeln abgetastet, sodass Sie links und rechts, oben und unten (bei 0 und 1 uv) 50% des Texels erhalten, das Ihr Sampler erhält, wenn er außerhalb der Grenzen liegt . Das ist entweder die andere Seite der Textur oder eine Standard-Sampling-Farbe.
quelle
GL_CLAMP_TO_EDGE
Set, es sollte bewirken, dass die Out-of-Bound-Samples den Wert der nächsten In-Texture-Pixel annehmen. Was Sie beschreiben, mag sehr gut funktionieren, aber es erklärt nicht, warum das Problem überhaupt besteht.Ich vermute, dass der Unterschied zwischen MAC und iPhone durch Antialiasing auf dem MAC verursacht wird. Meine 3D-Programmierung ist ein bisschen verrostet, aber ich denke, Sie müssten alle Quadrate zu einem Teil desselben Gitters machen oder so ähnlich.
Eine schmutzige Hack-Lösung wäre, alle Quadrate etwas zu groß zu machen, damit sie sich überlappen und gegenseitig beschneiden und die UV-Koordinaten entsprechend anpassen.
quelle
Dies ist ein übliches Problem bei Cubemaps auf älteren HW-Geräten (oder Iphone-Geräten). Überprüfen Sie für die
erweiterung wenn es auf deiner hw verfügbar ist. Wenn ja. Das Problem wird wahrscheinlich dadurch gelöst.
quelle
Sind die sechs Texturen speziell als Würfelkarte eingerichtet oder wird jede der Skybox-Flächen separat mit ihrer eigenen Textur gerendert? Ich habe gehört, dass einige frühe PC-Systeme beim Umgang mit Cubemaps ziemlich schlecht gefiltert waren, da sie beim Abtasten in der Nähe der Würfelkanten nicht unbedingt von einer Flächentextur zur nächsten gefiltert wurden. AFAIK das SGX (iphone GPU) sollte korrekt über Kanten filtern.
Mir ist der Gedanke gekommen, dass die Unterseite Ihrer Seitentexturen dem Artefakt ähnlich blau erscheint. Könnten Sie beispielsweise versuchen, die unterste Pixelreihe (oder einige Pixelreihen) zu einem abscheulichen Magenta-Farbton zu machen und zu prüfen, ob sich dadurch die Farbe des Artefakts ändert? Das könnte mehr Aufschluss darüber geben, was möglicherweise passiert oder nicht.
quelle