Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 15, 2025 21:00

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: flic animation player
BeitragVerfasst: Mi Feb 01, 2006 19:32 
Offline
DGL Member

Registriert: Sa Okt 29, 2005 09:41
Beiträge: 12
hi leute,

ich versuche gerade einen player für flic animationen zu programmieren.
mein versuch mit hilfe von opengl einen player zu programmieren hat fehlgeschlagen(warum auch immer).
wenn ich nach jedem frame das bitmap object abspeichere,ist in der datei auch etwas vernünftiges drin
aber das opengl fenster ist die ganze zeit schwarz. auch die fps werden nicht mehr angezeigt.
kann mir bitte einer sagen wo ich einen fehler mache?

Code:
  1. procedure TGLForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  2. begin
  3.   // Farb- und Tiefenpuffer löschen
  4.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  5.  
  6.   // In die Projektionsmatrix wechseln
  7.   glMatrixMode(GL_PROJECTION);
  8.  
  9.   // Identitätsmatrix laden
  10.   glLoadIdentity;
  11.  
  12.   // Viewport an Clientareal des Fensters anpassen
  13.   glViewPort(0, 0, ClientWidth, ClientHeight);
  14.  
  15.   glOrtho(0, 320, 0, 200, 1, 128);
  16.  
  17.   // Perspective, FOV und Tiefenreichweite setzen
  18.   gluPerspective(60, ClientWidth/ClientHeight, 1, 128);
  19.  
  20.   // In die Modelansichtsmatrix wechseln
  21.   glMatrixMode(GL_MODELVIEW);
  22.  
  23.   // Identitätsmatrix laden
  24.   glLoadIdentity;
  25.  
  26.   glBindTexture(GL_TEXTURE_2D, flcAnim);
  27.  
  28.   glColor3f(0, 0, 0);
  29.  
  30.   glBegin(GL_QUADS);
  31.     glTexCoord2f(0.0, 1.0); glVertex2f(0, 0);
  32.     glTexCoord2f(1.0, 1.0); glVertex2f(flc_head.width, 0);
  33.     glTexCoord2f(1.0, 0.0); glVertex2f(flc_head.width, flc_head.height);
  34.     glTexCoord2f(0.0, 0.0); glVertex2f(0, flc_head.height);
  35.   glEnd();
  36.  
  37.   glFinish();
  38.  
  39. //  glDeleteTextures(1, @flcAnim);
  40.  
  41.   glMatrixMode(GL_PROJECTION);
  42.   glPopMatrix();
  43.  
  44.   glMatrixMode(GL_MODELVIEW);
  45.   glPopMatrix();
  46.  
  47.  
  48.   ShowText;
  49.  
  50.   // Hinteren Puffer nach vorne bringen
  51.   SwapBuffers(DC);
  52.  
  53.   // Windows denken lassen, das wir noch nicht fertig wären
  54.   Done := False;
  55.  
  56.   // Nummer des gezeichneten Frames erhöhen
  57.   inc(Frames);
  58.  
  59.   // FPS aktualisieren
  60.   if GetTickCount - StartTick >= flc_head.speed then
  61.   begin
  62.     //mit getNextFrame erzeuge ich im bitmap object das neue bild
  63.     //muss ich hier machen weil ich (flc_head.speed)msec verstreichen lassen muss
  64.     getNextFrame;
  65.     FPS       := Frames/(GetTickCount-StartTick)*1000;
  66.     Frames    := 0;
  67.     StartTick := GetTickCount
  68.   end;
  69. end;
  70.  
  71. procedure TGLForm.getNextFrame;
  72. var
  73.   data: PByteArray;
  74.   i,w:integer;
  75.   b:PByteArray;
  76. begin
  77. //  hier wird das nächste bild eingelesen
  78.   ...
  79.  
  80.   //zum testen ob überhaupt etwas vernünftiges im bitmap object enthalten ist
  81.   flc_bmp.SaveToFile('c:\text.bmp');
  82.  
  83.   getmem(data,flc_bmp.width*flc_bmp.height*4);
  84.   w:= flc_bmp.Width;
  85.   for i:=0 to flc_bmp.Height-1 do
  86.   begin
  87.     b:= flc_bmp.ScanLine[i];
  88.     move(b^,data^[i*w*4],w*4);
  89.   end;
  90.   glGenTextures(1, @flcAnim);
  91.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  92.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  93.   gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, flc_bmp.width, flc_bmp.Height, GL_RGBA, GL_UNSIGNED_BYTE, data);
  94.   FreeMem(data);
  95. end;
  96.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: flic animation player
BeitragVerfasst: Mi Feb 01, 2006 20:44 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
LordRayden hat geschrieben:
Code:
  1. glColor3f(0, 0, 0);

\":roll:\"
Du sagst ja auch, dass als Farbe schwarz verwendet werden soll \";)\"
Einfach mal mit:
Code:
  1. glColor3f(1, 1, 1);

ersetzen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 01, 2006 21:25 
Offline
DGL Member

Registriert: Sa Okt 29, 2005 09:41
Beiträge: 12
danke i0n0s

glColor3f(0, 0, 0);

war eines der gründe warum alles schwarz blieb!
2. die textur musste ich an einer anderen stelle binden damit es funkte
3.
Code:
  1. gluPerspective(60, ClientWidth/ClientHeight, 1, 128);

musste ich rausnehmen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 02, 2006 09:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Habe noch ein paar Anmerkungen.

In folgendem Code müssen die glPopMatrix Aufrufe raus, da du nirgendswo glPushMatrix aufrufst. Das könnte mitunter zu Problemen führen, je nachdem wie kleinlich die Implementation vom Treiber ist.
Code:
  1. glMatrixMode(GL_PROJECTION);
  2. glPopMatrix();
  3.  
  4. glMatrixMode(GL_MODELVIEW);
  5. glPopMatrix();


