Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

18.03.2014, 21:29

OpenGL Texture Matrix

Liebe Community,

momentan benutze ich eine Texturen-Matrix, um Textur-Koordinaten für ein Tileset zu skalieren, was allgemein auch gut funktionert. Allerdings erhalte ich seltsame schwarze Linien mitten ins Bild gezeichnet. Das Ändern des Texturen-Wrap-Modes von GL_CLAMP_TO_EDGE auf GL_REPEAT nützt auch nichts. Die Hintergrundfarbe ist es auch nicht. Ich habe alle Positionen kontrolliert, und auch die Texturen-Matrix ist in Ordnung:


(Link)


Hier noch die benutzte Texturen-Matrix (Als Input werden Textur-Koordinaten von 0.0 - 1.0 benutzt). Das Tileset besitzt 16 Tiles in der Breite, und 16 Tiles in der Höhe:
§ \begin{bmatrix} 0.0625 & 0.0 & 0.0 & 0.0 \\ 0.0 & 0.0625 & 0.0 & 0.0 \\ 0.0 & 0.0 & 1.0 & 0.0 \\ 0.0 & 0.0 & 0.0 & 1.0 \end{bmatrix} §

Womit kann dieses Artefakt zusammenhängen?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

18.03.2014, 21:42

Erscheint diese Linie immer genau dort?
Dreht sie sich mit, wenn du das Objekt oder die Kamera drehst?

3

18.03.2014, 21:43

Wenn ich die Kamera verschiebe, bewegt sie sich vertikal mit. Horizontal bleibt sie immer genau dort. Wenn ich die Kamera drehe, verschwindet die Linie, und taucht nur bei bestimmten Winkeln wieder auf.

Hier ein paar weitere Bilder:

[Linie ist weg, bei einer Drehung von 45.0°]

(Link)


[Linie erscheint in Farbe des Nachbar-Tiles bei 270°]

(Link)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »EuadeLuxe« (18.03.2014, 21:50)


4

18.03.2014, 21:50

Füge ein paar Texel hinzu, die als Rand fungieren. Mit anisotropischer Filterung muss dieser Rand größer sein. In diesem Fall scheint einer der Größe 1 ausreichen.

MfG
Check

5

18.03.2014, 21:51

Du meinst, ich soll einen Wert >1 für die Textur-Koordinaten nehmen? Aber würde das nicht evtl. unschöne Ergebnisse mit sich ziehen? (Probiere ich gleich mal aus) Oder soll ich die Textur vergrößern, also eine Art "Randbuffer" einbauen?

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

6

19.03.2014, 12:26

Das heißt anstatt z.B. die Texturkoordinaten 0|0 1|0 1|1 und 0|1 zu nutzen solltest du eher sowas wie 0.01|0.01 0.95|0 oder was weiß ich nutzen.
Dadurch hast du noch einen kleinen Rand und keine Linien an den Rändern die wohl durch Präzisionsverlust enstehen.

Errechnen könntest du ja einen 1px Rand mit 1/Breite oder 1/Höhe.

7

19.03.2014, 21:56

Danke für Eure Tipps, ich werd's versuchen :) .
Kann mir noch jemand erklären, wodurch dieser Fehler bedingt wird? Was ist der Auslöser?

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

8

19.03.2014, 22:33

Floating point Präzision?
Könnte natürlich auch wo anders liegen, aber gerade bei 2D Flächen ist das schnell sichtbar.

[Edit] Oh an das unter mir hatte ich gerade gar nicht gedacht. Ist aber wahrscheinlicher ^^

9

19.03.2014, 22:34

Das hat damit zu tun wie lineares Texture Filtering funktioniert.
Jeder Punkt der Textur, der nicht exakt im Zentrum eines Texels liegt, wird linear mit vier anderen, angrenzenden Punkten angenähert, was dann natürlich auch mal zu solchen Linien führen kann.
Die anisotropische Filterung verändert die Form des Samples in Abhängigkeit zum Winkel des Objekts.
Veranschaulicht:

(Link)

Quelle: .arcsynthesis.org


MfG
Check

stef

Treue Seele

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

10

20.03.2014, 10:10

Ich hatte das Problem mit den Linien mal weil meine Texturkanten nicht genau 2^n Pixel hatten.
Also zum Beispiel 1024*1029 an Stelle von 1024*1024.
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

Werbeanzeige