Wie sampelt man float Texturen in OpenGL4x?



  • wie sampelt man Float Texturen Texturen (GL_RGBA32F) in OpenGL? jeder Farbkanal hat einen float mit 32 Bit

    so geht es leider nicht:

    vec3 diffuseMaterialColor = texture2D(texDiffuseMap, vtf.uv).xyz;
    

    obiger Code funktioniert leider nicht - bekomme nur schwarz als Wert

    wenn ich als Textur Format GL_RGBA wähle funktioniert alles.

    Im gDebugger sehe ich, dass die Float Texture (GL_RGBA32F) die korrekte texture enthält. Muss man float Texturen irgendwie besonders sampeln?



  • Sollte so funktionieren, das Problem liegt wohl irgendwo anders. Kompiliert der Shader überhaupt? Setzt du den Sampler richtig auf? Was sagt glGetError()?


  • Mod

    zeig mal die stelle an der du die textur anlegst



  • Ja der Shader compiliert.

    Den Sampler setzte ich so auf:

    glGenSamplers(1, &samplerState_);
    assert(glGetError() == GL_NO_ERROR);
    
    // Texture minification
    glSamplerParameteri(
    	samplerState_, 
    	GL_TEXTURE_MIN_FILTER, 
    	GL_LINEAR
    );
    assert(glGetError() == GL_NO_ERROR);
    
    glSamplerParameteri(
    	samplerState_, 
    	GL_TEXTURE_MAG_FILTER, 
    	GL_LINEAR);
    assert(glGetError() == GL_NO_ERROR);
    
    // Sets the wrap parameter for texture coordinate s
    glSamplerParameteri(
    	samplerState_, 
    	GL_TEXTURE_WRAP_S, 
    	GL_REPEAT
    );
    assert(glGetError() == GL_NO_ERROR);
    
    // Sets the wrap parameter for texture coordinate t
    glSamplerParameteri(
    	samplerState_, 
    	GL_TEXTURE_WRAP_T, 
    	GL_REPEAT
    );
    assert(glGetError() == GL_NO_ERROR);
    

    glGetError sagt immer GL NO ERROR. Auch der Debug Layer verhält sich ruhig.

    Die Textur lege ich so an:

    glTexImage2D(GL_TEXTURE_2D, 
    	0, 
    	GL_RGBA32F, 
    	width, 
    	height, 
    	0, 
    	GL_RGBA, 
    	GL_FLOAT,
    	NULL);
    assert(glGetError() == GL_NO_ERROR);
    
    // Update Texture
    glTexSubImage2D(GL_TEXTURE_2D, 0 ,0, 0, width_, height_, GL_RGBA, 
    	GL_FLOAT, (GLvoid*)textureDataCache_);
    assert(glGetError() == GL_NO_ERROR);
    

    Im gDebugger sehe ich, dass die Texture auch mit dem Bild gefüllt ist, das ich geladen habe (das in textureDataCache_ steckt).



  • Welche GPU verwendest du? (Nicht jede unterstützt dies. Und nicht jeder Treiber kommt damit zurecht)



  • Die GPU kann OpenGL 4.2 - ist eine Geforce 560 Ti mit neustem Treiber



  • Habe jetzt ein "Minimalbeispiel" nachgebaut - dort funktioniert es eigenartiger weise... hab bisher noch keinen Unterschied gefunden...


  • Mod

    selbe textur verwendet?
    versuch mal die textur in glTexImage2D schon mit daten zu fuellen.
    wenn das minimalbeispiel geht, bleibt dir wohl nichts anderes als bei dir alles durchzugehen und 1:1 zu vergleichen
    wenn bei dir non-float texturen gehen, denke ich dass du an sich alles richtig abarbeitest, kann also nur sein, dass du irgendwo ein falsches/inkompatibles flag setzt (ich nehme mal an deine float texture ist nicht nur schwarz? :P)



  • Der Sampler war anders...

    Minimalbeispiel:

    // Texture minification 
    glSamplerParameteri( 
        samplerState_, 
        GL_TEXTURE_MIN_FILTER, 
        GL_LINEAR 
    ); 
    assert(glGetError() == GL_NO_ERROR);
    

    "Echter" Code:

    // Texture minification 
    glSamplerParameteri( 
        samplerState_, 
        GL_TEXTURE_MIN_FILTER, 
        GL_LINEAR_MIPMAP_LINEAR  // hier war der unterschied
    ); 
    assert(glGetError() == GL_NO_ERROR);
    

    ich wollte filtern über mip maps - habe aber gar keine Mip Maps angelegt... komisch - eine Warnung vom Debuglayer wäre hilfreich gewesen - der hätte ja merken können, dass ich Über MipMaps filtern will aber das Texturobjekt keine Mip Maps hat


  • Mod

    den gedanken hatte ich auch kurz, aber dann dachte ich, dass wenn du nur das format aenderst zwischen RGBA und RGBAF32, es eigentlich in beiden faellen falsch sein mueste oder richtig.


Anmelden zum Antworten