usampler2D - cant convert float to unsigned int



  • Heyho,

    ich mal wieder mit ner dummen Frage 😃

    ich habe eine Textur mit 12Bit Grauwert-Daten vorliegen.
    Und möchte Sie CPU-Seitig auch auf 12Bit lassen.
    Sie steckt in einem unsigned short.

    Die Umrechnung sollte dann auf der Graka passieren.

    Code so far...

    ...
    	GLuint texture;
    	glGenTextures(0, &texture);
    	glBindTexture(GL_TEXTURE_2D, texture);
    	glTexImage2D(GL_TEXTURE_2D, 0, GL_R16, this->dcmReader->getWidth(), this->dcmReader->getHeight(), 0, GL_RED, GL_UNSIGNED_SHORT, this->pixelData);
    
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    
    ...
    
    // Fragment Shader
    
    #version 430 core
    //#extension GL_EXT_gpu_shader4 : enable
    
    in vec2 fragment_uv;
    uniform usampler2D s2D;
    
    void main() {
    	//uvec4 tmp = texture(s2D, fragment_uv);
    	uvec4 tmp = texture2D(s2D, fragment_uv);
    	tmp[1] = tmp[0];
    	tmp[2] = tmp[0];
    	tmp[3] = 1.0f;
    	gl_FragColor = tmp;
    }
    

    Fehlermeldung sieht wie folgt aus:

    Fragment shader failed to compile with the following errors:
    ERROR: 0:8: error(#160) Cannot convert from: "4-component vector of vec4" to: "4
    -component vector of uvec4"
    ERROR: 0:11: error(#160) Cannot convert from: "const float" to: "unsigned int"
    ERROR: error(#273) 2 compilation errors.  No code generated
    
    Fehler: Fragment shader(s) were not successfully compiled before glLinkProgram()
     was called.  Link failed.
    

    Die Fehlermeldung verstehe ich schon - scheinbar gibt texture2D (und texture auch) einen float zurück und mein uvec4 will nunmal unsigned int haben.
    Und die lassen sich nicht Konvertieren.

    Ich habe allerdings einen 12Bit int wert, den ich nun auch gerne als int speichern würde.
    Denn wenn ich ihn in einen vec4 Speicher wird mein bild komplett weiß.

    Wenn ich das Bild vorher Konvertiere und dann als UNSIGNED_BYTE und GL_R8 übergebe klappt alles wunderbar.
    Also liegts nicht an den Bildinformationen.

    Wie krieg ich denn nun die richtigen 12Bit Bilddaten in meinen uvec4?

    Im netz finde ich nur diese GL_EXT - Zeile die ich auskommentiert hab.
    Die funktioniert aber leider nicht.

    Lieben Gruß

    Jango



  • Bin mir auch nicht sicher, aber hast du mal GL_R16I oder GL_R16UI als internalFormat und entsprechend im shader isampler2D bzw. usampler2D probiert?



  • Jap, GL_16UI brachte genau das selbe Ergebnis wie GL_16

    und bei GL_16I und isampler auch exakt das selbe 😞

    Gruß


Log in to reply