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

Aktuelle Zeit: Fr Jul 18, 2025 12:34

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Pixelgenau Zeichnen
BeitragVerfasst: Do Jan 08, 2009 16:48 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
In meinem Programm habe ich ein 2-dimensionales "Spielfeld", das unter Verwendung von glOrtho dann natürlich auch zweidimensional gezeichnet wird.
Das Problem ist, dass die einzelnen Teile nur sehr klein sind (4-9 Pixel).

Die Frage ist nun: Wie zeichne ich das möglichst schnell.

Am Anfang hatte ich alles als kleine Quads, das ging recht schnell, allerdings sah das Ergebnis auf verschiedenen Rechnern unterschiedlich aus.
Dann hab ich es heute mal mit glBitmap versucht, was aber um einiges langsamer ist. Außerdem kann man die Pixel da wohl nicht so schön texturieren (zumindest hab ich es nicht hinbekommen).

Bevor ich jetzt weitermache und andere Möglichkeiten ausprobiere, wollte ich fragen welche Alternativen ihr für mein Problem seht, die vllt auch noch schnell sind.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 17:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Inwiefern sah es unterschiedlich aus? Eigentlich sollte das ganze einheitlich sein, sofern du deine OpenGL-Einstellungen entsprechend genau definiert hast (so dinge wie Texturfilterung (Linear, Nearest), Polygon Smooth (nicht zu empfehlen)...)

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 17:27 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Lord Horazont hat geschrieben:
Inwiefern sah es unterschiedlich aus? Eigentlich sollte das ganze einheitlich sein, sofern du deine OpenGL-Einstellungen entsprechend genau definiert hast (so dinge wie Texturfilterung (Linear, Nearest), Polygon Smooth (nicht zu empfehlen)...)

Gruß Lord Horazont


Polygon Smooth kenn ich nichtmal und am Texturfilter lag es auch nicht.
Hm wie beschreib ich das am besten? Du kennst das doch sicher wenn man mit GL_LINES zeichnet das am Ende ein Pixel fehlt, ich denke bei meinen Primitiven war das genauso. OK bei normalen Quads vllt nicht, aber ich hab auch Dreiecke mit Quads gezeichnet, also 2 Ecken zusammengelegt. damit ich nicht dauern von GL_QUADS auf GL_TRIANGLES wechseln muss.
Und wenn ich dann ein Dreieck zB mit den Koordinaten (0,0),(2,0) und 2mal (1,1) zeichne kommt da nicht wirklich ein Dreieck raus. Deshalb hab ich die Koordinaten angepasst. Als ich das dann auf dem anderen PC probiert habe passte das aber nicht mehr.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 18:41 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Mach mal bitte zwei Screenshots und gib den interessanten Code an. So kommen wir schneller zum Ziel.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 19:50 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ich kann grad nicht an den 2ten Computer, für einen Vergleich, aber die Bilder dazu reich' ich bei Bedarf noch nach.

Alles dreht sich eigentlich um ein 3x3 Pixel großes Feld, von dem dann unterschiedliche Pixel ausgefüllt werden sollen.
Hier sind mal ein paar Beispiele (links im Bild wie es sein soll, rechts wie es gezeichnet wird):

Bilder oben:
Code:
  1.  
  2.     //soll richtiges Bild erzeugen
  3.     glVertex3f(x*3+1,y*3,depth);
  4.     glVertex3f(x*3+2,y*3+1,depth);
  5.     glVertex3f(x*3+1,y*3+2,depth);
  6.     glVertex3f(x*3,y*3+1,depth);
  7.    
  8.     //erzeugt wirklich das richtige Bild
  9.     glVertex3f(x*3+2,y*3,depth);
  10.     glVertex3f(x*3+3,y*3+2,depth);
  11.     glVertex3f(x*3+2,y*3+3,depth);
  12.     glVertex3f(x*3,y*3+2,depth);
  13.  

Bilder mitte:
Code:
  1.  
  2.     //soll richtiges Bild erzeugen
  3.     glVertex3f(x*3,y*3,depth);
  4.     glVertex3f(x*3+2,y*3,depth);
  5.     glVertex3f(x*3+2,y*3+2,depth);
  6.     glVertex3f(x*3,y*3+2,depth);
  7.    
  8.     //erzeugt wirklich das richtige Bild
  9.     glVertex3f(x*3,y*3,depth);
  10.     glVertex3f(x*3+3,y*3,depth);
  11.     glVertex3f(x*3+3,y*3+3,depth);
  12.     glVertex3f(x*3,y*3+3,depth);
  13.  

