AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OpenGL 2D - Texturen laden

Ein Thema von Destroxi · begonnen am 29. Okt 2011 · letzter Beitrag vom 30. Okt 2011
Antwort Antwort
Destroxi

Registriert seit: 29. Okt 2011
55 Beiträge
 
Delphi 7 Enterprise
 
#1

OpenGL 2D - Texturen laden

  Alt 29. Okt 2011, 10:35
Ich versuche mit einem Tutorial (http://wiki.delphigl.com/index.php/Tutorial_2D#Dateien) Texturen zu laden.

Es klappt allerdings nicht, ich sehe nur einen schwarzen Hintergrund und weiß nicht was ich falsch mache

Mein Quellcode:
Delphi-Quellcode:
var
  Form1: TForm1;
  DC: HDC;
  RC: HGLRC;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 BeanTex: glUInt;
begin
 InitOpenGL;
 DC := GetDC(Handle);
 RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
 ActivateRenderingContext(DC, RC);

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

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

 Application.OnIdle := Render;

 LoadTexture('Textures\Bean.tga', BeanTex, False);
 glBindTexture(GL_TEXTURE_2D, BeanTex);
end;

procedure TForm1.Render(Sender: TObject; var Done: Boolean);
begin
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity;

 glEnable(GL_CULL_FACE);
 glCullFace(GL_BACK);

 glBegin(GL_QUADS);
  glTexCoord2f(0,0); glVertex3f(-1, -1, 0);
  glTexCoord2f(1,0); glVertex3f(1, 1, 0);
  glTexCoord2f(1,1); glVertex3f(1, 1, 0);
  glTexCoord2f(0,1); glVertex3f(-1, -1, 0);
 glEnd;

 SwapBuffers(DC);

 Done := False;
end;
Ich weiß nicht wie ich die Textur auf das Quad beziehe aufjedenfall klappt es nicht...

Destroxi
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
670 Beiträge
 
#2

AW: OpenGL 2D - Texturen laden

  Alt 29. Okt 2011, 11:15
Ich weiss es nicht genau, aber Du bindest die Textur im Create mit einer lokalen Variable. Versuch doch mal die Textur vor dem glBegin zu binden und die Variable irgenwie global zu setzen.
Ein Tipp ist glBitmap
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: OpenGL 2D - Texturen laden

  Alt 29. Okt 2011, 11:16
Kuck dir mal deine Vertexkoordinaten genauer an.
Du zeichnest kein Quad, sondern eine Linie.
Weiters musst du beim Zeichnen, sofern Culling aktiv ist (Backface-Culling in deinem Fall) im richtigen Uhrzeigersinn zeichnen!

Ach was mir gerade beim Schreiben auffällt:
glOrtho(0,640,0,480,0,128);
Du willst also in 2D zeichnen, warum verwendest du dann glVertex3f?

Edit: @Vorgänger
OpenGL ist imho eine riesen Statemachine, dh. wenn er ihr mitteilt, dass die Texture mit der ID "BeanTex" (Zahl) ab "jetzt" verwendet werden soll, so macht es nichts aus, wo er die Variable hat, sofern er sie nie wieder gebraucht. Schlechter Programmierstil - die Texturen müssen wieder freigegeben werden, daher in eine globale Variable speichern und per entsprechendem OpenGL Befehl freigeben!
(Was ich damit sagen wollte, ist, dass es nicht daran liegt)
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (29. Okt 2011 um 11:19 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: OpenGL 2D - Texturen laden

  Alt 29. Okt 2011, 11:17
Du willst also in 2D zeichnen, warum verwendest du dann glVertex3f?
Auch bei 2D kann die kostenlose Z-Sortierung praktisch sein.
  Mit Zitat antworten Zitat
Destroxi

Registriert seit: 29. Okt 2011
55 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: OpenGL 2D - Texturen laden

  Alt 29. Okt 2011, 13:47
Mhhh...
Habe es jetzt so:

Delphi-Quellcode:
var
  Form1: TForm1;
  DC: HDC;
  RC: HGLRC;
  BeanTex: glUInt;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 InitOpenGL;
 DC := GetDC(Handle);
 RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
 ActivateRenderingContext(DC, RC);
 Application.OnIdle := Render;
end;

procedure TForm1.Render(Sender: TObject; var Done: Boolean);
begin
 glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, BeanTex);

 glEnable(GL_ALPHA_TEST);
 glAlphaFunc(GL_GREATER, 0.1);

 glEnable(GL_CULL_FACE);
 glCullFace(GL_GREEN);

 glBegin(GL_QUADS);
  glTexCoord2f(0,0); glVertex2f(0,0);
  glTexCoord2f(1,0); glVertex2f(1,0);
  glTexCoord2f(1,1); glVertex2f(1,1);
  glTexCoord2f(0,1); glVertex2f(0,1);
 glEnd;

 SwapBuffers(DC);

 Done := False;
end;
Aber ich sehe nur weiß?
Warum?
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: OpenGL 2D - Texturen laden

  Alt 29. Okt 2011, 16:26
Jetzt hast du das Erstellen der Textur herausgenommen; die Frage ist, warum? Willst du nicht eine Textur anzeigen?
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Destroxi

Registriert seit: 29. Okt 2011
55 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: OpenGL 2D - Texturen laden

  Alt 29. Okt 2011, 16:48
Achja klar^^

Ich packs ma wd rein...

€: Jetzt gehts *juhu*
  Mit Zitat antworten Zitat
Cicaro

Registriert seit: 9. Feb 2005
285 Beiträge
 
Delphi 7 Personal
 
#8

AW: OpenGL 2D - Texturen laden

  Alt 30. Okt 2011, 22:37
Ist die Frage beantwortet ?

Wenn nicht: es gibt eine Menge Fehlerquellen, wenn man etwas in OpenGL darstellen möchte, aber es nicht klappt. Was mir immer wieder passiert ist, dass ich vergesse die Alpha Werte richtig zu setzen und sie die ganze Zeit auf 0 stehen. Logischerweise sieht man dann nix. Aber ich glaub bei dir wird die Textur viel zu klein gezeichnet.
glViewport(0,0,ClientWidth,ClientHeight);
glOrtho(0,640,0,480,0,128);

glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex3f(-1, -1, 0);
glTexCoord2f(1,0); glVertex3f(1, 1, 0);
glTexCoord2f(1,1); glVertex3f(1, 1, 0);
glTexCoord2f(0,1); glVertex3f(-1, -1, 0);
glEnd;
mit glOrtho hast du die Welt Koordinaten an Pixeln ausgerichtet und zeichnest die Textur zwischen -1 und 1 (1 bzw 2 Pixel), also sehr klein. Oder versuch beim Zeichen statt z = 0, z = 1 zu verwenden. Das liegt dann IM zFar-zNear bereich und nicht am Rande.

Nachtrag: bei den 4 glVertex3f()-Aufrufen solltest du 4 Eckpunkte der Zeichnung angeben, du hast da aber nur 2 (-1, -1, 0) und (1, 1, 0).

MfG

Geändert von Cicaro (30. Okt 2011 um 22:40 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz