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

Aktuelle Zeit: Do Mär 28, 2024 21:57

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Sep 19, 2015 19:11 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Mit diesem Befehl schreibe ich das komplette Image in den Textur-Buffer.
Code:
  1.       glTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, Width, Height, 0, Format, DataFormat, RawImage.Data);

Gibt es einen Befehl, welcher nur einen Ausschnitt von Rawimage in den Textur-Buffer schreibt ?

Beispiel, ich habe ein Image von 1024x1024 Pixel, aber ich will nur den Auschnitt von Rect(256,256,512,512) in den Buffer schreiben.

Für meine Cube-Map habe ich ein Images, welches ich manuell in 6 Bitmaps zerlege.
Die Quell-Image sieht etwa so aus: http://www.f-lohmueller.de/pov_tut/back ... 20x240.jpg
Code:
  1.       glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, InternalFormat, Width, Height, 0, Format, DataFormat, RawImage[0].Data);
  2.       glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, InternalFormat, Width, Height, 0, Format, DataFormat, RawImage[1].Data);
  3.       glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, InternalFormat, Width, Height, 0, Format, DataFormat, RawImage[2].Data);
  4.       glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, InternalFormat, Width, Height, 0, Format, DataFormat, RawImage[3].Data);
  5.       glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, InternalFormat, Width, Height, 0, Format, DataFormat, RawImage[4].Data);
  6.       glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, InternalFormat, Width, Height, 0, Format, DataFormat, RawImage[5].Data);  

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Sep 20, 2015 08:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ja, gibt es : glTexSubImage2D

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Sep 20, 2015 16:34 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Sascha Willems hat geschrieben:
Ja, gibt es : glTexSubImage2D

Leider macht dieser Befehl genau das Gegenteil. Mit dem kann ich kleine Images an einer bestimmten Position in die Textur schreiben.

Aber meine Ausgangslage, ist eine grosse Images, aus der ich 6 kleine Ausschnitte in die Cube-Map schreiben will.

Momentan zerlege ich die Bitmap in 6 einzelne Bitmaps, was mir aber nicht gefällt.
Code:
  1. type
  2.   TRawImageArray = array[0..5] of TRawImage;
  3.  
  4. procedure TCubeTexturBuffer.LoadTextures(Bitmap: TBitmap);
  5. var
  6.   BitmapArray: array [0..5] of TBitmap;
  7.   w, h, i: integer;
  8.   RawImageArray: TRawImageArray;
  9.   r: array[0..5] of types.TRect;
  10.  
  11.   function getRect(x, y: integer): types.TRect;
  12.   begin
  13.     Result := Rect(x * w, y * h, (x + 1) * w, (y + 1) * w);
  14.   end;
  15.  
  16. begin
  17.   w := Bitmap.Width div 4;
  18.   h := Bitmap.Height div 3;
  19.   for i := 0 to 5 do begin
  20.     BitmapArray[i] := TBitmap.Create;
  21.     BitmapArray[i].SetSize(w, h);
  22.   end;
  23.  
  24.   r[0] := getRect(2, 1);
  25.   r[1] := getRect(0, 1);
  26.   r[2] := getRect(1, 0);
  27.   r[3] := getRect(1, 2);
  28.   r[4] := getRect(1, 1);
  29.   r[5] := getRect(3, 1);
  30.  
  31.   for i := 0 to 5 do begin
  32.     BitmapArray[i].Canvas.CopyRect(Rect(0, 0, w, h), Bitmap.Canvas, r[i]);
  33.     RawImageArray[i] := BitmapArray[i].RawImage;
  34.   end;
  35.  
  36.   LoadTextures(RawImageArray);
  37.  
  38.   for i := 0 to 5 do begin
  39.     BitmapArray[i].Free;
  40.   end;
  41. end;

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Sep 20, 2015 17:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Sry, das habe ich falsch interpretiert.

Direkt Bildausschnitte als Textur hochladen geht afaik nicht (OpenGL kennt dein Format ja nicht), macht aber ja auch an sich keinen Sinn. Was gehen würde wäre das Bitmap komplett als Textur hochladen und dann von da aus die einzelnen Teile als Texturen zu extrahieren, ggf. über glCopyTexSubImage2D oder FBO via Blit.

Für Cubemaps nimmt man normalerweise entweder einzelne Texturen, oder packt sie direkt als Cubemap in ein passendes Cotainerformat wie DDS, KXT oder so die man dann direkt hochladen kann.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Sep 20, 2015 20:07 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Das sollte mit "glPixelStore" schon möglich sein.

