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

Aktuelle Zeit: Di Mai 14, 2024 02:39

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Mär 15, 2012 13:19 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Heyho, hab mal wieder ne kleine Verständnisfrage. Und zwar will ich 2D-Texturarrays anlegen und diese mit mehreren Texturen füllen (ist ja auch Sinn der Sache). Nu hab ich für jede Textur eine Bilddatei (32-Bit tga, tut aber ja nichts zur Sache), die ich mit der SDL auslesen will (Die sind natürlich auch alle gleichgroß). Die für mich einfachste Art und Weise aus den einzelnen Bildern das Texturarray zu machen wäre jetzt, den Speicher für n * x * y Pixel zu reservieren (mit glTexImage3D, wenn man diesem Link folgt, pixels wäre dann bei mir nil), und dann Bild für Bild in den reservierten Speicherbereich zu schreiben - aber...wie?!


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 15, 2012 13:25 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Du hast ein Verständnisproblem:
glTexImage3D befüllt direkt den Speicher auf der Grafikkarte.
Du erstellst vorher eine entsprechend große Surface und kopierst die einzelnen Texturen nacheinander (mit entsprechendem Abstand) in die Surface. Und dann überreichst du die Surface als pixels.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 15, 2012 14:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
glTexSubImage3D ist, was du suchen könntest. Aber sind Texturarrays nicht ein bisschen was anderes als 3D-Texturen?

greetings

_________________
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: Do Mär 15, 2012 14:30 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Erm, ja....du hast natürlich recht, hab mich da verlesen - das ändert aber nichts an der Datenstruktur, wenn ich das richtig verstanden hab. Der Unterschied liegt nur darin, dass bei Arrays nicht zwischen den einzelnen Layern interpoliert wird.

Die Frage, wie man die Sache füllt bleibt aber natürlich. Ionos Vorschlag klingt praktikabel, aber irgendwie wärs mir lieber, die Pixel nacheinander zu schreiben, und nicht den Umweg zu gehen zuerst die Surface zusammenzusetzen und dann rüberzuschieben.

Wie hab ich mir das mit SubImages denn vorzustellen? Aus dem Wiki-Artikel werd ich irgendwie nich so ganz klar...


Edit: Ne, verlesen hab ich mich nicht, zum Füllen benutzt man tatsächlich glTexImage3D...ändert aber ja wie gesagt nichts am Problem...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 15, 2012 15:37 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Du gibst einen Teilbereich der Textur an, im Regelfall bei dir eine Scheibe, und übergibst einen Pointer mit den neuen Bilderdaten. Dann wird die Textur an der Stelle mit den neuen Bilderdaten beschrieben.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 15, 2012 15:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 13, 2011 22:05
Beiträge: 218
Programmiersprache: Lazarus/FPC
Ich glaub du denkst zu kompliziert. Du willst ja nur ein Array aus 2D-Texturen.

Code:
  1.  
  2. var
  3.   textures: array of gluInt;
  4.  


und dann halt mit einer Schleife, oder seperat die TexturVariablen füllen.

