首页 > 解决方案 > 在OpenGL中将蒙版应用于视频

问题描述


我是 OpenGL 的大一新生。我试图找到解决我的问题的方法。我用 alpha 蒙版录制了一段视频。视频 RGB 的顶部和底部是 alpha。据我了解需要更改我的着色器,但我不明白如何做到这一点。

顶点着色器

    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;" +
                "}";

在此处输入图像描述

标签: androidopengl-es

解决方案


要跳过片段,您可以使用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;
}

推荐阅读