현재 두 개의 다른 비디오 스트림을 두 개의 다른 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);
}
결과는 다음 그림과 같다 :
가 가끔 가끔, 바로 그것을 얻을 더 나 빠졌지 만 첫 번째 동영상은 올바르게 재생됩니다. 시간이야.
채널을 조금 어리둥절하게 만들었을 때 나는 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);
'#version 420' ... "OpenGL ES를 사용합니다 ..."글쎄, 어느 것이지? – genpfault
나는 GLSL을 의미합니다. 죄송합니다. –
필자는 실제로이 파일을 자체 포함 된 단일 파일 예제로 변환해야한다고 생각합니다. 더미 YUV 소스 이미지를 생성 할 수 있으므로 비디오를 다룰 필요가 없습니다. 이렇게하면 문제를 격리하는 데 도움이됩니다. –