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

Aktuelle Zeit: Mi Jul 02, 2025 21:18

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: Texturmanipulation
BeitragVerfasst: Mi Aug 22, 2012 14:53 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Hey, irgendwie ist mein Thema abhanden gekommen deshalb hier nochmal ;)

ich möchte also eine Textur die ich selbst erstelle zur Laufzeit manipulieren, der Ansatz scheint zu klappen aber dann beim Hochladen der Manipulierten Daten bekomme ich eine Access Violation

so erstelle ich eine Blanko Textur

Code:
  1. procedure TTexturManager.GenBlancTex(Name : String; Height, Width, Format : Integer);
  2. var TexPointer : PTexture;
  3. begin
  4.   SetLength(Texturen, length(Texturen)+1);
  5.   SetLength(TexturNamen, length(TexturNamen)+1);
  6.   TexPointer := @Texturen[high(Texturen)];
  7.   TexturNamen[high(TexturNamen)] := Name;
  8.  
  9.   glGenTextures(1, @TexPointer.texID);
  10.   glBindTexture(GL_TEXTURE_2D, TexPointer.texID);
  11.   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  12.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  13.   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Width, Height, 0, Format, GL_UNSIGNED_BYTE, nil);
  14.   glBindTexture(GL_TEXTURE_2D, 0);
  15. end;


die wird dann wieder ausgelesen und wieder hochgeladen ( erstmal ohne Manipulation)

Code:
  1. var
  2.   ImageDataS, ImageDataT : array of GluByte;
  3.   Height, Width, X, Y : Integer;
  4. begin
  5.   TexMgr.BindTexture('MapLayer');
  6.   glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, @width);
  7.   glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, @height);
  8.   SetLength(ImageDataT, Height*Width);
  9.   glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, ImageDataT);
  10.   glTexImage2D(GL_TEXTURE_2D, 0, 3, Width, Height, 0, GL_RGB, GL_UNSIGNED_BYTE, ImageDataT); <-- Access Violation
  11.  


was genau da nicht stimmen soll weiß ich nicht :/

lg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturmanipulation
BeitragVerfasst: Mi Aug 22, 2012 15:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Dein ImageDataT ist zu klein. Du liest es als GL_RGB / GL_UNSIGNED_BYTE aus, entsprechend 3 Byte pro Pixel.

=>
Code:
  1. SetLength(ImageDataT, Height*Width*3);


Ansonsten solltest du vorsichtshalber mal checken ob Height und Width stimmen. Ich erinnere mich dunkel daran das die mir mal Unsinn zurückgaben.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturmanipulation
BeitragVerfasst: Mi Aug 22, 2012 16:18 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ich habs vergrößert weil deine Erklärung logisch klingt aber warum mekert er dann nicht schon beim beschreiben von ImageDataT?
die werte height und width sind richtig allerdings verändert sich nichts

lg

€ falls es hilft das CPU Fenster geht auch auf ich kann die daten da raus schreiben wenn jemand damit was anzufangen weiß^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturmanipulation
BeitragVerfasst: Mi Aug 22, 2012 18:08 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Je nachdem wie der Wert für "Width" ausfällt, kann es sein, dass es Probleme wegen GL_PACK_ALIGNMENT oder GL_UNPACK_ALIGNMENT gibt.
Die bewirken das jede Zeile genau ein Vielfaches von 1, 2, 4 oder 8 Bytes lang ist. Entsprechend werden dann also leere Bytes abgehängt.
Mit glPixelStore kannst du den Wert umstellen. Bei dir sollte der 1 sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturmanipulation
BeitragVerfasst: Mi Aug 22, 2012 23:09 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Das hab ich jetzt irgendwie nich verstehen oO


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturmanipulation
BeitragVerfasst: Do Aug 23, 2012 16:40 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Okay ich habe es hinbekommen

durch das anschauen des TGA loaders den ich nutze bin ich auf einen funktionierenden weg gekommen.

Hier der Code:

Code:
  1.  
  2. procedure TForm1.CTexturenChange(Sender: TObject);
  3. var
  4.   ImageDataT, Rt, Gt, Bt : PGluByte;
  5.   Height, Width, X : Integer;
  6. begin
  7.  
  8.   TexMgr.BindTexture('MapLayer');                                            //Textur Binden
  9.   glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, @width);     //Breite Abfragen
  10.   glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, @height);   // Höhe Abfragen
  11.   ImageDataT := AllocMem(Height*Width*3);                                     //Speicher Allocieren
  12.   glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, ImageDataT);  //Pointer zu den Bilddaten
  13.  
  14.   for X := 0 to (height*width) - 1 do begin
  15.     Rt := Pointer(integer(ImageDataT) + X * 3 + 0);
  16.     Gt := Pointer(integer(ImageDataT) + X * 3 + 1);
  17.     Bt := Pointer(integer(ImageDataT) + X * 3 + 2);
  18.  
  19.     Rt^ := 255;
  20.     Gt^ := 255;
  21.     Bt^ := 255;
  22.   end;                                                                                 //Bild Weiß Färben
  23.  
  24.   glTexImage2D(GL_TEXTURE_2D, 0, round(24/8), Width, Height, 0, GL_RGB, GL_UNSIGNED_BYTE, ImageDataT); //Hochladen
  25.   glBindTexture(GL_TEXTURE_2D, 0);                                                                                                      //nulltextur Binden
  26.  
  27.   FreeMem(ImageDataT);      //Speicher Freigeben!
  28.  


Bitte berichtigt mich wenn hier Fehlerquellen schlummern die nicht gleich Auffallen.

lg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturmanipulation
BeitragVerfasst: Do Aug 23, 2012 16:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Du setzt da das interne Datenformat für die Textur auf "round(24/8)". Das basiert auf den alten Werten wo man da noch die Anzahl der Farbkanäle pro Pixel angab...weil ein Farbkanal immer 8bit hatte. Mittlerweile kann man da alles mögliche nehmen. Es ist daher ratsam die neueren Konstanten zu benutzen, dann ist offensichtlich was da gemacht wird. In diesem Fall wäre das ein GL_RGB8. Also RGB-Kanäle mit jeweils 8bit.

_________________
Yeah! :mrgreen:


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.007s | 14 Queries | GZIP : On ]