Неверный результат при использовании GLSL для преобразования YUV в RGB

Я пишу шейдеры для отображения изображений yuv в моем проекте воспроизведения видео https://github.com/wang-bin/QtAV. Шейдер кажется правильным, потому что я тестировал одно изображение yuv. Но результат всегда неправильный, если я применяю свой шейдер в GLWidgetRenderer.

Первое изображение отображается без моего шейдера. 2-й результат при использовании шейдера. Для некоторых видео результат похож на третье изображение с множеством зеленых линий.

Я думаю, что в моем коде C++ есть некоторые ошибки. Но я не могу их узнать, потому что я не очень хорошо знаком с OpenGL.

Так в чем может быть причина?

код С++ находится здесь: https://github.com/wang-bin/QtAV/blob/master/src/GLWidgetRenderer.cpp

yuv 2 шейдер RGB https://github.com/wang-bin/QtAV/blob/master/src/shaders/yuv_rgb.f.glsl:

#ifdef GL_ES
// Set default precision to medium
precision mediump int;
precision mediump float;
#else
#define highp
#define mediump
#define lowp
#endif

// u_TextureN: yuv. use array?
uniform sampler2D u_Texture0;
uniform sampler2D u_Texture1;
uniform sampler2D u_Texture2;
varying lowp vec2 v_TexCoords;

//http://en.wikipedia.org/wiki/YUV calculation used
//http://www.fourcc.org/fccyvrgb.php
//GLSL: col first
// use bt601
const mat4 colorMatrix = mat4(1, 1, 1, 0,
                              0, -0.344, 1.773, 0,
                              1.403, -0.714, 0, 0,
                              0, 0, 0, 1)
                        * mat4(1, 0, 0, 0,
                               0, 1, 0, 0,
                               0, 0, 1, 0,
                               0, -0.5, -0.5, 1);
void main()
{
    // use r, g, a to work for both yv12 and nv12
    gl_FragColor = clamp(colorMatrix* vec4(texture2D(u_Texture0, v_TexCoords).r,
                                           texture2D(u_Texture1, v_TexCoords).g,
                                           texture2D(u_Texture2, v_TexCoords).a,
                                           1)
                      , 0.0, 1.0);
}

исходное изображение

результат шейдера yuv2rgb

yuv2rgb результат шейдера еще хуже


person LucasWang    schedule 25.02.2014    source источник
comment
Я исправил проблему. Виноват. Текстуры созданы с неправильными размерами. Но в некоторых видео все еще есть зеленые линии.   -  person LucasWang    schedule 26.02.2014


Ответы (1)


Каков формат ввода YUV - это плоские данные (в отдельных буферах), как ожидается шейдером? Также матрицы не кажутся правильными - вы ссылались на уже существующие примеры в gstreamer или, например, в http://www.ogre3d.org/forums/viewtopic.php?f=5&t=25877

person Prabindh    schedule 25.02.2014
comment
Это не ответ. Это должен быть комментарий. - person Nico Schertler; 25.02.2014
comment
ЮВ420 планарный, 3 плоскости. Я думаю, что шейдер и матрица являются правильными. Я декодирую одно и то же видео, сохраняю каждую плоскость и использую cat для создания yuv-изображения. Я тестирую свой шейдер для этого изображения, и изображение получается правильным. - person LucasWang; 25.02.2014
comment
Если этот результат правильный - является ли изображение, которое вы разместили в качестве исходного вопроса из другого шейдера, который не работает? Какая разница в настройках? - person Prabindh; 25.02.2014