在OpenGL中将掩码应用于视频

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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
" +
                "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

答案

要跳过片段,可以在片段着色器中使用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;
}

以上是关于在OpenGL中将掩码应用于视频的主要内容,如果未能解决你的问题,请参考以下文章

找不到使用 C# 在 openGL 中将纹理应用于 3d 对象的方法

如何在片段着色器中将分辨率从静态更改为动态

如何在android中将json数据加载到片段中

OpenGL ES 1.1 - alpha 蒙版

无法在 GLEW 应用程序中将 OpenGL 缓冲区打印到控制台

在 Windows XP 中使用多个视频卡进行 OpenGL 渲染