EDIT:
Ich glaube meine Frage hat sich erübrigt. Mein Fehler lag woanders.
Erkenntnis: GL_FLOAT liegt nicht zwischen [0,1]
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?
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
Danke und Gruß