Registriert: Do Aug 25, 2005 16:00 Beiträge: 189
Programmiersprache: Java, C#
Hi.
Ich fürchte ich steh grad voll aufm Schlauch.
Ich möchte ein 256 Farben Bitmap (8 Bit) laden und als Textur verwenden.
Zuerst kommt der BitmapFileHeader, dann der BitmapInfoHeader, mit die beide keine Probleme bereiten.
Dann kommt die Farbpalette, bei der jeweils 4 Byte eine Farbe repräsentieren (green, blue, red, reserved). Nach der Farbpalette kommen die Pixeldaten, wobei jeder Pixel durch 1 Byte das ein Index zur Farbpalette ist, repräsentiert wird.
Ich hab keine Probleme damit die Daten zu laden, nur wie krieg ich jetzt die BGR-Werte in den Speicher geschoben?
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Präzisiere dein Problem mal genauer.
Hast du schon RGB/BGR-Daten im Speicher und willst sie an OpenGL übergeben oder hast du nur die palletierten Daten im Speicher und willst sie zu RGB umwandeln?
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Erste Aktion:
Du rechnest jeden Palettenwert in ein RGBA-Wert um (daher den 4 Bit-Wert auf 8 Bit skalieren). Somit hast du ein Array der Palettenwerte.
Dann reservierst du Speicher für Breite*Höhe*SizeOf(Integer). Jetzt liest du den ersten Pixel des palettierten Bildes und schaust im Array nach. Den Wert aus dem Array speicherst du dann in den vorher reservierten Speicher an die erste Stelle. Dann für den zweiten Pixel bis zum letzten.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich würd beim laden nen array mit der Zuordnung Index->RGB(Reserved) erstellen und dann füllen.
Wenn es dann an die Pixeldaten geht, würd ich garnicht erst die palettenindicies in irgendein array laden, sondern direkt ein Array von RGB-Werten erstellen und das entsprechend von Palette[Index] füllen.
(Ich hoffe, das war verständlich)
Das zeuch kann dann direkt an ogl gegeben werden.
//Edit: @i0n0s: Verdammt, du warst schneller aber: Die Farbwerte in der Palette sind doch schon 8-bit...
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Das funktioniert ja in meinem Fall nicht, da data ja immer an die erste Stelle des reservierten Speichers zeigt und ich die Daten ja nicht in einem Rutsch laden kann.
Was funktionieren müsste wäre wie Lord Horazont vorgeschlagen hat ein Array eines records, in dem die rgb Werte gespeichert werden und dann bei glTexImage2D das nen Pointer auf das Array übergeben?
Gibts eigentlich noch ne Möglichkeit mit so ner Konstruktion zu wie oben zu arbeiten?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Nein, ich denke nicht, dass es eine möglichkeit gäbe, die Daten in einem Rutsch zu laden. Du musst sie ja danach noch bearbeiten und bekommst auf jeden fall ein größeres Array raus als rein.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Aug 25, 2005 16:00 Beiträge: 189
Programmiersprache: Java, C#
RAH >.<
es gibt ja auch noch PByte und Co - so ein Mist...
DAS meinte ich vorhin als ich sagte das ich auf dem Schlauch stehe - die Lösung ist das einfachste von der Welt und ich komm nicht von selbst drauf und kann das Problem noch nich ma richtig beschreiben
Registriert: Do Aug 25, 2005 16:00 Beiträge: 189
Programmiersprache: Java, C#
Noch eine letzte Frage, der Interesse halber...
Code:
var
pixeldata:^Byte;
PalPixel:PByte;
PalPixel := pixeldata;
funktioniert nicht. Delphi meint: Inkompatible Typen: 'TestUnit.Byte' und 'System.Byte' Bei mir hab ich jetzt pixeldata auch zu nem PByte gemacht, was auch problemlos funktioniert. Allerdings interessiert es mich doch ob pixeldata nicht doch ein ^Byte sein kann, oder ob i0n0s einen Denkfehler gemacht hat
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Das muss nicht zwingend so sein.
Code:
type
PTempByte =^Byte;
PTempByte2 =^Byte;
var
A : PTempByte;
B : PTempByte2;
C :^Byte;
D :^Byte;
A := B;
A := C;
B := C;
C := D
Das geht in jedem der Fälle schief, da es für Delphi alles unterschiedliche Typen sind. "Schuld" daran ist die strenge Typprüfung von Delphi.
PS: Wobei Delphi 7 lediglich sagt, dass es inkompatibel ist. Der Zusatz bei dir ließe mich allerdings auch vermuten, dass selber noch mal ein Byte definiert hast??
ansonsten...
Byte neu definiert? Wie gesagt, nicht das ich wüsste
edit: ich bin grade nochmal meinen Code durchgegangen, aber ich find da nüx wo ich ein Byte definiert haben könnte...
benutzen tu ich Classes.pas, SysUtils.pas und DGLOpenGL.pas...
edit: ich häng die Unit mal an - man sollte aber dazu sagen das ich nicht sehr ordentlich war, aber da sie nur aus einer Prozedur besteht hoffe ich das trotzdem jemand kurz drüber schaut...
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mitglieder in diesem Forum: 0 Mitglieder und 8 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.