2017-03-23 3 views
0

incorrect Voir commutation gif entre RVB et colormap:openGL Translating la luminosité des pixels à la texture ColorMap produit résultat

enter image description here

Le problème est que les deux images sont différentes.

Je dessine des points RVB blancs (1.0,1.0,1.0). Le canal alpha contrôle la luminosité des pixels, ce qui crée le flou de points. C'est ce que vous voyez comme l'image la plus lumineuse. Ensuite, j'ai un (1.0,1.0,1.0,1.0) et dans un fragment shader je texture 2-pixel noir et blanc (0.0,0.0,0.0,1.0):

#version 330 

precision highp float; 

uniform sampler2D originalColor; 
uniform sampler1D colorMap; 
in vec2 uv; 
out vec4 color; 

void main() 
{ 
    vec4 oldColor = texture(originalColor, uv); 
    color = texture(colorMap, oldColor.a); 
} 

Très simplement, prendre la fragment de la valeur alpha de la texture originalColor de 0 à 1, et la traduit en une nouvelle couleur avec la texture colorMap du noir au blanc. Il ne devrait pas y avoir de différence entre les deux images! Ou ... au moins, c'est mon objectif.

Voici ma configuration pour la texture colormap

glActiveTexture(GL_TEXTURE0); 
    glGenTextures(1, &colormap_texture_id); // get texture id 
    glBindTexture(GL_TEXTURE_1D, colormap_texture_id); 
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // required: stop texture wrapping 
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // required: scale texture with linear sampling 
    glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA32F, colormapColors.size(), 0, GL_RGBA, GL_FLOAT, colormapColors.data()); // setup memory 

boucle de rendu:

GLuint textures[] = { textureIDs[currentTexture], colormap_texture_id }; 
    glBindTextures(0, 2, textures); 

    colormapShader->use(); 
    colormapShader->setUniform("originalColor", 0); 
    colormapShader->setUniform("colorMap", 1); 
    renderFullScreenQuad(colormapShader, "position", "texCoord"); 

J'utilise une texture 1D comme colormap car il semble que est la seule façon de potentiellement avoir un 1000 à 2000 index des valeurs de colormap stockées dans la mémoire GPU. S'il y a un meilleur moyen, faites le moi savoir. Je suppose que le problème est que le calcul d'interpolation entre deux pixels n'est pas juste pour mes fins.

Que dois-je faire pour obtenir les résultats escomptés?

Pour vous assurer qu'il n'y a pas manigances j'essayé à suivre le code de shaders:

color = texture(colorMap, oldColor.a); //incorrect results 
color = texture(colorMap, (oldColor.r + oldColor.g + oldColor.b)/3); //incorrect 
color = texture(colorMap, (oldColor.r + oldColor.g + oldColor.b + oldColor.a)/4); //incorrect 
color = vec4(oldColor.a); //incorrect 
color = oldColor; // CORRECT... obviously... 
+0

Votre lien d'image me donne une page "Non trouvé" –

+0

La palette de couleurs est-elle continue (par exemple un dégradé)? Sinon, "GL_LINEAR" n'a pas de sens. –

+0

la palette de couleurs est de 2 pixels, je ne sais pas comment "continu" c'est.lien de l'image fixe –

Répondre

1

Je pense que pour être plus précis, vous auriez besoin de changer:

color = texture(colorMap, oldColor.a); 

à

color = texture(colorMap, oldColor.a * 0.5 + 0.25); 

Ou plus généralement

color = texture(colorMap, oldColor.a * (1.0 - (1.0/texWidth)) + (0.5/texWidth)); 

Normalement, vous ne remarquerez pas l'erreur, c'est juste parce que texWidth est si petit que la différence est significative.

La raison en est que la texture va seulement commencer le filtrage linéaire du noir au blanc après avoir passé le centre du premier texel (à 0,25 dans votre texture de 2 texels). L'interpolation est complète une fois que vous passez le centre du dernier texel (à 0.75).

Si vous aviez une texture 1024 comme celle que vous avez mentionnée, alors l'interpolation commence à 0,000488 et je doute que vous ayez remarqué l'erreur.

+0

Oui! Je vous remercie! Il semble que j'ai toujours un problème où la luminosité globale est différente, mais au moins c'est juste un problème de luminosité maintenant, pas un problème d'interpolation. L'augmentation de la luminosité du pixel résout arbitrairement cela. Devra enquêter plus loin. –

+0

f *** hmm ... en fait le problème n'est toujours pas réglé en changeant les luminosités, le problème doit exister ailleurs. J'ai une idée de ce que cela pourrait être, je reviendrai là-dessus quand je le pourrai. (bien que cette réponse me rapproche des résultats souhaités) –

+1

Il est possible qu'à moins d'avoir fait attention, votre canal alpha ne contienne peut-être pas ce que vous pensez qu'il contient. Si vous rendez un texel avec 0.5 alpha avec un mélange alpha standard alors le framebuffer ne contiendra pas 0.5, il contiendra 0.25. Probablement la solution la plus simple serait d'utiliser simplement color = texture (colorMap, oldColor.r * 0.5 + 0.25) ;. Sinon, vous devez modifier avec soin votre fonction de mélange alpha pour qu'elle s'accumule correctement, ce qui peut être fait mais est un peu fastidieux. – Columbo