Применить маску к видео в OpenGL - PullRequest
0 голосов
/ 15 сентября 2018


Я новичок в OpenGL. Я пытаюсь найти решение моей проблемы. Я записал видео с альфа-маской. Верхняя часть видео RGB, а нижняя - альфа. Как я понимаю, мне нужно изменить мои шейдеры, но я не понимаю, как это сделать.

Вершинный шейдер

    private static final String vertexShaderCode =
        "attribute vec4 vPosition;" +
                "attribute vec4 vTexCoordinate;" +
                "uniform mat4 textureTransform;" +
                "varying vec2 v_TexCoordinate;" +
                "void main() {" +
                "   v_TexCoordinate = (textureTransform * vTexCoordinate).xy;" +
                "   gl_Position = vPosition;" +
                "}";

Фрагмент шейдера

    private static final String fragmentShaderCode =
        "#extension GL_OES_EGL_image_external : require\n" +
                "precision mediump float;" +
                "uniform samplerExternalOES texture;" +
                "varying vec2 v_TexCoordinate;" +
                "void main () {" +
                "    vec4 color = texture2D(texture, v_TexCoordinate);" +
                "    gl_FragColor = color;" +
                "}";

enter image description here

1 Ответ

0 голосов
/ 15 сентября 2018

Чтобы пропустить фрагменты, вы можете использовать ключевое слово discard в фрагментном шейдере.

Вы должны сделать 2 просмотра текстуры. Первый в верхней половине, чтобы получить цветовые каналы RGB, и второй в нижней половине, чтобы получить маску из канала красного цвета:

vec2 c_uv  = vec2(texture.x, texture.y*0.5); 
vec4 color = texture2D(c_uv, v_TexCoordinate);

vec2  m_uv = vec2(texture.x, 0.5 + texture.y*0.5); 
float mask = texture2D(m_uv, v_TexCoordinate).r;

Фрагмент шейдера может выглядеть так:

#extension GL_OES_EGL_image_external : require
precision mediump float;

uniform samplerExternalOES texture;
varying vec2 v_TexCoordinate;

void main () {

    vec2  m_uv = vec2(v_TexCoordinate.x, 0.5 + v_TexCoordinate.y*0.5); 
    float mask = texture2D(texture, m_uv).r;
    if ( mask < 0.5 )
        discard;

    vec2 c_uv  = vec2(v_TexCoordinate.x, v_TexCoordinate.y*0.5); 
    vec4 color = texture2D(texture, c_uv);  
    gl_FragColor = color;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...