Vuforia ChromaKey на видео наложение
Я работаю над проектом с Vuforia. Я использую образец VideoPlayback от Vuforia.
Когда Vuforia обнаруживает маркер, видео воспроизводится как наложение на этот маркер. Я пытаюсь применить кеинга на видео. Я нахожу эту статью http://pilcrowpipe.blogspot.fr/2013/03/chroma-keying-transparent-background.html
Я пытаюсь реализовать код, но ничего не получается. Я думаю, что этот пример использует видео фон для кеинга, но я хочу кеинга на оверлейном видео. Я прав?
В Vuforia Sample я думаю, что должен что-то изменить в функции renderFrameWithState.
if (NOT_READY != currentStatus) {
// Convert trackable pose to matrix for use with OpenGL
// ...
/// TEST doesn't work
//glDepthFunc(GL_LEQUAL);
//glEnable(GL_BLEND);
//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
///
// ...
glUseProgram(shaderProgramID);
glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, quadVertices);
glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, quadNormals);
glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, texCoords);
glEnableVertexAttribArray(vertexHandle);
glEnableVertexAttribArray(normalHandle);
glEnableVertexAttribArray(textureCoordHandle);
// I think I must change something in code above...
// But what and where ????
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, frameTextureID);
glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (GLfloat*)&modelViewProjectionVideo.data[0]);
glUniform1i(texSampler2DHandle, 0 /*GL_TEXTURE0*/);
glDrawElements(GL_TRIANGLES, kNumQuadIndices, GL_UNSIGNED_SHORT, quadIndices);
glDisableVertexAttribArray(vertexHandle);
glDisableVertexAttribArray(normalHandle);
glDisableVertexAttribArray(textureCoordHandle);
glUseProgram(0);
}
Я полностью нуб с OpenGL ES.
Кто-нибудь может мне помочь?
Спасибо
3 ответа
В порядке,
Я нашел решение для кеинга, но у меня есть новая проблема.
В фрагментном шейдере я использую код выше:
precision mediump float;
varying vec2 texCoord;
uniform sampler2D texSampler2D;
void main()
{
// Keying for green color
vec3 keying_color = vec3(0., 1., 0.);
float thresh = 0.8;
float slope = 0.2;
vec3 input_color = texture2D(texSampler2D, texCoord).rgb;
float d = abs(length(abs(keying_color.rgb - input_color.rgb)));
float edge0 = thresh * (1.0 - slope);
float alpha = smoothstep(edge0, thresh, d);
gl_FragColor = vec4(input_color, alpha);
}
В VideoPlaybackEAGL.mm я добавляю этот код в функцию renderFrameWithState.
if (NOT_READY != currentStatus) {
// Convert trackable pose to matrix for use with OpenGL
// ...
/// It's work
glDepthFunc(GL_LEQUAL);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
///
// ...
glUseProgram(shaderProgramID);
glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, quadVertices);
glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, quadNormals);
glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, texCoords);
glEnableVertexAttribArray(vertexHandle);
glEnableVertexAttribArray(normalHandle);
glEnableVertexAttribArray(textureCoordHandle);
// I think I must change something in code above...
// But what and where ????
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, frameTextureID);
glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (GLfloat*)&modelViewProjectionVideo.data[0]);
glUniform1i(texSampler2DHandle, 0 /*GL_TEXTURE0*/);
glDrawElements(GL_TRIANGLES, kNumQuadIndices, GL_UNSIGNED_SHORT, quadIndices);
glDisableVertexAttribArray(vertexHandle);
glDisableVertexAttribArray(normalHandle);
glDisableVertexAttribArray(textureCoordHandle);
glUseProgram(0);
}
Но теперь мой VideoBackground прекратил рендеринг, полностью завис. И мое оверлейное видео инвертирует позиции. Когда я ориентирую телефон на верх, видео накладывается на нижнюю. То же самое для левого и правого...
У вас есть идея или решение? Спасибо!
Последний
glEnable(GL_BLEND);
Должно быть:
glDisable(GL_BLEND);
чтобы не заморозить фон.
Спасибо за код!
После поиска я нашел решение!
В VideoPlaybackEAGL.mm я добавляю этот код в функцию renderFrameWithState.
if (NOT_READY != currentStatus) {
// Convert trackable pose to matrix for use with OpenGL
// ...
/// It's work
glDepthFunc(GL_LEQUAL);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
///
// ...
glUseProgram(shaderProgramID);
glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, quadVertices);
glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, quadNormals);
glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, texCoords);
glEnableVertexAttribArray(vertexHandle);
glEnableVertexAttribArray(normalHandle);
glEnableVertexAttribArray(textureCoordHandle);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, frameTextureID);
glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (GLfloat*)&modelViewProjectionVideo.data[0]);
glUniform1i(texSampler2DHandle, 0 /*GL_TEXTURE0*/);
glDrawElements(GL_TRIANGLES, kNumQuadIndices, GL_UNSIGNED_SHORT, quadIndices);
glDisableVertexAttribArray(vertexHandle);
glDisableVertexAttribArray(normalHandle);
glDisableVertexAttribArray(textureCoordHandle);
glUseProgram(0);
// Adding code above to resolve the problem...
glDepthFunc(GL_LEQUAL);
glEnable(GL_BLEND);
}
И это работа! Я немного изменяю вершинный шейдер, чтобы исправить ось Z.