我正在编写着色器以在我的视频播放项目https://github.com/wang-bin/QtAV中显示yuv图像。着色器似乎是正确的,因为我在单个yuv图像上进行了测试。但是如果我在GLWidgetRenderer中应用我的着色器,结果总是错误的。
没有我的着色器显示的第一张图片。第二个是使用着色器时的结果。对于某些视频,结果喜欢第三张图片,有许多绿线。
我认为我的C ++代码存在一些错误。但是我找不到它们,因为我对OpenGL并不熟悉
那么原因可能是什么?
c ++代码在这里: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);
}
答案 0 :(得分:0)
YUV输入的格式是什么 - 是着色器所期望的平面数据(在单独的缓冲区中)?此外,矩阵看起来也不正确 - 您是否已在gstreamer中提及已存在的示例,或者例如在http://www.ogre3d.org/forums/viewtopic.php?f=5&t=25877
中