Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   OpenGL 2D - Texturen laden (https://www.delphipraxis.net/164120-opengl-2d-texturen-laden.html)

Destroxi 29. Okt 2011 10:35

OpenGL 2D - Texturen laden
 
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

Jens01 29. Okt 2011 11:15

AW: OpenGL 2D - Texturen laden
 
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

Aphton 29. Okt 2011 11:16

AW: OpenGL 2D - Texturen laden
 
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)

Namenloser 29. Okt 2011 11:17

AW: OpenGL 2D - Texturen laden
 
Zitat:

Zitat von Aphton (Beitrag 1133346)
Du willst also in 2D zeichnen, warum verwendest du dann glVertex3f?

Auch bei 2D kann die kostenlose Z-Sortierung praktisch sein.

Destroxi 29. Okt 2011 13:47

AW: OpenGL 2D - Texturen laden
 
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?

Aphton 29. Okt 2011 16:26

AW: OpenGL 2D - Texturen laden
 
Jetzt hast du das Erstellen der Textur herausgenommen; die Frage ist, warum? Willst du nicht eine Textur anzeigen?

Destroxi 29. Okt 2011 16:48

AW: OpenGL 2D - Texturen laden
 
Achja klar^^

Ich packs ma wd rein...

€: Jetzt gehts *juhu* ;)

Cicaro 30. Okt 2011 22:37

AW: OpenGL 2D - Texturen laden
 
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.
Zitat:

Zitat von Destroxi (Beitrag 1133340)
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:06 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