Direct3D 2D Zeichnen missachtet rasterization rules?
-
Ich mache mich gerad eüber den 2. Anlauf meines GUIs und sitze hier gerade an eienr Frage die ich mir nicht erklären kann. Ich habe eine 32x32 Pixel Textur die ich 2x nebeneinander Zeichne, beim linken ist x 0,31 und beim rechten 32,63. Was ich etwas komisch fidne ist der Rand. Dazu folgende Bilder (solten zum Anschaun vergrößert werden)
Sampler MipFilter none und Min/Mag Point
http://img199.imageshack.us/img199/8704/point.pngHier ist der Rand leicht dunkler braun (auf der Textur ist er schwarz) hier frage ich mich wieso die rasterization Rules nicht greifen, nach denen solte ja vom endprodukt eigentlich die Kanten links und oben sichtbar und der Rest weg sein.
Sampler MipFilter linear und Min/Mag anisotropisch
http://img190.imageshack.us/img190/6711/linearuanisotropisch.pngHier sieht man das ganze noch etwas besser, die Textur wird gequetscht und der Rand sieht Matschig aus.
Wireframe
http://img269.imageshack.us/img269/7909/wireframe.pngAls Wireframe hingegen Passen die Pixel genau.
So sollte das ganze eigentlich aussehen:
http://img200.imageshack.us/img200/1157/richtig.pngHier habe ich alle 3Ecke um 0.5 in jede Richtung ausgedehnt. Da ich das GUI am Ende aber resizen will ist die Lösung auch nicht optimal, da entstehen dann trotzdem nicht ganz so schöne Übergänge wenn das GUI für eine kleinere Auflösung berechnet wurde.
Was ich suche ist der Grund wieso das Ganze den Rasterization Rules nicht folgt sondern einfach den Rand mit dem vorher gerenderten (in diesem Fall eine Skybox) mischt. Alphablening ist aus (und hätte ja ohnehin keinen Beitrag weil das Alpha der Textur 1.0f ist), und rein logisch sollte ja hier eigentlich alles oder nichts gelten, entweder der neue Pixel reicht ins zentrum und ist dran oder er tut es nicht.
-
welche API genau?
-
Windows API
Edit:
Oder etwas präzieser, ein Standard DirectX Programm dh also WinAPI und DirectX alle Zeichenvorgänge mit DirectX und im Fullscreen, WINAPI nur fürs Fenster.
-
deine rechtecke sind 32.5 pixel auseinander, deswegen die luecke
32texel -> 32pixel, nicht mehr oder weniger.d3d hat in verschiedenen versionen auch verschiedene rasterizer rules.
-
Ich glaub du verstehst mich da etwas falsch. Ich hab mir die rasterization Rules angeschaut und die sagen für D3D9 ganz Klar wenn ich ein Rechteck mit den Koordinaten 0,0 udn 5,5 zeichnen will bekomme ich ein 5x5 Pixel großes Rechteck, Jede Rechteck Seite würde jeweils exakt durchs pixelzentrum schneiden und nach der oben-links regel würden alle Pixel deren zentrum ich oben under links schneide meinem Rechteck gehören. Wenn ich mir aber das was hier gerendert wurde anschaue dann greift diese regel ja garnicht, würde ich hier ein Rechteck mit 0,0 5,5 zeichnen würde ich ein 4x4Rrechteck bekommen (1,1 4,4) mit einem Pixel Rand der einen Mix aus meinem Texturrand und dem Hintergrund darstellt. Mich interessiert wieso ich diesen Bunten Partymix bekomme statt dem was eigentlich nach den rasterization Rules gültig wäre, lediglich wenn ich das Pixel mit +0,5 in jede Richtung komplett in Besitz nehme bekomme ich was ich will.
-
also d3d9, dann sind wir ja schon einen schritt weiter.
es kann ja sein, dass ich und d3d dich missverstehen, aber da ich und d3d uns einig sind, wirst du dich anpassen muessen.
wenn du von 0|0 bis 5|5 zeichnest, wirst du genau 4*4 pixel gefuellt bekommen. der fehler der bei dir dann zusaetzlich auftaucht (oben links auf dem ersten bild) hat also noch andere gruende.
ich empfehle dir das erstmal ohne texturen hin zu bekommen. geh sicher dass in deinem treiber antialiasing ausgeschaltet ist und dass du wirklich pixel genau ausgeben kannst. loesche z.b. den hintergrund schwarz und zeichne pixelweise ein schachfeld aus weissen pixeln (jeweils zwei dreiecke), wenn du dann irgendwo einen moire effekt siehst, hast du was beim matrix setup falsch.
viel glueck
-
Das mit dem Schachbrett brauch ich nicht, dein Post enthielt bereits die Lösung. Ich lasse immer mit Antialiasing rendern, hab aber nicht gedacht das das diese Auswirkung nach sich zieht, wenn ich das AA ausknipse bekomme ich genau das Ergebniss das die Rasterization Rules angeben. Danke für den Tip.
-
selbst mit antialiasing sollte es zumindestens zwischen den quads keine luecke geben (sieht man ja beim normalen rendern von 3d geometrie auch nicht).
-
Naja die Lücke ansicht ist ja keine Echte Lücke sondern der Rand der textur hat schon einfluß, aber nur zu nem kleinen Teil. Ich hab mich jetzt erstmal für die Finallösung entschieden das ich den Pixel ganz für mich beanspruche, also meinen Renderbereich um 0.5 in ejde Richtung ausdehne, damit hebel ich das Aliasing aus und es sieht anständig aus, erscheint mir im moment als die beste Lösung.