[OpenGL] Texel, Interpolation, Genauigkeit

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

[OpenGL] Texel, Interpolation, Genauigkeit

Beitrag von Zudomon »

Ich habe Probleme mit dem erstellen von genauen Texturen.

Ausgangsszenario:
Ein Steinmodell soll erstellt werden. Dazu dient ein Würfel als Basis, weil ich dessen 6 Flächen einfach auf eine Textur mappen kann. Dabei werden zwei Reihen mit jeweils drei Spalten genutzt. Um nun die Textur zu dem Objekt zu erstellen, wird über einen VertexShader die Texturkoordinaten als Position verwendet. Im PixelShader ist dann zu jedem Texel die Position im Raum interpoliert und die entsprechende Färbung kann erstellt werden. Das ganze wird kritisch, weil auch eine Displacementmap erstellt wird. Wenn nun die Werte nicht alle exakt sind, zerreißt es das Objekt. Bevor ich nun da Verlängerungen an den Seams benutze, um das zu Kaschieren würde ich gerne die Genauigkeit der Werteerstellung verbessern.

Eigentliches Problem:
Scheinbar bekomme ich die Werte nicht exakt in den PixelShader. Das Problem liegt meiner Meinung nach darin, dass die Dreiecke gerastert, aber losgelöst davon immer das Texelzentrum für die Werteinterpolation herangezogen wird. Ich dachte ja, man könnte die Werteinterpolation korrigieren, indem die Positionen, die aus dem VertexShader kommen (die Koordinaten die für die Dreiecksrasteriziung genutzt werden) verschoben werden, das hat aber keinen Effekt. Erst wenn eine Koordinate eine Texelbreite überschreitet, wird das Dreieck entsprechend verschoben, aber die Interpolationswerte bleiben identisch (Fehlerbehaftet).

Veranschaulichung:
Es fällt mir nicht einfach, das Problem zu beschreiben. Ich versuche es noch ein bisschen zu veranschaulichen. Zu sehen ist zu Testzwecken die sehr kleine 64² Textur, die die Positionen eines Würfels darstellt. Der Würfel ist das oben genannte Basisobjekt. Dabei hat der Würfel die Raumkoordinaten von -1 bis 1, dargestellt ist fract() der interpolierten Position der Würfelfläche. Man sieht auch, dass zwischen den Flächen ein bisschen Abstand gelassen wurde. Eigentlich würde ich hoffen, dass, wenn ich den exakten Punkt erwische, ich dann auch die Extremwerte im Randbereich erwische. Sprich, dass in dem Bild die Ergebnispixel auch bei 0 los gehen und bei 255 enden (Wertebereich in der Textur). Da aber scheinbar besagtes Texelzentrum gesampelt wird, und zwar unabhänig davon, in welchem Subpixelbereich das Dreieck gerastert wird, bekomme ich die Randbereiche nicht exakt gesampelt.
20200408_1.png
20200408_1.png (5.83 KiB) 1653 mal betrachtet
Die eigentliche Frage ist nun, gibt es eine Möglichkeit, daran was zu ändern? Mir schweben unterschiedliche Lösungsansätze vor, allerdings sind die alle nicht wesentlich trivial, exakt und mehr getrickst als sonstwas. Besser wäre, wenn es dafür vernünftige Lösungen geben würde.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [OpenGL] Texel, Interpolation, Genauigkeit

Beitrag von Krishty »

Zudomon hat geschrieben: 09.04.2020, 12:04Das Problem liegt meiner Meinung nach darin, dass die Dreiecke gerastert, aber losgelöst davon immer das Texelzentrum für die Werteinterpolation herangezogen wird.

[…]
Die eigentliche Frage ist nun, gibt es eine Möglichkeit, daran was zu ändern?
Centroid
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten