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

Aktuelle Zeit: Do Apr 25, 2024 12:47

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



Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: OpenGL in 2D
BeitragVerfasst: Sa Okt 02, 2010 16:46 
Offline
DGL Member

Registriert: Mo Jul 20, 2009 14:52
Beiträge: 37
Hallo,

ich habe mich mit dem Tutorial für OpenGL für 2D befasst und habe einige Probleme damit.
Ich habe es geschafft, die Textur anzeigen zu lassen, jedoch wird sie immer noch perspektivisch dargestellt.
Wenn OpenGL erfolgreich auf 2D umgestellt hat, müsste sich der Z-Wert ja nicht auf die Größe der Objekte auswirken, was er jedoch tut.

Meine Frage: An welcher Stelle muss ich
Code:
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glViewport(0,0,ClientWidth,ClientHeight);
  glOrtho(0,640,0,480,0,128);
einsetzen?

Meine Render-Procedure sieht so aus:
Code:
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);

  glEnable(GL_TEXTURE_2D);
  glEnable(GL_ALPHA_TEST);
  glAlphaFunc(GL_GREATER, 0.5);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;

  glTranslatef(0, 0, -5);

  glBindTexture(GL_TEXTURE_2D, textures.sprite);

  glBegin(GL_QUADS);
    glTexCoord2f(0,1); glVertex3f(mx * 6 - 3 -  1,my * 6 - 3 -  1, 1);
    glTexCoord2f(1,1); glVertex3f(mx * 6 - 3 +  1,my * 6 - 3 -  1, 1);
    glTexCoord2f(1,0); glVertex3f(mx * 6 - 3 +  1,my * 6 - 3 +  1, 0);
    glTexCoord2f(0,0); glVertex3f(mx * 6 - 3 -  1,my * 6 - 3 +  1, 0);
  glEnd;

  SwapBuffers(DC);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL in 2D
BeitragVerfasst: Sa Okt 02, 2010 17:13 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
In deiner Render-procedure rufst du gluPerspective auf. Ich schätz mal, dass deine perspektivische Verzerrung von da kommt. das glOrtho dürfte nämlich statt gluPerspective hingehören.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL in 2D
BeitragVerfasst: Sa Okt 02, 2010 17:36 
Offline
DGL Member

Registriert: Mo Jul 20, 2009 14:52
Beiträge: 37
Jetzt sehe ich die Textur nicht mehr.

Code:
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glViewport(0,0,ClientWidth,ClientHeight);
  glOrtho(0,640,0,480,0,128);

  glEnable(GL_TEXTURE_2D);
  glEnable(GL_ALPHA_TEST);
  glAlphaFunc(GL_GREATER, 0.5);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;

  glTranslatef(0, 0, -5);

  glBindTexture(GL_TEXTURE_2D, textures.sprite);

  glBegin(GL_QUADS);
    glTexCoord2f(0,1); glVertex3f(mx * 6 - 3 -  1,my * 6 - 3 -  1, 1);
    glTexCoord2f(1,1); glVertex3f(mx * 6 - 3 +  1,my * 6 - 3 -  1, 1);
    glTexCoord2f(1,0); glVertex3f(mx * 6 - 3 +  1,my * 6 - 3 +  1, 0);
    glTexCoord2f(0,0); glVertex3f(mx * 6 - 3 -  1,my * 6 - 3 +  1, 0);
  glEnd;

  SwapBuffers(DC);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL in 2D
BeitragVerfasst: Sa Okt 02, 2010 18:10 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Ich glaube, hiermit:
Code:
glTranslatef(0, 0, -5);
bewegst du dich aus dem View-Frustum raus, sodass die Near-Clipping-Plane dein Quad wegcullt. Ersetze die -5 doch einfach mal durch 5.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL in 2D
BeitragVerfasst: Sa Okt 02, 2010 18:13 
Offline
DGL Member

