J'essaie de convertir YV12 en RVB en utilisant le fragment shader suivant:
precision mediump float;
uniform sampler2D tex0, tex1, tex2;
varying vec2 v_texCoord;
void main(void) {
float r, g, b, y, u, v;
y = texture2D(tex0, v_texCoord).x;
u = texture2D(tex1, v_texCoord).x;
v = texture2D(tex2, v_texCoord).x;
y = 1.1643 * (y - 0.0625);
u = u - 0.5;
v = v - 0.5;
r = y + 1.5958 * v;
g = y - 0.39173 * u - 0.81290 * v;
b = y + 2.017 * u;
gl_FragColor = vec4(r, g, b, 1.0);
}
Ci-dessous, l'image d'origine suivie de l'image convertie. Sur la base de la sortie, pouvez-vous déterminer où je pourrais chercher pour déterminer ce qui cause le décodage incorrect?
image-processing
color
Erreur 454
la source
la source
Réponses:
L'image de sortie présente des lignes décalées les unes contre les autres, ce qui est généralement dû à une distance [octet] incorrecte entre les lignes (foulée). Autrement dit, les calculs de conversion des couleurs sont peut-être corrects, mais vous prenez le pixel source à une mauvaise position et / ou placez le pixel de sortie au mauvais endroit.
Pour des raisons de performances, les images YV12 peuvent utiliser des avancées importantes dans le matériel pour faciliter les performances. Par exemple, une image 320x240 YV12 peut avoir une foulée de 512 et cela signifie que le tampon de données est un espace de données 512x240 (512x240 octets pour Y, suivi de deux tableaux 256x120 pour V et U) où l'image de charge utile à gauche, et là est rembourrage invisible sur la droite.
la source
Je ne connais rien à la programmation de shaders de fragments, mais pour moi, il semble que la taille des mots de l'entrée et de la sortie varie. Et pour moi, il semble que vous ne faites pas attention au déballage et au reconditionnement des octets YV12 .
la source