Alles andere Betrifft jetzt eher das Laden der Texturen.
Das PByteArray würde ich nicht benutzen, da es nach oben hin begrenzt ist. Wenn du ausversehen mal die Bereichsprüfung bei dir anstellst dürfte es auch einen Fehler geben.

gluBuild2DMipmaps würde ich auch nicht mehr benutzen. Das ist zwar in deinem Falle die einfachste Art es darzustellen aber das Video dürfte nicht so aussehen wie es sein sollte und Langsam ist es obendrein auch nocht. Ich würde empfehlen, dass du glTexImage2D benutzt. Und als TexturTarget anstelle von GL_TEXTURE_2D dann GL_TEXTURE_RECTANGLE_ARB. Damit es möglich Texturen zu laden die keine Breite/Höhe von einer Potenz von 2 haben. GluBuild2DMipmaps passt dieses zwar an aber dadurch wird ersten mehr speicher verbraucht als notwendig und die Texturdaten werden von ihm angepasst. Dass es langsam ist hatte ich ja schon mal gesagt. ;-) Und die erzeugten MipMaps brauchst du normal ja auch nicht. Also lieber TextureRectangle benutzen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 03, 2006 01:21 
Offline
DGL Member

Registriert: Sa Okt 29, 2005 09:41
Beiträge: 12
hi lossy ex,

danke für die tips! konnte ich aber irgendwie nicht umsetzen (fenster bleibt weiss).

Code:
  1. fRGBArray: array of TRGBQuad;


hiermit funzt es:
Code:
  1.   glGenTextures(1, @flcAnim);
  2.   glBindTexture(GL_TEXTURE_RECTANGLE_ARB, flcAnim);
  3.   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  4.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  5.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  6.   gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, flc_head.width, flc_head.Height, GL_RGBA, GL_UNSIGNED_BYTE, @fRGBArray[0]);


hiermit nicht:
Code:
  1.   glGenTextures(1, @flcAnim);
  2.   glBindTexture(GL_TEXTURE_RECTANGLE_ARB, flcAnim);
  3.   glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  4.   glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  5.   glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, flc_head.width, flc_head.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, @fRGBArray[0]);


bildmaße:320*200 pixel


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 03, 2006 08:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ach ja. Was ich ganz vergessen hatte. Sobald du TextureRectangle benutzt sind deine Koordinaten anders. Und zwar sind die dann nicht mehr im Bereich von 0 und 1 sonder von 0 und Breite / Höhe des Bildes. Wenn das entsprechende Pixel nun weiß ist dann sieht es so aus als würde sich nichts verändern.

Noch etwas recht wichtiges. Du musst vorher natürlich auch abprüfen ob eine der Folgenden Extension überhaupt unterstützt werden.
GL_EXT_texture_rectangle
GL_ARB_texture_rectangle
GL_NV_texture_rectangle
Wenn dies nicht der Fall ist musst du dir leider etwas anders suchen um die Texturen darzustellen.

Die Kostanten sind bei allen 3 Extension gleich. Du brauchst also nur überprüfen ob die funktionieren und kannst dann eine der 3 Varianten benutzen. Für OpenGL sieht das dann nämlich vollkommen gleich aus.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 03, 2006 15:13 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Lossy eX hat geschrieben:
Ach ja. Was ich ganz vergessen hatte. Sobald du TextureRectangle benutzt sind deine Koordinaten anders. Und zwar sind die dann nicht mehr im Bereich von 0 und 1 sonder von 0 und Breite / Höhe des Bildes. Wenn das entsprechende Pixel nun weiß ist dann sieht es so aus als würde sich nichts verändern.

Noch etwas recht wichtiges. Du musst vorher natürlich auch abprüfen ob eine der Folgenden Extension überhaupt unterstützt werden.
GL_EXT_texture_rectangle
GL_ARB_texture_rectangle
GL_NV_texture_rectangle
Wenn dies nicht der Fall ist musst du dir leider etwas anders suchen um die Texturen darzustellen.

Die Kostanten sind bei allen 3 Extension gleich. Du brauchst also nur überprüfen ob die funktionieren und kannst dann eine der 3 Varianten benutzen. Für OpenGL sieht das dann nämlich vollkommen gleich aus.

Dieses Andere könnte ein Skalieren mit SDL_ScaleSurfaceRect sein. Geht natürlich nur, wenn du SDL nutzt ;) Das ist recht schnell und von der Qualität her... Äh... Lassen wir das mit der Qualität ;) wird halt recht pixelig, da nix interpoliert wird.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 03, 2006 15:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Zitat:
Dieses Andere könnte ein Skalieren mit SDL_ScaleSurfaceRect sein. Geht natürlich nur, wenn du SDL nutzt Wink Das ist recht schnell und von der Qualität her... Äh... Lassen wir das mit der Qualität Wink wird halt recht pixelig, da nix interpoliert wird.

*Argh* Also nichts gegen SDL. Aber dann doch lieber so, dass man entweder die Textur zerschneidet oder wie in dem Falle eine 512x256 Pixel Textur benutzt und dabei die Textur so reinkopiert wie sie ist. Sprich, dass man den Rest einfach weiß lässt. Als Koordinaten nimmt man dann entsprechend das was auch als Textur benutzt wird. Man hat dann zwar ein "bisschen" Verschnitt aber wenigstens bleibt sie dann so wie sie sein soll. Wenn man bedenkt, dass man sonst kaum Speicher benutzt dürfte das, vom Speicherverbrauch her, sogar alles noch gehen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]