incorrect Voir commutation gif entre RVB et colormap:openGL Translating la luminosité des pixels à la texture ColorMap produit résultat
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...
Votre lien d'image me donne une page "Non trouvé" –
La palette de couleurs est-elle continue (par exemple un dégradé)? Sinon, "GL_LINEAR" n'a pas de sens. –
la palette de couleurs est de 2 pixels, je ne sais pas comment "continu" c'est.lien de l'image fixe –