ich habe für mein Spiel eine Textur erstellt, die viele kleine Einzelbilder erstellt. Diese sollen nun teilweise gleichzeitig auf Quads augegeben werden.
Dazu habe ich mir folgende Funktion geschrieben:
Code:
type TexPos2f=packedrecord
X, Y:Real;
end;
type TexPos4f=packedrecord
Top, Bottom: TexPos2f;
end;
implementation
function cGameUtils.calculateTexFramePosition(pFrame, pSingleWidth, pSingleHeight, pTexWidth, pTexHeight:integer): TexPos4f;
Diese Funktion berechnet mir die Koordinaten für die Textur, je nach Größe der Bilder etc. Funktioniert auch soweit sehr gut.
Leider ist die Anzeige der Textur manchmal "ungenau". Am Rand des Quads ist dann ein 1-Pixel breiter Streifen zu sehen.
Nachdem ich mich hier mal dazu umgeschaut habe, habe ich dann den Texturmodus mal auf GL_NEAREST gestellt. Mit dieser Einstellung ist obiges Probolem tatsächlich nicht vorhanden. Aber leider sieht das eben bei weitem nicht so schön aus wie mit GL_LINEAR.
Ein weiterer Versuch, die Koordinaten als Currency statt real auszugeben verlief auch negativ.
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Das mit dem Linear und Nearest sind ja verschiedene Filter.
Da die aber nicht wissen, das es Teilbereiche sind, und wendet es daher aufs ganze Bild an.
Dadurch tritt der Effekt auf.
Als Schutzmassnahme solltest du einen 1-2 Pixel grossen Bereich um die Teilbereiche kopieren oder ähnlich.
Damit könntest du den Effekt verhindern.
Registriert: So Sep 26, 2004 05:57 Beiträge: 190 Wohnort: Linz
Hier wird beschrieben warum das Problem auftritt. Das mit den 1-2 Pixel Rand ist eine gute Lösung, muss aber nicht unbedingt sein. Ganz unten bei dem Link hast du folgende Formel:
0.5/Breite + Texel/Breite
für den Punkt für den ein Texel bei linearer Filterung angegeben wird.
Bsp:
Texturbreite = 64 Pixel
Texturhöhe = 128 Pixel
Du willst X-Coordinate von Pixel 0-15 und Y-Coordinate von 16-31
=> Texturcoordinaten
X-Links = 0.5 / 64 + 0
X-Rechts = 0.5 / 64 + 15 / 64
Y-Oben (oder unten je nach Sichtweise) = 0.5 / 128 + 16 / 128
Y-Unten = 0.5 / 128 + 31 / 128
Dann sollte es keine unerwünschten Ränder geben.
Problematisch kann es allerdings werden wenn du Mipmapping verwendest, da dann gluBuild2DMipmaps jeweils 4 Pixel interpoliert, wodurch du wiederum Ränder bekommen kannst. Ähnlich kann es dir ergehen wenn du keine Seitenlängen von 2^x hast und gluBuild2DMipmaps verwendest. In beiden Fällen hilft wiederum ein Rand für jede Grafik ... bis zu einem gewissen Grad zumindest.
Mitglieder in diesem Forum: 0 Mitglieder und 22 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.