2017-04-11 5 views
0

J'essaye de créer un shader de fragment de tonemap, pour mapper des valeurs de [0, someint] aux valeurs RVB, mais quand j'essaye d'employer GLints, la texture qui est rendue est tout 0s.GL_R32I TexImage2D ne pas télécharger correctement

est ici la création de texture pertinente et code de liaison:

std::array<GLint , 25 > pixels; 
int i=0; 
float di = 255.0f/25; 
std::generate(pixels.begin(), pixels.end(), [&]{return di * i++;}); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_R32I, 5,5 ,0, 
GL_RED_INTEGER, GL_INT, pixels.data()); 

et un fragment shader de:

#version 330 

in vec2 Texcoord; 
out vec4 outColor; 
uniform isampler2D tex; 

void main() 
{ 
    ivec4 val = texture(tex, Texcoord); 
    float ret = 0; 
    if(val.r == 0) 
    { 
     ret = 1; 
    } 
    outColor = vec4(ret,0,0, 1.0); 
} 

qui est appliqué à un 2 triangles de base UV texturé de [0,1] Le résultat attendu serait être un coin rouge et le reste noir, mais le carré entier est rouge, ce qui signifie que la texture entière est 0.

Lorsque j'essaie l'expérience avec glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, 5, 5 ,0, GL_RED, GL_FLOAT, pixels.data()); et un sampler2D, le shader se comporte comme prévu, mais mes valeurs sont bloquées à [0,1]. Les énumérations sont-elles incompatibles? glGetError ne renvoie aucune erreur, mais il peut échouer silencieusement d'une autre manière? J'utilise GLFW et OpenGL 3.3 sur Ubuntu, je ne sais pas si GL_R32I est supporté avec cette version?

Répondre

1

Définissez-vous GL_TEXTURE_MIN_FILTER pour être autre chose que GL_*_MIPMAP_*? La valeur initiale est GL_NEAREST_MIPMAP_LINEAR. Si ce n'est pas le cas, la texture ne fonctionnera pas car vous n'avez défini qu'un seul niveau de mipmap. Ainsi la texture est incomplète.

Par défaut, le niveau de mipmap défini le plus élevé est 1000. Vous pouvez le définir à 0 et cela fonctionnerait également.

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0) 

Le niveau maximal est un indice zéro.

+0

Ah! C'était le mode de filtrage. Le réglage de 'GL_LINEAR' à 'GL_NEAREST' a fonctionné. On dirait que les valeurs de 'GL_INT' ne peuvent pas être interpolées, cela a du sens. –