Problem bei Software-Rasterizer (Texturen verzerrt)
-
Ich habe derzeit ein Problem mit meinem Software-Rasterizer, folgende Ebene aus zwei Dreiecken:
http://img845.imageshack.us/i/test2ohne.png/
wird mit einer Textur belegt:
http://img683.imageshack.us/i/test2z.png/
perfekt. Mache ich aus dem Quadrat jedoch ein Trapez:
http://img845.imageshack.us/i/test1ohne.png/
(Achtung, das ist wirklich ein Trapez, es liegt wie auch das Quadart auf einer Z-Ebene! Das ist *nicht* das Quadrat "nach hinten gedreht "!) Ich erhalte dann folgenden Textur"fehler":
http://img291.imageshack.us/i/test1yf.png/
Heißt das, dass ich nur affines Texture Mapping umgesetzt habe? Ich gebe aus dem "Vertex-Shader" eine Menge an floats zurück (darunter auch die Texturkoordinaten) die ich dann homogenisiere, dann beim Rasterizen linear interpoliere und kurz vor dem "Fragment-Shader" unhomogensiere. Jetzt dachte ich eigentlich, ich interpoliere damit schon "korrekt". Offenbar aber nicht.
Wieso nicht? Was muss ich da noch beachten? Hier bspw: http://www.gamedev.net/page/resources/_/reference/programming/140/texture-mapping/perspective-corrected-texture-mapping-r331 steht, dass ich vorher u und v durch z dividieren soll, aber da z bei mir immer gleich ist (und zwar 1) sehe ich da keinen Sinn dahinter. Auch ist da ja noch gar nichts "perspektivisch", das ist ja alles noch eben.
(Info: Wenn ich das Quadrat ein Quadrat sein lasse und einfach nach hinten drehe, dann klappt alles korrekt.)
Nachtrag: Es passiert alles in Software ohne OGL oder D3D, also Vertex-Shader bezieht sich eigentlich nur auf eine Methode und Fragment-Shader auch nur auf eine Methode in meinen Klassen.
MfG SideWinder
-
Ich weiß das ist nicht was du erwartest, aber imo schaut das schon korrekt aus. Der Gradient deiner Texturkoordinaten ist halt einfach unstetig. Perspektivisch korrekte Interpolation sollte egal sein wenn z konstant ist.
-
Das heißt ich habe das Problem, dass (wenn auch thematisch pro*jective* texture mapping ganz was anderes ist), hier auf Seite 2 beschrieben ist:
http://developer.nvidia.com/attach/6549
Wenn sich dagegen nichts unternehmen lässt - wieso sehen dann Trapeze in Computerspielen nicht so komisch aus? Oder vermeiden die jegliches Trapez? Von so einer Regel hätte ich nämlich noch nie gehört.
Sieht das dann in OGL/D3D genauso aus?
MfG SideWinder
-
SideWinder schrieb:
Wenn sich dagegen nichts unternehmen lässt - wieso sehen dann Trapeze in Computerspielen nicht so komisch aus?
Weil die Texturkoordinaten dort so gewählt sind dass keine solchen Unstetigkeiten auftreten.
SideWinder schrieb:
Sieht das dann in OGL/D3D genauso aus?
Jap
Schneid das Quad mal mit den gleichen Koordinaten anders rum auf, ich könnte mir vorstellen dass der Effekt dann schon etwas geringer wird.
-
Perspective-Correct Interpolation:
alpha1,2,3 sind die baryzentrischen Koordinaten des projizierten Dreiecks, rhw ist 1/(Abstand zum Projektionszentrum im Kameraspace)
output_fragment.textureCoordinates.x = v1.textureCoordinates.x * v1.rhw * alpha1 + v2.textureCoordinates.x * v2.rhw * alpha2 + v3.textureCoordinates.x * v3.rhw * alpha3; output_fragment.textureCoordinates.x /= (v1.rhw * alpha1 + v2.rhw * alpha2 + v3.rhw * alpha3);
-
Sich dir das "Paper" hier:
Perspective-Correct Interpolation
Kok-Lim Low
Department of Computer Science
University of North Carolina at Chapel Hill
-
Es geht ihm aber nicht um perspective correct Interpolation. Da z in seinem Fall über das Polygon konstant ist macht es hier auch absolut keinen Unterschied ob perspective correct oder nicht. Das Problem ist einfach dass seine Texcoords so wie das Quad zerlegt ist unstetig sind (genaugenommen ihr Gradient), daran ändert auch perspective correct Interpolation nix
-
ups... sorry - sollte nicht nur die Titel der Beiträge lesen