【问题标题】:Apply mask to video in OpenGL在OpenGL中将蒙版应用于视频
【发布时间】:2018-09-15 21:52:57
【问题描述】:


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

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

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

    【讨论】:

    • 谢谢伙计!我会试试的
    • 现在我有一些错误链接程序时出错:错误:0:2:'x':字段选择需要左侧的结构、向量或矩阵错误:0:2:'y ':字段选择需要左侧的结构、向量或矩阵错误:0:2:'':错误的操作数类型不存在采用左侧操作数类型的操作''跨度>
    • @YarikDenisyk 对不起,我混了一些东西,看看答案的变化
    • 我认为它有效,但有点奇怪)drive.google.com/open?id=1CuP01VBVl9Ey0H4wH9bDftnGYpVlew2N
    • 错误在于m_uv需要改"vec2 m_uv = vec2(v_TexCoordinate.x, 0.5 + v_TexCoordinate.y*0.5);"
    猜你喜欢
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2012-10-02
    • 2021-02-15
    相关资源
    最近更新 更多