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

Aktuelle Zeit: Di Jul 15, 2025 09:38

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Textur laden funzt nicht
BeitragVerfasst: Mo Okt 06, 2003 08:46 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 30, 2003 11:56
Beiträge: 37
Wohnort: Wil, Switzerland
Moin

Ich habe anfänglich mit glBmp gearbeitet. Allerdings brauch ich für meinen Zweck sowas wie ein Textur-Splitting...Naja...Ich hab dann angefangen, mir so eine Textur-Lade-Unit zu coden. Allerdings will das Teil nicht...

vielleicht guckt einer von euch mal kurz rein. hab unwichtige sachen rausgekürzt (mit kommentarzeile)

Code:
  1. type
  2.   PGLRGBQUAD = ^TGLRGBQUAD;
  3.   TGLRGBQUAD = record
  4.     red: Byte;
  5.     green: Byte;
  6.     blue: Byte;
  7.     alpha: Byte;
  8.   end;
  9.  
  10.   TGLJpg = record
  11.     TexID: GLuint;
  12.     Width: integer;
  13.     Height: integer;
  14.     ImageData: PGLRGBQUAD;
  15.   end;
  16.  
  17. var
  18.   Background: Array[0..7, 0..5] of TGLJpg;
  19.  
  20. procedure LoadBackground(RoomID: integer);
  21. const
  22.   GL_BGRA   = $80E1;
  23. var
  24.   Bmp: TBitmap;
  25.   Jpg: TJPEGImage;
  26.   Header: PBitmapInfo;
  27.   minFilter: TGLInt;      // Texture minification filter
  28.   magFilter: TGLInt;      // Texture magnification filter
  29.   texWrapS: TGLInt;       // Texture wrapping in s direction
  30.   texWrapT: TGLInt;       // Texture wrapping in t direction
  31. begin
  32.   if FileExists(ExtractFilePath(Application.ExeName) + 'room_' + IntToStr(RoomID) + '.jpg') then
  33.   begin
  34. // cut / Prepare filters (the one's with TGLInt)
  35.  
  36. // cut / Load picture from file (tested and 100% working) and Draw on Bmp Canvas
  37.  
  38. // Split (not yet done. Store everything in first pic)
  39.  
  40.     Background[0, 0].Width := Bmp.Width;
  41.     Background[0, 0].Height := Bmp.Height;
  42.  
  43.     // Prepare GetDIBits
  44.     GetMem(Header, SizeOf(TBitmapInfoHeader));
  45.     with Header^.bmiHeader do
  46.     begin
  47.       biSize := SizeOf(TBitmapInfoHeader);
  48.       biWidth := Background[0, 0].Width;
  49.       biHeight := Background[0, 0].Height;
  50.       biPlanes := 1;
  51.       biBitCount := 32;
  52.       biCompression := BI_RGB;
  53.       biSizeImage := Background[0, 0].Width * Background[0, 0].Height * 4;
  54.     end;
  55.     GetDIBits(Bmp.Canvas.Handle, Bmp.Handle, 0, Background[0, 0].Height, Background[0, 0].ImageData, TBitmapInfo(Header^), DIB_RGB_COLORS);
  56.  
  57. // GetDIBits returns 512, what is correct. But Background[0, 0].ImageData still contains no data...why?
  58.  
  59.     SetAlpha(255);  // sets alpha channel and gives an exception (that's why Background[0, 0].ImageData is nil
  60.  
  61.     // Free up memory
  62.     FreeMem(Header);
  63.     Jpg.Free;
  64.     Bmp.Free;
  65.  
  66.     // Generate the texture
  67.     if Background[0, 0].TexID > 0 then glDeleteTextures(1, Background[0, 0].TexID);
  68.     glGenTextures(1, Background[0, 0].TexID);
  69.     glBindTexture(GL_TEXTURE_2D, Background[0, 0].TexID);
  70.  
  71.     // Set up parameters
  72.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, texWrapS);
  73.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, texWrapT);
  74.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
  75.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
  76.  
  77. // won't work with no image data...
  78.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Background[0, 0].Width, Background[0, 0].Height, 0, GL_BGRA, GL_UNSIGNED_BYTE, Background[0, 0].ImageData);
  79. //    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Background[0, 0].Width, Background[0, 0].Height, GL_BGRA, GL_UNSIGNED_BYTE, PByte(Background[0, 0].ImageData));
  80.   end;
  81. end;

