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