2014-06-24 2 views
1

현재 두 개의 다른 비디오 스트림을 두 개의 다른 OpenGL 텍스처에 동시에 렌더링하는 중입니다. QAbstractVideoSurface 구현을 사용하여 비디오의 각 프레임을 준비한 다음이를 OpenGL 그리기 메서드에 전달합니다. 각 프레임은 YUV 코딩으로 도착하므로 RGB 값을 얻으려면 GLSL을 사용합니다.여러 비디오 렌더링 중 변형 된 그림

문제는 다음과 같습니다. 두 개 이상의 동영상을 그릴 때마다 첫 번째 동영상은 올바르게 재생되지만 다른 동영상은 채널에 약간의 어색함이 있습니다.

내 버텍스 쉐이더 :

#version 420 
attribute vec2 position; 
attribute vec2 texcoord; 
uniform mat4 modelViewProjectionMatrix; 
varying vec2 v_texcoord; 

void main() 
{ 
    gl_Position = modelViewProjectionMatrix * vec4(position, 0, 1); 
    v_texcoord = texcoord.xy; 
} 

내 조각 쉐이더 :

#version 420 
varying vec2 v_texcoord; 
uniform sampler2D s_texture_y; 
uniform sampler2D s_texture_u; 
uniform sampler2D s_texture_v; 
uniform float s_texture_alpha; 

void main(void) 
{ 
    highp float y = texture2D(s_texture_y, v_texcoord).r; 
    highp float u = texture2D(s_texture_u, v_texcoord).r - 0.5; 
    highp float v = texture2D(s_texture_v, v_texcoord).r - 0.5; 
    highp float r = y + 1.402 * v; 
    highp float g = y - 0.344 * u - 0.714 * v; 
    highp float b = y + 1.772 * u; 
    gl_FragColor = vec4(r, g, b, s_texture_alpha); 
} 

결과는 다음 그림과 같다 :

RGB/YUV issue

가 가끔 가끔, 바로 그것을 얻을 더 나 빠졌지 만 첫 번째 동영상은 올바르게 재생됩니다. 시간이야.

채널을 조금 어리둥절하게 만들었을 때 나는 u 변수가 프래그먼트 셰이더에서 v와 같은 값을 얻는 경우가 있다는 것을 알았습니다. 그것은 다음과 같이 내 텍스처 bindig은 다음과 같습니다

uniformSamplers[0] = functions.glGetUniformLocation(program, "s_texture_y"); 
uniformSamplers[1] = functions.glGetUniformLocation(program, "s_texture_u"); 
uniformSamplers[2] = functions.glGetUniformLocation(program, "s_texture_v"); 

glActiveTexture(GL_TEXTURE0 + 0); 
glBindTexture(GL_TEXTURE_2D, textRef); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, image_width, image_height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, (GLvoid*)(image)); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
functions.glUniform1i(uniformSamplers[0], 0); 

glActiveTexture(GL_TEXTURE0 + 1); 
glBindTexture(GL_TEXTURE_2D, textRefU); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, image_width/2, image_height/2, 0, GL_LUMINANCE, 
      GL_UNSIGNED_BYTE, (GLvoid*)(image + image_width * image_height)); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
functions.glUniform1i(uniformSamplers[1], 1); 

glActiveTexture(GL_TEXTURE0 + 2); 
glBindTexture(GL_TEXTURE_2D, textRefV); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, image_width/2, image_height/2, 0, GL_LUMINANCE, 
      GL_UNSIGNED_BYTE, (GLvoid*)(image + image_height * image_width + (image_width/2) * (image_height/2))); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
functions.glUniform1i(uniformSamplers[2], 2); 
+0

'#version 420' ... "OpenGL ES를 사용합니다 ..."글쎄, 어느 것이지? – genpfault

+1

나는 GLSL을 의미합니다. 죄송합니다. –

+0

필자는 실제로이 파일을 자체 포함 된 단일 파일 예제로 변환해야한다고 생각합니다. 더미 YUV 소스 이미지를 생성 할 수 있으므로 비디오를 다룰 필요가 없습니다. 이렇게하면 문제를 격리하는 데 도움이됩니다. –

답변

1

문제는 매우 절름발이, 내가 쉐이더에 초점을 맞추고 거기에 문제를 알아 내려고 몇 일을 보냈다. 그러나 문제는 텍스처 참조 초기화에있었습니다. 세 참조 모두 동일한 값을 가지므로 매번 동일한 텍스처를 덮어 씁니다. 세 가지 모두를 다른 가치로 사용하면 완벽하게 작동합니다.

관련 문제