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

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

23.11.2014, 12:27

Inkonsistentes Offset bei Line Rasterization (GL und D3D)

( Toll, jetzt ist mein ganzer Text wieder verschwunden :cursing: )
Ich werde mich jetzt also kürzer fassen.

Ich will 2D Linien mit 'Pixel genauen Koordinaten' zeichnen. Das sieht bei GL und D3D aber leicht unterschiedlich aus.
Und bei GL sogar zwischen verschiedenen Treibern. Die Linien sind dann immer +/- 1 Pixel versetzt, je nach dem welche Grafik API und Treiber man gerade benutzt.
Dieses Offset scheint sich auch unterschiedlich auszuwirken, je nachdem ob die Linie horizontal oder vertikal gerendert wird.

Meine Frage: Kennt ihr dieses Problem auch und habt ihr einen Lösungvorschlag dafür?

Meine Idee wäre folgende: Ich schreibe eine Funktion "QueryLineOffset" die in einen Texture zwei Linien zeichnet.
Dann lade ich die Bilddaten von der GPU und analysiere diese (sollte bei einer 16x16 Texture nicht sehr lange dauern).
Diese Analyse soll dann die Offset Werte ermitteln.
z.B. wenn ich eine Linie an den Koordinaten { ( 2 | 2 ), ( 10 | 2 ) } zeichen, aber die Pixel ( 2 | 3 ) bis ( 10 | 3 ) gefüllt sind, dann weiß ich, dass der Versatz ( 0, 1 ) ist.
Dieses Offset wird dann in den "DrawLine" Funktionen verwendet.

Was haltet ihr von der Idee? Habt ihr eine Bessere?

PS: Mein Jubiläums Beitrag (1000) :D

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

23.11.2014, 12:31

Is mir noch nie begegnet.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

23.11.2014, 13:13

DirectX und GL nutzen zum Rasterisieren von Linien die sog. "diamond exit rule". Also zumindest tut das DirectX, für GL wird das Vorgehen vorgeschlagen aber dem Treiber viel Freiheit für die tatsächliche Implementierung gelassen:

Zitat


Because the initial and final conditions of the diamond-exit rule may be difficult to implement, other line segment rasterization algorithms are allowed, subject to the following rules:
  • The coordinates of a fragment produced by the algorithm may not deviate by more than one unit in either x or y window coordinates from a corresponding fragment produced by the diamond-exit rule.
  • The total number of fragments produced by the algorithm may differ from that produced by the diamond-exit rule by no more than one.
  • For an x-major line, no two fragments may be produced that lie in the same window-coordinate column (for a y-major line, no two fragments may appear in the same row).
  • If two line segments share a common endpoint, and both segments are either x-major (both left-to-right or both right-to-left) or y-major (both bottom-to-top or both top-to-bottom), then rasterizing both segments may not produce duplicate fragments, nor may any fragments be omitted so as to interrupt continuity of the connected segments.
@D13_Dreinig

Werbeanzeige