Skybox-Beschaffenheitsartefakt auf Rand

12

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:

Bild des Himmels mit den Rändern der Skybox sichtbar

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);
Martin Pilch
quelle

Antworten:

8

Sind Sie sicher, dass Sie GL_CLAMP_TO_EDGE für jede einzelne Textur festgelegt haben ? Dies ist ein Teil des individuellen Texturstatus und standardmäßig GL_REPEAT. Dies muss also nach dem Binden mit glBindTexture erfolgen. Mir ist klar, dass Sie in dem ursprünglichen Beitrag buchstäblich sagen, dass Sie es für jede Textur festgelegt haben, aber ich frage mich, wie der Code tatsächlich aussieht?

Beispielsweise:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.

Dies ist nicht dasselbe wie:

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
user_123abc
quelle
Ich habe den Fehler gefunden! Es war nicht notwendig, GL_CLAMP_TO_EDGE für jede Textur der Würfelkarte festzulegen, sondern für die Würfelkarte selbst! 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);
Martin Pilch
1

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.

Luther
quelle
Aus diesem Grund hat er das GL_CLAMP_TO_EDGESet, 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.
aaaaaaaaaaa
Ich habe es ohne Änderung versucht: /
Martin Pilch
0

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.

aaaaaaaaaaa
quelle
Ich habe versucht, das Anti-Aliasing (durch glDisable (GL_POLYGON_SMOOTH);) ohne Wirkung zu deaktivieren. Ich
zeichne
1
Das klingt gut für mich. Zumindest für den Moment habe ich keine Ahnung, aber Sie können das Problem eingrenzen, indem Sie herausfinden, ob dieser schwarze Hintergrund durchblutet oder die Texturkante als schwarz angezeigt wird. Wenn Sie ein rotes Polygon irgendwo hinter dem Artefakt platzieren, nimmt das Artefakt dann seine Farbe an?
aaaaaaaaaaa
Ich möchte versuchen, Wände zu verlängern, damit sie sich überlappen (genau wie eBusiness schrieb) - ich denke, 0,0001 wären genug. Sie müssen die UV-Koordinaten nicht ändern.
Zacharmarz
1/10000 ist sicherlich nicht genug, die Stärke des Problems scheint im Bereich von 1/4 bis 1/2 Pixel zu liegen, daher würde die minimale Stärke für dieses Problem, abhängig von der Texturgröße, bei 1/1000 liegen. Das Nichtanpassen der UV-Koordinaten ist etwas schlampig, da der resultierende visuelle Sprung aufgrund der Beschaffenheit der Textur möglicherweise nicht wahrnehmbar ist, aber dennoch falsch ist. In jedem Fall sollten weitere Tipps für Hacks von der Antwort auf die Frage abhängen, die ich in meinem vorherigen Kommentar gestellt habe.
aaaaaaaaaaa
Das Artefakt ist kein Hintergrund, der durch die Textur blutet. Ich habe die Hintergrundfarbe unverändert auf Rot gesetzt. Ich habe auch versucht, die Texturkoordinaten zu erweitern
Martin Pilch
0

Dies ist ein übliches Problem bei Cubemaps auf älteren HW-Geräten (oder Iphone-Geräten). Überprüfen Sie für die

GL_ARB_seamless_cube_map

erweiterung wenn es auf deiner hw verfügbar ist. Wenn ja. Das Problem wird wahrscheinlich dadurch gelöst.

Notabene
quelle
Problem ist bei GeForce 9400M, nicht beim iPhone. Diese Erweiterung ist für mich nicht verfügbar.
Martin Pilch
Dies ist definitiv KEIN Problem, das durch Cubemaps verursacht wird, unabhängig davon, ob diese nahtlos sind oder nicht. Dies ist ein Texture Wrapping-Problem.
Tara,
0

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.

Simon F
quelle