Einzelnen Beitrag anzeigen

Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#1

[OpenGL+GLFW] Texturen werden nicht genutzt

  Alt 9. Jun 2009, 16:13
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
Miniaturansicht angehängter Grafiken
error_371.jpg  
Angehängte Dateien
Dateityp: zip task_200.zip (127,7 KB, 5x aufgerufen)
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat