Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [OpenGL+GLFW] Texturen werden nicht genutzt (https://www.delphipraxis.net/135353-%5Bopengl-glfw%5D-texturen-werden-nicht-genutzt.html)

BUG 9. Jun 2009 16:13


[OpenGL+GLFW] Texturen werden nicht genutzt
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Leute,

ich hab mal ein Problem mitgebracht.

Erstmal mein Programmaufbau:

Mein Hauptprogramm initialisiert GLWF und und initialisiert für den Eigengebrauch dglOpenGL und lädt dann Interfaces aus einer DLL, die das eigentliche Programminhalt darstellen.

Mein erstes Interface soll mehrere Bilder anzeigen ... aber daran scheitere ich schon.

Etwas Code:

Delphi-Quellcode:
procedure TSplash.init(owner: IGame);
begin
  FOwner := owner;
  initCommons; // <-- InitOpenGL
  // ...
  // OpenGL stuff
  glClearColor(0, 0, 0, 1);
  glDisable(GL_CULL_FACE);
  glDisable(GL_DEPTH_TEST);
  glEnable(GL_TEXTURE_2D);
  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
  // enter the matrix
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glOrtho(0, 800, 0, 600, 0.1, 10000);
  glMatrixMode(GL_TEXTURE);
  glLoadIdentity;
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
end;
Delphi-Quellcode:
procedure TSplash.tick;
begin
  case FState of
    fsLoad:
      begin
        FCurImgPath := FPath + FIni.ReadString('picture_'+IntToStr(FCurrent), 'file', '');
        FImageID := 0;
        glGenTextures(1, @FImageID);
        glBindTexture(GL_TEXTURE_2D, FImageID);
        if glfwLoadTexture2D(PChar(FCurImgPath), 0) = GL_FALSE then writeln('Unable to load texture:'#13#10' >', FCurImgPath);
        FState := fsIn;
        FTick := 0;
        FMaxTick := FIni.ReadInteger('picture_'+IntToStr(FCurrent), 'in', 1) div 16;
      end;
    fsIn:
      begin
        if FTick < FMaxTick then inc(FTick) else
        begin
          FState := fsShow;
          FTick := 0;
          FMaxTick := FIni.ReadInteger('picture_'+IntToStr(FCurrent), 'delay', 1) div 16;
        end;
      end;
    fsShow: // ...
    fsOut: // ...
    fsUnload:
      begin
        glDeleteTextures(1, @FImageID);
        if FCurrent >= FCount-1 then FState := fsDie
          else begin
            FState := fsLoad;
            inc(FCurrent);
          end;
      end;
    else FOwner.next;
  end;
end;
Delphi-Quellcode:
procedure TSplash.render;
begin
   while glgetError <> gl_no_error do writeln('... error before rendering!');
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  case FState of
    fsIn:  glColor4d(1, 1, 1, FTick/FMaxTick);
    fsShow: glColor4d(1, 1, 1, 1);
    fsOut: glColor4d(1, 1, 1, 1-FTick/FMaxTick);
    else exit;
  end;
  glBindTexture(GL_TEXTURE_2D, FImageID);
  glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f(  0,  0, -5);
    glTexCoord2f(1, 0); glVertex3f(800,  0, -5);
    glTexCoord2f(1, 1); glVertex3f(800, 600, -5);
    glTexCoord2f(0, 1); glVertex3f(  0, 600, -5);
  glEnd;
  while glgetError <> gl_no_error do writeln('... error after rendering!');
end;
Hier noch ein kleines Log:
Code:
===================================================
Opening the GLFW window:
===================================================

width: 800
height: 600
color: 8
alpha: 8
stencil: 8
depth: 24
fullscreen: off
vsync: on

Wait till window is shown ... done!

===================================================
Running the game ...
===================================================

Loading init ...
... init!
... run!
...... error after rendering!
 next (=> )!
... destroy!
Unloaded init!



Press [RETURN] to quit ...
Das Problem:

Der Code funktioniert in so weit, das er mir den Bildschirm weiß malt (also das Quad wird gepinselt).
Nur gibt es eben keine Texturen.

"...... error after rendering!" ist mir ein Rätsel, tritt aber nur beim ersten Aufruf der Methode Render auf.

glfwLoadTexture2D kehrt erfolgreich zurück und AFAIK sind auch alle nötigen OpenGL-Einstellungen getroffen.
(Ich benutze dglOpenGL und glfw aus dem Andorra "Prerequisite Package")


Vielleicht fällt ja einem von euch was ein/auf ...


MfG,
Bug

BUG 11. Jun 2009 11:35

Re: [OpenGL+GLFW] Texturen werden nicht genutzt
 
Liste der Anhänge anzeigen (Anzahl: 1)
~ PUSH ~
Keiner ne Idee, woran das liegen könnte?


EDIT1:

Die Merkwürdigkeit und das Fehlen der Textur kann ich reproduzieren. Ich hab mal ein ausführbares Testprogramm angehängt (mit Quellen).

Hier mein Ergebnis:
Code:
Start ...
after init: Kein Fehler
after gen texture: Kein Fehler
after bind texture: Kein Fehler
after load texture (1): Kein Fehler
before render quad (1): Kein Fehler
after render quad (1): Der Vorgang ist ungültig.
after render quad (1): Kein Fehler
before render quad (2): Kein Fehler
after render quad (2): Kein Fehler
Wenn jemand etwas abweichendes erhält, bitte melden ... vllt. liegt es ja nur an meinem System.
Wenn irgendwo im Quelltext was fehlt oder zu viel ist, bitte auch melden.


MfG,
Bug


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