_________________
Jailbird


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 06, 2003 10:07 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wenn ich in deinem Quelltext nichts übersehen hab,dann hast du einfach den Fehler gemacht keinen Speicher für TglJPG.ImageData zu reservieren.Und da dieses PGLRGBQUAD dann ins Nirvana (sprich auf NIL) zeigt,wird GetDibBits da auch nichts reinkopieren können. (hat ja dann auch quasi eine Größe von 0 Bytes),
Du musst also erstmal Speicher für deine Bilddaten anfordern :
Code:
  1. New(Background[x,y].ImageData);
  2. GetDibBits(...);
  3. //Textur erstellen
  4. Dispose(Background[x,y].ImageData);

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 06, 2003 12:29 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 30, 2003 11:56
Beiträge: 37
Wohnort: Wil, Switzerland
ich hab jetzt mal

Code:
  1. GetMem(Background[0, 0].ImageData, Background[0, 0].Width * Background[0, 0].Height * 4);


eingebaut. nun ist die exception weg, allerdings wird immer noch keine textur angezeigt...

ich hab's mal mit dem gluBuild2DMipmaps probiert, da krieg ich allerdings eine exception (von der glu32.dll).

des weiteren geb ich mit FreeMem(Background[0, 0].ImageData); beim beenden (form destroy) den speicher wieder frei und krieg einen "invalid pointer operation"-fehler...an was könnt's noch liegen? ich hab doch extra bei glbmp geguckt, wie's funktioniert...

_________________
Jailbird


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 06, 2003 12:40 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 30, 2003 11:56
Beiträge: 37
Wohnort: Wil, Switzerland
kleiner edit...die letzte exception beim beenden ist weg...war zu dumm :)

allerdings seh ich immer noch keine tex

_________________
Jailbird


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 06, 2003 12:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich zitiere mal einfach die Delphi-Hilfe zu GetMem, was evtl. hilfreich sein könnte :
Zitat:
Verwenden Sie statt GetMem und FreeMem die die Prozeduren New und Dispose.


Und wenn du bei glTexImage2D keine Textur angezeigt bekommst,und dir jedoch sicher bist das diese korrekt erstellt wurde,dann liegts wahrscheinlich daran das dein Vergrößerungs- und Verkleinerungsfaktor MipMapping wollen,dort also z.B. statt GL_LINEAR GL_LINEAR_MIPMAP_LINEAR steht.Und da du über glTexImage2D nur eine MipMap für Stufe 0 angegeben hast,siehst du auch im Normalfall nichts.

Ausserdem seh ich grade das du als Texturenformat GL_BGRA verwendest,und ich bin mir fast sicher das es diverse Grafikkarten gibt die das nicht unterstützten.Warum brauchst du eigentlich dieses Format?Deine Pixeldaten müssten doch eigentlich im RGBA-Format vorliegen.

Edit : Hab grad noch was schwerwiegendes entdeckt : Du nutzt nur einfache Records, aber du musst packed records verwenden,da deine Records sonst im Speicher nicht korrekt ausgerichtet werden.Hier könnte dein Problem auch liegen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 08, 2003 12:02 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 30, 2003 11:56
Beiträge: 37
Wohnort: Wil, Switzerland
ich hab das mal auf packed record umgestellt...allerdings ohne erfolg...ich weiss nicht, an was es noch liegen könnte...ich hab drum das zeug mal geuppt...

jimmy.zip

hoffe, hab alles nötig drin. wäre nett, wenn sich's mal einer angucken könnte. zur kleinen erklärung...um das laden der textur auszulösen einfach die linke maustaste drücken...an room_1.txt liegt's übrigens nicht. diese datei ist nur zuständig für die polygone, welche gezeichnet werden. das funzt ja...aber eigentlich sollte dann das teilchen oben links eine textur bekommen...sollte...

bin für jede hilfe dankbar

_________________
Jailbird


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 09, 2003 18:23 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 30, 2003 11:56
Beiträge: 37
Wohnort: Wil, Switzerland
hat sich erledigt...hatte die falsche glColor und zusätzlich einen "falschen" pointer...fühl mich mal wieder wie ein s-dau :(

_________________
Jailbird


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]