Registriert: Mo Jul 20, 2009 14:52
Beiträge: 37
hm, es ändert sich nichts.
die textur wird nicht mehr angezeigt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL in 2D
BeitragVerfasst: Sa Okt 02, 2010 18:51 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Wie groß ist denn dein mx und dein my ungefähr? wenn jetzt nämlich deine Vertexdaten zB alle zwischen 0 und 1 liegen (wo man ja bei Perspektive durchaus noch was sieht), ist das ganze höchstens 4 Pixel groß, weil bei Ortho werden die Vertexdaten in Pixel angegeben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL in 2D
BeitragVerfasst: Sa Okt 02, 2010 18:59 
Offline
DGL Member

Registriert: Mo Jul 20, 2009 14:52
Beiträge: 37
mx und my liegen zwischen 0 und 1 und geben die Mausposition wieder.
Das habe ich probeweise eingebaut, um zu sehen, wie sich die Werte auf das Bild auswirken.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL in 2D
BeitragVerfasst: Sa Okt 02, 2010 19:17 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
sry, mx und my haben mit der größe ja nix zu tun. aber dein quad is ja genau 2x2 pixel groß! und so, wie das mit mx und my aussieht können die koordinaten leicht alle negativ werden. Dann siehst du auch nix.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL in 2D
BeitragVerfasst: Sa Okt 02, 2010 19:38 
Offline
DGL Member

Registriert: Mo Jul 20, 2009 14:52
Beiträge: 37
Aber mit dem im ersten post geposteten code funktioniert es ja immerhin so, dass man eine textur sieht.
und die textur ist immer etwa da, wo auch die maus ist.
und mit dem abgeänderten code ist die textur komplett verschwunden.

Warum eig. 2x2 Pixel?
Meine nächste Frage wäre dann, wie man die Position von Quads beeinflusst, weil es ja irgendwie relativ zur Größe der Ausgabefläche ist und 0|0 unten links liegt oder so.
Aber ich dachte mir, wenn 3D ausgeschaltet ist, erklärt sich das vllt von selbst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL in 2D
BeitragVerfasst: Sa Okt 02, 2010 20:19 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Hast du dir schonmal die Wiki-Seite zu glOrtho angesehen? Bei den Parametern, die du da in deinem Quelltext angibst, scheint es mir, als wolltest du dir das Umrechnen von Maus- zu Weltkoordinaten ersparen. Wenn du nämlich bei einer Auflösung von 640x480 renderst (im Fullscreen-Modus), kannst du dein Quad z.B. einfach so zeichnen:
Code:
  glBegin(GL_QUADS);
    glTexCoord2f(0,1); glVertex3f(mx - half_width,  my -  half_height,  1);
    glTexCoord2f(1,1); glVertex3f(mx + half_width,  my -  half_height,  1);
    glTexCoord2f(1,0); glVertex3f(mx + half_width,  my +  half_height,  1);
    glTexCoord2f(0,0); glVertex3f(mx - half_width,  my +  half_height,  1);
  glEnd;

half_width und half_height musst du natürlich noch deklarieren und solltest sie mit sinnvollen Werten füllen (z.B. 50), damit du überhaupt etwas siehst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL in 2D
BeitragVerfasst: Sa Okt 02, 2010 20:29 
Offline
DGL Member

Registriert: Mo Jul 20, 2009 14:52
Beiträge: 37
Ok, habe diesen Code jetzt übernommen, aber die Textur bleibt unsichtbar.
Ich sehe nur den blauen Hintergrund.

btw: ich kann irgendwie nicht verstehen, dass das nicht klappt, weil mein problem doch irgendwie nicht soo exotisch ist. ich bin doch wohl nicht der erste, der eine textur in einem 2D-Feld anzeigen möchte, und dazu das 2D-Tutorial verwendet :) ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL in 2D
BeitragVerfasst: Sa Okt 02, 2010 20:36 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Sorry, ich hatte vergessen zu erwähnen, dass bei meinem Code die Werte mx und my *nicht* zwischen 0 und 1, sondern echte Mauskoordinaten in Pixel sein sollten. :)

