我正在編寫着色器以在我的視頻播放項目https://github.com/wang-bin/QtAV中顯示yuv圖像。着色器看起來不錯,因爲我已經在單個yuv圖像上進行了測試。但是如果我在GLWidgetRenderer中應用着色器,結果總是錯誤的。錯誤的結果使用GLSL將YUV轉換爲RGB
第一張圖片沒有我的着色器顯示。第二個是使用着色器時的結果。對於某些視頻來說,結果喜歡第三張圖片,並有許多綠色線條。
我認爲我的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);
}
我已經解決了這個問題。我的錯。紋理以錯誤的尺寸創建。但是一些視頻中仍然存在綠線 – LucasWang