У меня есть программа просмотра (mrViewer на sourceforge), которая отображает файлы фильмов, подавая изображения YCbCr и объединяя их позже в шейдер. В настоящее время я пытаюсь отследить проблему с цветом в моем средстве просмотра, неправильно отображающую фильмы DNxHD. Файл EXR должен быть виден в RGB, а не в линейной сцене. Фильм был создан из этого EXR-файла в Nuke (программа Comp). Все файлы фильмов конвертируются из изображения EXR без преобразования цветового пространства в NUKE 11. Все файлы фильмов кодируются с использованием цветового диапазона видео.
Color_Profile_nuke11_DNxHD_mov64_444.mov
Color_Profile_nuke11_DNxHD_mov64_422.mov
В шейдере я делаю (упрощенный код Cg):
half3 pre;
pre.r = tex2D(YImage, tc).r; // Y
pre.g = tex2D(UImage, tc).r; // U
pre.b = tex2D(VImage, tc).r; // V
half3 c;
if ( coeffs )
{
pre += Koff;
c.r = dot(Kr, pre);
c.g = dot(Kg, pre);
c.b = dot(Kb, pre);
}
else
{
half3 yuv;
yuv.r = 1.1643 * ( pre.r - 0.0625 );
yuv.g = pre.g - 0.5;
yuv.b = pre.b - 0.5;
c.r = yuv.r + 1.5958 * yuv.b;
c.g = yuv.r - 0.39173 * yuv.g - 0.81290 * yuv.b;
c.b = yuv.r + 2.017 * yuv.g;
}
Out output;
output.pixel = c;
return output;// Send coeffs to shader shader (C++ code)
{
_shader->setUniform( "coeffs", 1 );
// HDTV YCbCr coefficients
_shader->setUniform( "Koff", 0.0f, -0.5f, -0.5f );
_shader->setUniform( "Kr", 1.0f, 0.0f, 1.28033f );
_shader->setUniform( "Kg", 1.0f, -0.21482f, -0.38059f );
_shader->setUniform( "Kb", 1.0f, 2.12798f, 0.0f );
}
Теперь моя проблема заключается в том, что МСЭ 709 (тот, с dot()
звонки) путь вроде не ведёт себя правильно. Создает размытое изображение. Мне интересно, если это связано с полным jpeg
и полный mpeg
не принимая во внимание или мои коэффициенты неверны.
Если я устанавливаю цветовую матрицу ITU709 в своем коде C ++ с библиотекой ffmpeg и позволяю преобразованию выполнять ее swscale, я получаю хорошее соответствие цветов в изображении, если я выбираю путь 601 (по умолчанию) в шейдере.
Задача ещё не решена.
Других решений пока нет …