Saya ingin menerapkan topeng alfa ke video. Setiap frame video memiliki informasi warna di bagian atas dan informasi alfa di bagian bawah. Seperti ini:

enter image description here

Dalam kasus saya, saya ingin piksel putih pada gambar alfa menjadi transparan di gambar utama. Saya memiliki tekstur lain yang mengisi piksel transparan itu.

Saya dapat menghasilkan satu-satunya gambar berwarna atau hanya gambar alfa, tetapi tidak dapat menerapkan alfa pada gambar. Saya menggunakan GLES20 di Android.

Ini kode saya yang memberikan layar hitam:

private val vidVertexShaderCode =
        """
    precision highp float;
    attribute vec3 vertexPosition;
    attribute vec4 uvs;
    varying vec2 varUvs;
    varying vec2 varMaskUvs;
    uniform mat4 texMatrix;
    uniform mat4 mvp;

    void main()
    {
        varUvs = (texMatrix * vec4(uvs.x, uvs.y, 0, 1.0)).xy;
        varMaskUvs = (texMatrix * vec4(uvs.x, uvs.y * 0.5, 0.1, 1.0)).xy;
        gl_Position = mvp * vec4(vertexPosition, 1.0);
    }
    """

private val vidFragmentShaderCode =
        """
    #extension GL_OES_EGL_image_external : require
    precision mediump float;

    varying vec2 varUvs;
    varying vec2 varMaskUvs;
    uniform samplerExternalOES texSampler;

    void main()
    {
        vec2 m_uv  = vec2(varMaskUvs.x, varMaskUvs.y); 
        vec4 mask = texture2D(texSampler, m_uv);  

        vec2 c_uv  = vec2(varUvs.x, varUvs.y * 0.5); 
        vec4 color = texture2D(texSampler, c_uv);  
        gl_FragColor = vec4(color.rgb, color.a * mask.r)
    }
    """

Apa yang saya lakukan salah?

P.S. Saya baru mengenal opengl.

2
MohanRaj Balumuri 18 Juni 2020, 05:48

1 menjawab

Jawaban Terbaik

Hitung koordinat v dari gambar (uvs.y * 0.5 + 0.5) dan mask (uvs.y * 0.5) di vertex shader:

precision highp float;
attribute vec3 vertexPosition;
attribute vec4 uvs;
varying vec2 varUvs;
varying vec2 varMaskUvs;
uniform mat4 texMatrix;
uniform mat4 mvp;

void main()
{
    varUvs      = (texMatrix * vec4(uvs.x, uvs.y * 0.5 + 0.5, 0, 1.0)).xy;
    varMaskUvs  = (texMatrix * vec4(uvs.x, uvs.y * 0.5, 0.0, 1.0)).xy;
    gl_Position = mvp * vec4(vertexPosition, 1.0);
}

Anda tidak memerlukan transformasi lebih lanjut di shader fragmen:

#extension GL_OES_EGL_image_external : require
precision mediump float;

varying vec2 varUvs;
varying vec2 varMaskUvs;
uniform samplerExternalOES texSampler;

void main()
{
    vec4 mask    = texture2D(texSampler, varMaskUvs);  
    vec4 color   = texture2D(texSampler, varUvs);  
    gl_FragColor = vec4(color.rgb, color.a * mask.r)
}
3
Rabbid76 18 Juni 2020, 04:36