Da du in Delphi und dort mit irgendwelchen speziellen Typen arbeitest, die ich nicht kenne, kann ich dir bei der exakten Formulierung der Funktion leider nicht weiterhelfen. Allerdings wirst du die Daten wahrscheinlich zeilenweise abspeichern. Du kannst OpenGL dann einen Pointer auf den ersten Pixel des hochzuladenden Pixels geben. Wenn du nicht die volle Breite hochladen möchtest, kannst du mit GL_PACK_ROW_LENGTH OpenGL mitteilen, wieviele Pixel tatsächlich in einer Reihe liegen.

In C würde das zum Beispiel so funktionieren:
Code:
  1.  
  2. //Daten des Bildes
  3. int32_t* Pixels;
  4. int32_t Width;
  5. int32_t Height;
  6.  
  7. void Upload(int32_t UploadX, int32_t UploadY, int32_t UploadWidth, int32_t UploadHeight)
  8. {
  9.     glPixelStorei(GL_PACK_ROW_LENGTH, Width);
  10.     int32_t* StartPixel = Pixels + (UploadX + Width * UploadY);
  11.     glTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, UploadWidth, UploadHeight, 0, Format, DataFormat, StartPixel);
  12. }


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Sep 21, 2015 11:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Fast. Es ist GL_UNPACK_ROW_LENGTH, nicht GL_PACK_ROW_LENGTH. Ansonsten stimmt soweit ich das sehe alles davon. Vergiss nicht, das danach wieder auf 0 zu setzen, sonst gibts beim nächsten Texturupload ne böse Überraschung ;)

viele Grüße,
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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Sep 21, 2015 12:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Nu dann kannst du ja auch gleich noch GL_UNPACK_SKIP_ROWS und GL_UNPACK_SKIP_PIXELS mit dazu nehmen. Damit bist du dann auf
der sicheren Seite falls du mal das Format ändern willst oder so. Beim manuellen Verschieben wie im Code von OpenglerF musst du nämlich
schon wieder bedenken das es nur 32-bit erlaubt und nicht in Java oder so geht.
Code:
  1.  
  2.  
  3. void Upload(int32_t UploadX, int32_t UploadY, int32_t UploadWidth, int32_t UploadHeight)
  4. {
  5.     glPixelStorei(GL_UNPACK_ROW_LENGTH, Width);
  6.     glPixelStorei(GL_UNPACK_SKIP_PIXELS, UploadX);
  7.     glPixelStorei(GL_UNPACK_SKIP_ROWS, UploadY);
  8.     glTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, UploadWidth, UploadHeight, 0, Format, DataFormat, Pixels);
  9. }
  10.  

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Sep 21, 2015 17:10 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Danke genau, dies habe ich gesucht.

So sieht nun mein Code uas:
Code:
  1. procedure TCubeTexturBuffer.LoadTextures(RawImage: TRawImage);
  2. var
  3.   GLformat: TGLTextureFormat;
  4.   len: integer;
  5.  
  6.   procedure TexImage(target, Left, Top: integer);
  7.   begin
  8.     glPixelStorei(GL_UNPACK_SKIP_PIXELS, Left * len);
  9.     glPixelStorei(GL_UNPACK_SKIP_ROWS, Top * len);
  10.     with RawImage.Description, GLformat do begin
  11.       glTexImage2D(target, 0, InternalFormat, len, len, 0, Format, DataFormat, RawImage.Data);
  12.     end;
  13.   end;
  14.  
  15. begin
  16.   GLformat := getGLTexturFormat(RawImage);
  17.   len := RawImage.Description.Width div 4;
  18.  
  19.   if GLformat.Format <> 0 then begin
  20.     glBindTexture(GL_TEXTURE_CUBE_MAP, FID);
  21.  
  22.     glPixelStorei(GL_UNPACK_ROW_LENGTH, RawImage.Description.Width);
  23.  
  24.     TexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 2, 1);
  25.     TexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, 1);
  26.     TexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 1, 0);
  27.     TexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 1, 2);
  28.     TexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 1, 1);
  29.     TexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 3, 1);
  30.  
  31.     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  32.     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  33.     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  34.     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  35.     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
  36.  
  37.     glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
  38.  
  39.     glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
  40.   end else begin
  41.     FID := 0;
  42.   end;
  43. end;




Zitat:
Vergiss nicht, das danach wieder auf 0 zu setzen,


Code:
  1.     glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
  2.     glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
  3.     glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);


Ist dies so richtig ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Sep 22, 2015 12:36 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Ja. :wink:


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 33 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.057s | 19 Queries | GZIP : On ]