En utilisant opengl es shader pour convertir YUV RVB
Je veux convertir yuv rvb en opengl es shader avec juste un échantillonneur qui contient yuv données. Mon code est ci-dessous:
1) - je envoyer yuv données de texture:
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE,
mData.w, mData.h * 3 /2, 0, GLES20.GL_LUMINANCE,
GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(mData.yuv));
2) Mon vertex shader:
attribute vec4 position;
attribute vec2 inputTextureCoordinate;
attribute mediump float width;
varying vec2 v_texCoord;
varying mediump vec2 v_vuTexCoord;
varying mediump float x_coord;
void main()
{
gl_Position = position;
v_texCoord = vec2(inputTextureCoordinate.x, inputTextureCoordinate.y * 0.6666667);
v_vuTexCoord = vec2(inputTextureCoordinate.x, inputTextureCoordinate.y * 0.333333 + 0.6666667);
x_coord = floor(inputTextureCoordinate.x * width);
}
3) Mon fragment shader:
uniform sampler2D inputImageTexture;
varying mediump vec2 v_texCoord;
varying mediump vec2 v_vuTexCoord;
varying mediump float x_coord;
uniform mediump float u_one_over_tex_size;
void main()
{
mediump vec3 yuv;
mediump vec3 rgb;
mediump float valx = mod(x_coord , 2.0);
if(valx < 1.0)
{
yuv.y = texture2D(inputImageTexture, v_vuTexCoord + vec2(u_one_over_tex_size, 0)).r - 0.5;
yuv.z = texture2D(inputImageTexture, v_vuTexCoord).r - 0.5;
}
else {
yuv.y = texture2D(inputImageTexture, v_vuTexCoord).r - 0.5;
yuv.z = texture2D(inputImageTexture, v_vuTexCoord + vec2(u_one_over_tex_size, 0)).r - 0.5;
}
yuv.x = texture2D(inputImageTexture, v_texCoord).r;
rgb = mat3( 1, 1, 1,
0, -.34413, 1.772,
1.402, -.71414, 0) * yuv;
gl_FragColor = vec4(rgb, 1);
}
Mais le résultat n'est pas que je ne le pensais. Si je divise yuv données pour y et uv échantillonneurs et changement de vertex et fragment shader, et je peux avoir le bon résultat. Mais comment pouvais-je seulement envoyer un sampler juste
comme ci-dessus?
J'ai trouvé quelques informations intéressantes dans ce site code.google.com/p/o3d/source/browse/trunk/samples_webgl/shaders/...
OriginalL'auteur The Lord Of Ring | 2013-06-14
Vous devez vous connecter pour publier un commentaire.
Ont un oeil sur le code ici: http://www.fourcc.org/source/YUV420P-OpenGL-GLSLang.c
De sorte qu'il n'. My bad, je vais le supprimer.
si la valeur de r,g,b est supérieur à 1,0 , que devons-nous faire? @FredrikPihl
OriginalL'auteur Fredrik Pihl
Est peut-être hors-sujets, mais ici j'ai mis en place une YUV 4:2:2 v210 10 bits décodeur en GLSL.
OriginalL'auteur Mouze