Bilder unten:
Code:
  1.  
  2.     //soll richtiges Bild erzeugen
  3.     glVertex3f(x*3,y*3+2,depth);
  4.     glVertex3f(x*3+1,y*3+1,depth);
  5.     glVertex3f(x*3+2,y*3+2,depth);
  6.     glVertex3f(x*3+2,y*3+2,depth);
  7.    
  8.     //erzeugt wirklich das richtige Bild
  9.     glVertex3f(x*3,y*3+3,depth);
  10.     glVertex3f(x*3+2,y*3,depth);
  11.     glVertex3f(x*3+3,y*3+3,depth);
  12.     glVertex3f(x*3+3,y*3+3,depth);
  13.  


PS: x und y sind integer, depth allerdings nicht, sollte aber keine Rolle spielen


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Zuletzt geändert von Schläfer am Fr Jan 09, 2009 00:00, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 23:54 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Nutzt du den Ortho Modus? Falls ja, wie hast du ihn definiert?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 23:57 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Flash hat geschrieben:
Nutzt du den Ortho Modus? Falls ja, wie hast du ihn definiert?


glOrtho(0,ClientWidth,ClientHeight,0,-128,128);

Edit: Bild oben aktualisiert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 09, 2009 00:09 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hmmm.... eventuell ist das ein Bresenham Problem. Der Bresenham Algo ist ja nicht symetrisch. Eventuell Ändert sich also dein Ergebnis sogar, wenn du die Punkte umgekehrt übergibst. Probier das mal. Eventuell kannst du so das Ergebnis von Rechenr 2 auf Rechner 1 nachbauen. :?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 09, 2009 00:46 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Flash hat geschrieben:
Hmmm.... eventuell ist das ein Bresenham Problem. Der Bresenham Algo ist ja nicht symetrisch. Eventuell Ändert sich also dein Ergebnis sogar, wenn du die Punkte umgekehrt übergibst. Probier das mal. Eventuell kannst du so das Ergebnis von Rechenr 2 auf Rechner 1 nachbauen. :?


Dummerweise bin ich gerade an "Rechner 2", auf dem ich kein Delphi hab. Allerdings würde das Umdrehen ja auch nicht das Problem lösen, sondern nur dabei helfen das Problem zu finden. Das die Quads rechts und unten eine Zeile zu wenig haben ist wohl auch kein Fehler sondern soll so sein. Wenn man mehrere Primitive aneinander zeichnet nimmt man ja auch das Ende des einen als den Anfang des Nächsten, grob gesagt, und nicht ein Pixel weiter links.
Das es ansonsten auch unterschiedlich aussieht, ist natürlich nicht so toll.

Ich denke mal GL_POINTS scheidet als schnelle Methode das Problem zu umgehen schonmal aus.
Eine andere frühe Idee war beim Start alle Kombinaten auszuprobieren bis die richtigen Koordinaten für den jeweiligen Computer gefunden sind. Was allerdings nicht besonders sauber ist. Wie gesagt, war eine frühe Idee.
VBOs machen wohl bei so wenigen Vertices, die sich auch noch ziemlich oft verändern, auch keinen Sinn.

Und die neueste Lösung die vllt funktionieren könnte, war immer nur das volle Quad zu zeichnen und über eine zweite Textur + Shader die Pixel rauszusuchen die wirklich gezeichnet werden sollen. Also eine Alphamaske. Solang dann nicht die zuordnung der Texel rumspinnt würde es das Problem zumindest beheben.
Vorteil wäre das nur noch simple Quadrate gezeichnet werden müssen, Nachteil das die Graka mehr zu tun hat und die Texturkoordinaten zusätzlich übertragen werden müssen.

Mein Hauptproblem war ja eigentlich viele kleine Primitive möglichst schnell zu zeichnen, wenn es allerdings keine schnellere Methode gibt, dann kann ich mich immernoch damit rumschlagen. Ansonsten würde ich das auch überspringen.

Edit: Umsortieren ändert nichts


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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 ]