(Ich benutze zwar nicht SDL aber da gibts sicher so eine einfache loadtga-Funktion oder?
und da machst du dann einfach loadtga(*Pfad*, textures[0]); Mehrere Male.

Sag mir wenn ich mich irre :mrgreen:

_________________
Ich teile manchmal heimlich durch Null. - Alber Einstein


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 15, 2012 16:29 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Und dann hab ich ein Array von Texturen, aber kein Texturearray. Richtig. Bringt mir leider für meine Zwecke nich wirklich was. Ich will halt ein Texturearray, damit ich nur eine Textur binden muss, und via u-Texturkoordinate auf mehrere zugreifen kann.

Das glTexSubImage3D wird vermutlich meckern, weil es sich nich um ne 3D-Textur handelt, oder?

Ich sitz gerade an Ionos' Ansatz...mal sehen, ob das was wird.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 15, 2012 16:38 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Schreib mal bitte was du genau willst.
Denn das SubImage sollte auch gehen.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 15, 2012 17:41 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Also...Ich hab nen VBO mit zig verschiedenen Punkten, die nachher alle jeweils ein texturiertes Quad darstellen sollen. Alle Quads gleich groß und gleich ausgerichtet. Die sollen allerdings verschiedene Texturen kriegen und die Texturen sollen gedreht werden können.
Jetzt könnte man sagen "Nimm einfach ne große Textur und pack die versch. Texturen da nebeneinander rein" dann laufe ich aber Gefahr, dass beim Drehen der Textur teile der danebenliegenden Bilder sichtbar werden.
Also klang es für mich nach nem einfachen und effektiven Ansatz, ein 2D_TEXTURE_ARRAY zu erstellen, die Texturen in unterschiedliche Slices zu packen und einfach eine Texturkoordinate zu benutzen, um die Slice anzugeben, die benutzt werden soll. Das unterstützt OpenGL zwar nur via Shader, aber ich wollte eh nen Shader benutzen, damit ich im VBO mit GL_POINTS auskomme und trotzdem Quads rauskriege - außerdem kann ich dann auch gleich die zweite Texturkoordinate für die Drehung benutzen und die Textur für jedes Quad im Shader drehen.

Jetzt scheiter ich aber leider schon daran, dieses blöde Array anzulegen *brumm*

Edit: Werd wohl später heute abend oder morgen im Laufe des Tages mal austesten, ob die SubImage-Sache funktioniert. Aber im Wiki steht halt, das ginge nur bei GL_TEXTURE_3D.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Mär 16, 2012 00:50 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
zoiX hat geschrieben:
Das glTexSubImage3D wird vermutlich meckern, weil es sich nich um ne 3D-Textur handelt, oder?

Laut http://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_array.txt geht das ohne Probleme.
Zitat:
Accepted by the <target> parameter of TexImage3D, TexSubImage3D,
CopyTexSubImage3D, CompressedTexImage3D, and CompressedTexSubImage3D:

TEXTURE_2D_ARRAY_EXT
PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Mär 16, 2012 13:01 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Dez 03, 2008 12:01
Beiträge: 167
Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
Ein Texturearray verhält sich relativ ähnlich zu 3D-Texturen, mit dem Unterschied, dass bei Texture-Arrays nicht zwischen den verschiedenen Ebenen interpoliert wird.
Ich mache das so:
Code:
  1.     glGenTextures(1, &this->handle);
  2.     glBindTexture(GL_TEXTURE_2D_ARRAY, , this->handle);
  3.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  4.     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  5.     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  6.     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  7.     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  8.  
  9.     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, format, this->width, this->height, this->depth, 0, format, GL_UNSIGNED_BYTE, NULL);
  10.     for (unsigned int i = 0; i < this->depth; i++)
  11.     {
  12.         glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, this->width, this->height, 1, format, GL_UNSIGNED_BYTE, buffers.at(i));
  13.     }

Ich habe vorher die einzelnen Texturen geladen und Pointer auf die Pixel in einem Vector abgelegt (buffers). Dann erstelle ich ein neues Textur-Objekt, binde es an GL_TEXTURE_2D_ARRAY, lass mir den Speicher reservieren und lege die einzelnen Texturen scheibchenweise hinein.

Mein Fragment-Shader dazu sieht folgendermaßen aus:
Code:
  1. #version 330
  2. #extension GL_EXT_texture_array : enable
  3.  
  4. uniform sampler2DArray atex;
  5.  
  6. in vec3 mid_position;
  7. in vec2 mid_texcoord;
  8.  
  9. out vec4 out_fragment[3];
  10.  
  11. void main ()
  12. {
  13.     out_fragment[0] = vec4(mid_position, 0.0f);
  14.     out_fragment[1] = vec4(mid_position.x);
  15.     out_fragment[2] = texture(atex, vec3(mid_texcoord.xy, 0.0f));
  16. }

Hier ist wieder einer der feinen Unterschiede zwischen 3D-Texturen und 2D-Texture-Arrays zu erkennen: Als Sampler braucht man hier nämlich statt sampler3D ein sampler2DArray.

Der Code ist übrigens (fast) copy&paste aus meinem Projekt, funktioniert also ganz sicher.

_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak


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


Wer ist online?

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