Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

1

19.10.2013, 17:04

[OpenGL] Texturformate; Speichern von Integern

EDIT:
Ich glaube meine Frage hat sich erübrigt. Mein Fehler lag woanders.
Erkenntnis: GL_FLOAT liegt nicht zwischen [0,1] :rolleyes:


Hi zusammen,

OpenGL Texturen waren für mich schon immer ein graus und irgendwie "rate" ich immer welche Parameter die richtigen sind.
Ich versuche derzeit in einer Textur Integer zu speichern. D.h. ich möchte beim Abrufen der Texturwerte aum Punkt (u,v) sowas zurückbekommen wie (1,124,65125,5).
Erste Frage: Ist das überhaupt möglich oder werden Texturwerte *immer* auf [0,1] normiert?

Derzeit versuche ich die Texturwerte als float abzurufen um sowas zu erhalten (0.4,120.0,20301.0,0.6)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
// size = (1024,1024) => Textur ist 1024x1024 Pixel
std::vector<GLfloat> empty(size.x*size.y*4*4,0);

glTexImage2D(GL_TEXTURE_2D, 0, 
                GL_RGBA16F,         // 4-dim Float Werte im VRAM (?)
                size.x, size.y,         // Größe der Textur in Pixeln
                0, 
                GL_RGBA,                // Formatgröße von "empty"
                GL_FLOAT,               // "empty" ist float
                &empty[0]);


Das ergibt nicht das gewünschte Resultat. Wenn ich das richtig verstanden habe, dann liegen GL_FLOAT nur zwischen [0,1], oder? :wacko:

Angenommen ich möchte in die Textur etwas abspeichern wie zB (0.4,120,20301,0.6), also (float, int, int, float). Wobei ich weiß, dass ein Wert maximal zB max_value=24000 groß sein kann.
Um das zu erreichen würde ich jetzt spontan hingehen und die y und z Koordiante durch max_value teilen und später im einem anderem shader wieder die Werte mit max_value multiplizieren. Genügt dann die Genauigkeit von GL_RGBA16F? Gibt es Alternativen? Elegantere Möglichkeiten?
Wie bereits anfangs gesagt, OpenGL Texturen sind für mich irgendwie häufig ein Ratespiel :S

Danke und Gruß

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Sc4v« (19.10.2013, 18:43)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

20.10.2013, 02:08

Ich versuche derzeit in einer Textur Integer zu speichern. D.h. ich möchte beim Abrufen der Texturwerte aum Punkt (u,v) sowas zurückbekommen wie (1,124,65125,5).
Erste Frage: Ist das überhaupt möglich oder werden Texturwerte *immer* auf [0,1] normiert?

Klar ist das möglich, man muss eben ein passendes Texturformat wählen. In dem Fall bietet sich wohl GL_RGBA16UI an. Auf Shaderseite muss man dann selbstverständlich auch den dazu passenden usampler2D wählen.

Das ergibt nicht das gewünschte Resultat. Wenn ich das richtig verstanden habe, dann liegen GL_FLOAT nur zwischen [0,1], oder? :wacko:

Nein, GL_FLOAT ist ein ganz normaler 32 Bit float. Als Texturformat hast du allerdings ein 16 Bit Float ("half") Format gewählt.

Angenommen ich möchte in die Textur etwas abspeichern wie zB (0.4,120,20301,0.6), also (float, int, int, float). Wobei ich weiß, dass ein Wert maximal zB max_value=24000 groß sein kann.

Hängt von dem von dir gewählten Texturformat ab. Es ist eigentlich ganz einfach: Das erste Format (internalFormat) ist das Format der Textur selbst. Das zweite Format (format + type) ist das Format, in dem die an die Funktion übergebenen Daten vorliegen. Ich muss allerdings fragen, wieso genau du so einen Mix aus ints und floats in eine Textur packen willst.

Außerdem würde ich generell zu glTexStorage2D() anstatt glTexImage2D() raten... ;)

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

3

20.10.2013, 16:44

Okay, danke für dein Feedback!
Außerdem würde ich generell zu glTexStorage2D() anstatt glTexImage2D() raten... ;)
Es ist einfach zu schreiben, ja. Bietet es auch Performance-Vorteile?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

20.10.2013, 21:47

Naja, erstens ist glTexStorage*() rein konzeptionell wesentlich sinnvoller. Was die Performance betrifft, so wird zwischen einer mit glTexImage*() und einer mit glTexStorage*() erzeugten Textur bei der Verwendung der Textur wohl eher kaum ein Unterschied zu erwarten sein. glTexStorage*() ist aber bezüglich des Overhead auf Driverseite vermutlich wesentlich leichtgewichtiger. glTexImage*() erfordert all die komplizierten Regeln bezüglich Texture Completeness und der Driver muss stets damit rechnen, dass die Anwendung plötzlich doch noch einmal glTexImage*() aufruft und alles wieder anders wird. glTexStorage*() dagegen erzeugt die ganze Textur einmal in einem Aufruf und das wars...

Werbeanzeige