Autor |
Beitrag |
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: So 17.11.02 16:13
Hi,
ich hab mir eine funktion geschrieben um Texturen aus *.res dateien zu laden... nur irgendwie klappt es nicht so ganz...
Das ist die Funktion:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| function LoadResTexture(ResourceID: String; var Texture: GLuint): Boolean; var hBMP: HBitmap; BMP: Bitmap; begin glGenTextures(1,Texture); hBMP:=LoadImage(hInstance,PChar(ResourceID),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION); if hBMP<>0 then begin GetObject(hBMP,SizeOf(BMP),@BMP); glPixelStorei(GL_UNPACK_ALIGNMENT,4); glBindTexture(GL_TEXTURE_2D,Texture); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); gluBuild2DMipmaps(GL_TEXTURE_2D,3,BMP.bmWidth,GL_RGB,GL_UNSIGNED_BYTE,BMP.bmBits); DeleteObject(hBMP); Result:=true; end else Result:=false; end; |
Das Result ist zwar "True", aber die texturen funktionieren nicht... (und wenn man sich den letzten WindowsFehler anzeigen lässt, kommt nach dem LoadImage ein "Nicht genügend speicher vorhanden bla bla.." fehler.. (das muß an dem "LR_CREATEDIBSECTION" liegen, denn mit z.B. "LR_DEFAULTSIZE" kommt der fehler nicht... aber damit geht es trotzdem nicht)
Au'revoir,
Aya
|
|
Andreas Pfau
      
Beiträge: 997
|
Verfasst: Fr 29.11.02 00:00
Probier mal folgendes:
Quelltext 1:
| hBMP := LoadBitmap(hInstance, MakIntResource(RessourceId)); |
Außerdem ist ja klar, dass die bitmap 24Bit sein muss!
|
|
OregonGhost
      
Beiträge: 215
|
Verfasst: Sa 30.11.02 10:45
Andreas Pfau hat folgendes geschrieben: |
Außerdem ist ja klar, dass die bitmap 24Bit sein muss!
|
Warum?
_________________ Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
|
|
Andreas Pfau
      
Beiträge: 997
|
Verfasst: Sa 30.11.02 16:49
Weil du u.a. mit "GL_RGB, GL_UNSIGNED_BYTE" angibst, dass die Daten im Format
1. Byte = Rot 1. Pixel
2. Byte = Grün 1. Pixel
3. Byte = Blau 1. Pixel
4. Byte = Rot 2. Pixel
...
vorliegen. Wenn du eine 16-Bit-Bitmap hast, werden die Daten im Format
1. Byte & 2.Byte = Palettenindex 1. Pixel
3. Byte & 4.Byte = Palettenindex 2. Pixel
gespiehcert und sind damit nicht mehr kompatibel zum angegeben Format.
Ist aber kein Problem wenn du es direkt mit TBitmap machst, dan kannst du mit "Bitmap.PixelFirmat := pf24Bit" alles weider ins Lot bringen.
Oder du konvertierst jeden Pixel in RGB...
|
|
OregonGhost
      
Beiträge: 215
|
Verfasst: Sa 30.11.02 17:23
Ahja, gut. Das hatte ich übersehen, aber das funktioniert auch nur, wenn die Bitmap top-down und RGB (und nicht BGR, wie zumindest DIBs standardmäßig sind) ist.
_________________ Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
|
|
Andreas Pfau
      
Beiträge: 997
|
Verfasst: Sa 30.11.02 20:06
@OregonGhost, da muss ich dir selbstverständlich recht geben.
Aber mal Ehrlich: welches Prog erstellt schon Bitmaps, die nicht zu
- DIB
- RGB
- Top-Down
kompatibel sind? 
|
|
OregonGhost
      
Beiträge: 215
|
Verfasst: So 01.12.02 00:36
Keine Ahnung, aber ich habe mich oft genug darüber geärgert, wenn ich irgendwelche Bitmapdaten verändern wollte und Rot und Blau vertauscht waren. Vielleicht ist das nur der Fall, wenn die Bitmap mit CreateDIBSection erzeugt wird. Ich meinte auch nicht die gespeicherten Pixel, ich meinte die Bitmap, die LoadImage lädt. Das Standardformat (!) zumindest von Windows-DIBs ist jedenfalls bottom-up.
Ist aber auch egal, wenn's funktioniert ;c)
_________________ Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
|
|
|