Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 20:05

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Bei Linien fehlt ein Pixel
BeitragVerfasst: Di Sep 16, 2008 22:22 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich zeichne im Ortho Modus einen Rahmen um eine Fläche.

Code:
  1.         for (int i = 0; i < 4; i++) {
  2.             if (borders[i] > 0) {
  3.                 gl.glLineWidth(borders[i]);
  4.                 gl.glColor4fv(borderColor[i],0);
  5.                 gl.glBegin(GL.GL_LINES);
  6.                 switch (i) {
  7.                 case 0:
  8.                       gl.glVertex2i( 0, 1);
  9.                       gl.glVertex2i( width-1, 1);
  10.                     break;
  11.                 case 1:
  12.                       gl.glVertex2i( width-1, 1);
  13.                       gl.glVertex2i( width-1, height);
  14.                     break;
  15.                 case 2:
  16.                       gl.glVertex2i( width-1, height);
  17.                       gl.glVertex2i( 0, height);
  18.                     break;
  19.                 case 3:
  20.                       gl.glVertex2i( 0, height);
  21.                       gl.glVertex2i( 0, 0);
  22.                     break;
  23.                 }
  24.                 gl.glEnd();
  25.                 gl.glLineWidth(1);
  26.             }
  27.         }


Wenn das Feld borders {1,1,1,1} enthält sieht man einen geschlossenen Rahmen. Wenn ich allerdings {0,1,1,0} (recht+unten} übergebe, fehlt links und oben jeweils ein Pixel. Wieso? Die Eckpunkte sind ja jeweils überlappend.
Und ich hab vorher ins Wiki geguckt. Da hab ich nix dazu gefunden. 8) ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 17, 2008 07:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hi ...

das Problem ist mir gut bekannt.
Ich hab es öfters bei Linestrips beobachtet, da fehlte immer sozusagen der letzte Pixel der letzten Linie.
Ich habe das einfach umgangen, indem ich die Linie einen Pixel länger gemacht habe, aber ob es dafür eine andere Lösung gibt weiss ich auch nicht.
Ich bin mir auch nicht mehr ganz sicher was das Problem hervorruft, könnte mir vorstellen, dass OpenGL versucht die Linien an den Enden 'abzurunden' oder so, bin mir aber auch nicht ganz sicher.

Gruß
Shai

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 17, 2008 09:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Dein Code ist auch nicht ganz nach zu vollziehen ^^.
Bei den X Angaben verwendest du 0-(n-1) und bei Y verwendest du 1-n.
Meines Wissens läuft bei OpenGL ein Bresenham Algorythmus, welcher aufjedenfall Start- und Endpunkt zeichnet.
Ich hab mich bei meiner GUI auch lange mit Rumgeplagt und am Ende war es ein Logikfehler(mal Border beachtet mal nicht und Scissor war auch nicht korrekt gefüttert).

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 17, 2008 09:47 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das die Wertebereiche unterschiedlich sind, soll jetzt mal niemanden verwirren. Fakt ist aber, dass alle linien zusammen einen geschlossenen Rahmen liefern. Einzeln aber die Linien scheinbar ein pixel zu kurz sind.
Solches Zeugs kann dich echt kirre machen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 17, 2008 21:09 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich hab das bei opengl.org gefunden:

Zitat:
One difficulty is that the line rasterization rules for OpenGL are designed to avoid multiple pixel hits when drawing connected line primitives. The reason for this is that multiple hits cause difficulties in using blending or stenciling algorithms to merge multiple primitives reliably. This means that if a rectangle is drawn with a GL_LINE_LOOP, the rectangle will be properly closed with no missing pixels, whereas if the same rectangle is drawn with a GL_LINE_STRIP, or independent GL_LINES there will likely be pixels missing and or multiple hits on the rectangle boundary at or near the vertices of the rectangle. A second issue is that OpenGL does use half integer pixel centers, whereas the native window system specifies pixel centers at integer boundaries. Application developers often incorrectly use integer pixel centers with OpenGL without compensating in the projection transform.


Aber was sagt mir das? Wie kann ich das beheben? Muss ich ein Pixel manuell zugeben?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 18, 2008 07:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
HI ...

keine Ahnung ob ich das jetzt richtig verstehe.
Aber ich lese daraus, dass eine Line von 1 - 10 (1D) die Pixel mit den Mittelpunkten 1.5 - 9.5 füllen soll (oder etwas der Art).
In dem Fall müsste es doch reichen einfach zu jeder Korrdinate 0.1 hinzuzuaddieren/abzuziehen um sicher zu stellen, dass der Pixel wirklich gefüllt wird, da es sonst sein kann, dass er durch Rundungsfehler oder einfach die angeborene Ungenauigkeit von floating point zahlen wegfällt.

Gruß
Shai

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 18, 2008 09:24 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Wenn ich mich recht entsinne gibt es im OpenGL Forum dazu einen Thread, da war, wie Shaijan sagte, dann sowas wie +0.5 oder so ähnlich drin allerdings geht auch einfach +1 bzw. -1.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 18, 2008 22:33 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hast du da nen Suchbegriff für mich. Ich hab gerade nix gefunden.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]