Des Weiteren (auch wenn das mit deinem Problem nichts zu tun hat) scheint dir der Unterschied zwischen Textur und Quad nicht ganz klar zu sein. Das Quad sind einfach zwei Dreiecke, deren Eckpunkte du angibst. Die Textur selbst ist ein Bild, dass du auf das Quad "klebst". Genau genommen, ist es also nicht die Textur, sondern das Quad, dass du bewegen willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL in 2D
BeitragVerfasst: Sa Okt 02, 2010 20:44 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ich glaube dein glortho befehl hat einen fehler

du schreibst

Code:
glOrtho(0,640,0,480,0,128);


wäre links, rechts, oben, unten, near, far

die wikki sagt aber das hier

left, right, bottom, top, znear, zfar

du müsstetst also schreiben

Code:
glOrtho(0,640,480,0,0,128);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL in 2D
BeitragVerfasst: Sa Okt 02, 2010 21:34 
Offline
DGL Member

Registriert: Mo Jul 20, 2009 14:52
Beiträge: 37
Habe es sowohl mit 0-1 er Pixeln, als auch mit 0-700 pixeln versucht, auch die veränderung der glortho-parameter hat nichts gebracht.
Allerdings wäre es auch unwahrscheinlich, dass dort das problem liegt, weil es ja im 3d modus alles halbwegs funktioniert hat (wenigstens das Bild war zu sehen...)
Zitat:
Des Weiteren (auch wenn das mit deinem Problem nichts zu tun hat) scheint dir der Unterschied zwischen Textur und Quad nicht ganz klar zu sein. Das Quad sind einfach zwei Dreiecke, deren Eckpunkte du angibst. Die Textur selbst ist ein Bild, dass du auf das Quad "klebst". Genau genommen, ist es also nicht die Textur, sondern das Quad, dass du bewegen willst.

Dem bin ich mir wohl bewusst. Da ich aber noch keine Erfahrung mit opengl habe, kann ich mich auch nicht so präzise ausdrücken. Sorry für das Missverständnis ;).

Naja ich bin aber schon ziehmlich enttäuscht von mir, dass ich schon so früh gescheitert bin.
Könnte vllt jemand ein funktionierendes Template posten, dann könnte ich nach Unterschieden suchen...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL in 2D
BeitragVerfasst: Sa Okt 02, 2010 22:58 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ok ich habs mir mal angeschaut und habe es auch hinbekommen also pass gut auf ;)


die renderprozedure sieht nun so aus

Code:
procedure TForm1.Render;
begin
  steps := steps + 1;
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glOrtho(0, ClientWidth, ClientHeight, 0, 0, 20);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;

  glBegin(GL_QUADS);
    glTexCoord2f(0,1); glVertex3f(mx - half_width,  my -  half_height,  -1);
    glTexCoord2f(1,1); glVertex3f(mx - half_width,  my +  half_height,  -1);
    glTexCoord2f(1,0); glVertex3f(mx + half_width,  my +  half_height,  -1);
    glTexCoord2f(0,0); glVertex3f(mx + half_width,  my -  half_height,  -1);
  glEnd;

end;


beachte das wir farclipping positiv angeben wärend wir beim zeichnen das Z negativ wählen

desweiteren war die reihenfolge der Vertexe falschherum, grundsätzlich solltest du die coordinaten gegen den uhrzeigersin angeben damit eventuelles Backface culkling dein quad nicht gleich filtert
mx und my übergibst du im OnMouseMove und half[...] sind const

die textur hab ich wieder mit textures.pas geladen

Code:
  Tex : gluInt;
[...]
  LoadTexture('Layer0.tga', Tex, False);
  glBindTexture(GL_TEXTURE_2D, Tex);


wenn du das alles so gemacht hast sollte es gehen

hier kannst du den gesammten code sehen

*Link*


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 38 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.220s | 19 Queries | GZIP : On ]