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.

Другие вопросы по тегам