2014-02-25 77 views
0

我正在編寫着色器以在我的視頻播放項目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); 
} 

original image

yuv2rgb shader result

yuv2rgb shader result even worse

+0

我已經解決了這個問題。我的錯。紋理以錯誤的尺寸創建。但是一些視頻中仍然存在綠線 – LucasWang

回答

0

YUV輸入的格式是什麼 - 是否像着色器預期的那樣是平面數據(在單獨的緩衝區中)?此外,矩陣似乎不正確 - 你是否提到gstreamer中已有的例子,或者例如在http://www.ogre3d.org/forums/viewtopic.php?f=5&t=25877

+1

這不是一個答案。它應該是一個評論。 –

+0

YUV420平面,3架飛機。我認爲着色器和矩陣是正確的。我解碼相同的視頻並保存每架飛機,並使用'cat'生成yuv圖像。我測試了這個圖像的着色器,結果圖像是正確的。 – LucasWang

+0

如果這個結果是正確的 - 是否是來自另一個不起作用的着色器的原始問題發佈的圖像?設置有什麼不同? – prabindh