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

Aktuelle Zeit: Fr Jul 04, 2025 17:01

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Eine Textur in eine andere Kopieren
BeitragVerfasst: Mi Sep 12, 2012 20:48 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Hallo,

ich hab mich nun lange genug geweigert euch um Rat zu fragen.

mein Problem ist dass ich eine Textur habe die völlig schwarz ist und diese nun mit einer anderen "Überschrieben" werden soll.

Die schwarze Textur ist derzeit 2048x2048 Pixel groß und die andere Textur soll beliebig groß sein können. Idee war die Pixel der 2. Textur reihe für reihe in die 2. Textur zu schreiben aber wie ich es auch drehe und wende ich komm nicht auf eine brauchbare lösung.

Die Prozedure sieht derzeit so aus

Code:
  1. procedure TForm1.CTexturenChange(Sender: TObject);
  2. var
  3.   ImageDataS, ImageDataT, Rs, Gs, Bs, Rt, Gt, Bt : PGluByte;
  4.   Height, Width, Heights, Widths, X, RowS, A, B : Integer;
  5. begin
  6.   TexMgr.BindTexture(CTexturen.Text);
  7.   glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, @widths);
  8.   glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, @heights);
  9.   ImageDataS := AllocMem(Heights*Widths*3);
  10.   glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, ImageDataS);
  11.  
  12.   TexMgr.BindTexture('MapLayer');
  13.   glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, @width);
  14.   glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, @height);
  15.   ImageDataT := AllocMem(Height*Width*3+3);
  16.   glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, ImageDataT);
  17.  
  18.    RowS := 0; A := 0; B := 0;
  19.     for X := 0 to (Width*Height)-1 do begin
  20.       Rs := Pointer(integer(ImageDataS) + ((WidthS * RowS) + A)*3);
  21.       Gs := Pointer(integer(ImageDataS) + ((WidthS * RowS) + A)*3+1);
  22.       Bs := Pointer(integer(ImageDataS) + ((WidthS * RowS) + A)*3+2);
  23.  
  24.       Rt := Pointer(integer(ImageDataT) + (X)*3);
  25.       Gt := Pointer(integer(ImageDataT) + (X)*3+1);
  26.       Bt := Pointer(integer(ImageDataT) + (X)*3+2);
  27.  
  28.       Writeln('Punkt : ' + floattostr(((WidthS * RowS) + A)*3));
  29.       Writeln('Punkt : ' + floattostr(((WidthS * RowS) + A)*3+1));
  30.       Writeln('Punkt : ' + floattostr(((WidthS * RowS) + A)*3+2));
  31.      
  32.       if not (Rt=nil) or (Gt=nil) or (Bt=nil) or
  33.                (Rs=nil) or (Gs=nil) or (Bs=nil) then begin
  34.         Rt^ := Rs^;
  35.         Gt^ := Gs^;
  36.         Bt^ := Bs^;
  37.       end;
  38.  
  39.    inc(A);
  40.    inc(B);
  41.    if B > Width then begin
  42.     inc(RowS);
  43.     A := 0;
  44.    end;
  45.    if A > WidthS then begin
  46.     A := 0;
  47.    end;
  48.    if RowS > HeightS then RowS := 0;
  49.   end;
  50.  
  51.   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, Width, Height, 0, GL_RGB, GL_UNSIGNED_BYTE, ImageDataT);
  52.   glBindTexture(GL_TEXTURE_2D, 0);
  53.  
  54.   FreeMem(ImageDataT);
  55.   FreeMem(ImageDataS);
  56. end;


Ihr seht ich benötige eine Vielzahl von Hilfsvariablen. Aber ich bekomme keine Zugriffsverletzungen mehr das ganze Bild verwandelt sich von schwarz in einen Grünen Matsch statt der feinen graßtextur die ich eigentlich wollte.

vieleicht sieht einer von euch nen groben fehler?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 12, 2012 22:15 
Offline
DGL Member

Registriert: Sa Mär 31, 2012 23:14
Beiträge: 26
Programmiersprache: PASCAL
Diese Codestelle könnte falsch sein
Code:
  1.  
  2. 41.   if B > Width then begin
  3. 42.    inc(RowS);
  4. 43.    A := 0;                      // besser B := 0 glaub ich
  5. 44.   end;
  6.  

Hab das jetzt nicht getestet, aber da RowS bei "overflow" auf 0 zurückgeht könnte das dafür sorgen dass die Texel der Original-Textur nicht sinvoll ausgelesen werden; und das ohne AccessViolation.

Anmerkung: Ich find diese Methode eine Textur zu kopieren etwas umständlich...
Ginge das was du vorhast nicht auch/besser mit glCopyTexSubImage2D oder RenderToTexture?

_________________
The force, strong it is in OpenGL.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Sep 15, 2012 19:56 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
aha ich habe also das Rad neu erfunden :D das Ergebnis von beiden wegen sieht identisch aus, ich werde das nochmal bisschen testen müssen und dann meld ich mich wieder danke erstmal :)


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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.023s | 17 Queries | GZIP : On ]