我有一个查看器(sourceforge上的mrViewer),通过提供YCbCr图像并稍后在着色器中合并它们来显示电影文件。目前,我正在尝试跟踪查看器中的颜色问题,无法正确显示DNxHD电影。 EXR文件将以RGB而不是线性场景显示。这部电影是从Nuke(一个补偿程序)中的EXR文件创建的。所有电影文件都是从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 );
}
现在,我的问题是ITU 709(带有dot()
呼叫的那条)的路径似乎行为不正常。它将创建褪色的图像。我想知道这是否与未考虑全jpeg
和全mpeg
有关,或者我的系数是否错误。
如果我使用ffmpeg库在C ++代码中将颜色矩阵设置为ITU709,并让其swscale进行转换,则在着色器中选择(默认)601路径后,图像中的颜色就会很好。