Android 如何制作水印渲染器?

Android 如何制作水印渲染器?,android,mobile,opengl-es,Android,Mobile,Opengl Es,我想在Android上定制水印渲染器 我将在当前相机预览屏幕的右下角添加水印 这是我制作的源代码。此代码不起作用 请帮帮我。多谢各位 函数调用顺序为: -水纹纹理 -创建缓冲区 -配置OpenGL -画 我解决了我的问题 这是源代码 public class WatermarkRenderer implements Renderer { private final float[] TEX_VERTICES = { 0.0f, 1.0f,

我想在Android上定制水印渲染器

我将在当前相机预览屏幕的右下角添加水印

这是我制作的源代码。此代码不起作用

请帮帮我。多谢各位

函数调用顺序为:

-水纹纹理

-创建缓冲区

-配置OpenGL

-画

我解决了我的问题

这是源代码

public class WatermarkRenderer implements Renderer {

    private final float[] TEX_VERTICES = {
            0.0f, 1.0f,
            1.0f, 1.0f,
            0.0f, 0.0f,
            1.0f, 0.0f
    };
    private final float[] POS_VERTICES = {
            0.2f, -1.0f,
            1.0f, -1.0f,
            0.2f, -0.9f,
            1.0f, -0.9f
    };

    private static final String VERTEX_SHADER =
                    "attribute vec4 a_position;\n" +
                    "attribute vec2 a_texcoord;\n" +
                    "varying vec2 v_texcoord;\n" +
                    "void main() {\n" +
                    "  gl_Position = a_position;\n" +
                    "  v_texcoord = a_texcoord;\n" +
                    "}\n";
    private static final String FRAGMENT_SHADER =
                    "precision mediump float;\n" +
                    "uniform sampler2D tex_sampler;\n" +
                    "varying vec2 v_texcoord;\n" +
                    "void main() {\n" +
                    "  gl_FragColor = texture2D(tex_sampler, v_texcoord);\n" +
                    "}\n";

    private final int FLOAT_SIZE_BYTES = 4;

    private Bitmap  watermark;

    private int shaderProgram;
    private int texSamplerHandle;
    private int texCoordHandle;
    private int posCoordHandle;
    private FloatBuffer texVertices;
    private FloatBuffer posVertices;

    private int[] textureHandles = new int[1];

    @Override
    public void configureOpenGL() {

        shaderProgram = GLES20.glCreateProgram();
        GLES20.glAttachShader(shaderProgram, OpenGLUtils.loadShader(GLES20.GL_VERTEX_SHADER, VERTEX_SHADER));
        GLES20.glAttachShader(shaderProgram, OpenGLUtils.loadShader(GLES20.GL_FRAGMENT_SHADER, FRAGMENT_SHADER));
        GLES20.glLinkProgram(shaderProgram);

        int[] linkStatus = new int[1];
        GLES20.glGetProgramiv(shaderProgram, GLES20.GL_LINK_STATUS, linkStatus, 0);
        if (linkStatus[0] != GLES20.GL_TRUE) {
            String info = GLES20.glGetProgramInfoLog(shaderProgram);
            GLES20.glDeleteProgram(shaderProgram);
            shaderProgram = 0;
            throw new RuntimeException("Could not link program: " + info);
        }

        texSamplerHandle = GLES20.glGetUniformLocation(shaderProgram, "tex_sampler");
        texCoordHandle = GLES20.glGetAttribLocation(shaderProgram, "a_texcoord");
        posCoordHandle = GLES20.glGetAttribLocation(shaderProgram, "a_position");
    }

    @Override
    public void createBuffers() {
        ByteBuffer byteBuffer;

        byteBuffer = ByteBuffer.allocateDirect(TEX_VERTICES.length * FLOAT_SIZE_BYTES);
        byteBuffer.order(ByteOrder.nativeOrder());
        texVertices = byteBuffer.asFloatBuffer();
        texVertices.put(TEX_VERTICES);
        texVertices.position(0);

        byteBuffer = ByteBuffer.allocateDirect(POS_VERTICES.length * FLOAT_SIZE_BYTES);
        byteBuffer.order(ByteOrder.nativeOrder());
        posVertices = byteBuffer.asFloatBuffer();
        posVertices.put(POS_VERTICES);
        posVertices.position(0);
    }

    @Override
    public void draw() {

        // Select the program.
        GLES20.glUseProgram(shaderProgram);

        GLES20.glEnable(GLES20.GL_BLEND);
        GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA );

        // Set the vertex attributes
        GLES20.glVertexAttribPointer(texCoordHandle, 2, GLES20.GL_FLOAT, false, 0, texVertices);
        GLES20.glEnableVertexAttribArray(texCoordHandle);
        GLES20.glVertexAttribPointer(posCoordHandle, 2, GLES20.GL_FLOAT, false, 0, posVertices);
        GLES20.glEnableVertexAttribArray(posCoordHandle);

        // Set the input texture
        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandles[0]);
        GLES20.glUniform1i(texSamplerHandle, 0);

        GLES20.glGenTextures(textureHandles.length, textureHandles, 0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandles[0]);

        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, watermark, 0);

        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);

        GLES20.glDisableVertexAttribArray(texCoordHandle);
        GLES20.glDisableVertexAttribArray(posCoordHandle);

        GLES20.glDisable(GLES20.GL_BLEND);

        GLES20.glUseProgram(0);
    }

    @Override
    public void setProjectionMatrix(float[] projectionMatrix) {
    }

    public void setWatermarkTexture(Bitmap bitmap) {
        watermark = bitmap;
    }
}

“它不起作用”不是问题。你预计会发生什么?到底发生了什么?有什么区别?它是否崩溃,或显示不正确的输出?如果撞坏了,日志是什么?你需要更透彻地解释一下,我只是看到了我的自定义渲染器类struct,当我使用上面的类时,什么都没发生。所以我只想使纹理渲染器,可以显示png水印以上的视频预览。仅供参考,摄影机渲染器已在工作。但不显示水印。我已经更新了我的源代码,基本上我想知道我的课程缺少什么?它适用于录像机视频??如果是,请让我知道。是的,可以添加到视频
public class WatermarkRenderer implements Renderer {

    private final float[] TEX_VERTICES = {
            0.0f, 1.0f,
            1.0f, 1.0f,
            0.0f, 0.0f,
            1.0f, 0.0f
    };
    private final float[] POS_VERTICES = {
            0.2f, -1.0f,
            1.0f, -1.0f,
            0.2f, -0.9f,
            1.0f, -0.9f
    };

    private static final String VERTEX_SHADER =
                    "attribute vec4 a_position;\n" +
                    "attribute vec2 a_texcoord;\n" +
                    "varying vec2 v_texcoord;\n" +
                    "void main() {\n" +
                    "  gl_Position = a_position;\n" +
                    "  v_texcoord = a_texcoord;\n" +
                    "}\n";
    private static final String FRAGMENT_SHADER =
                    "precision mediump float;\n" +
                    "uniform sampler2D tex_sampler;\n" +
                    "varying vec2 v_texcoord;\n" +
                    "void main() {\n" +
                    "  gl_FragColor = texture2D(tex_sampler, v_texcoord);\n" +
                    "}\n";

    private final int FLOAT_SIZE_BYTES = 4;

    private Bitmap  watermark;

    private int shaderProgram;
    private int texSamplerHandle;
    private int texCoordHandle;
    private int posCoordHandle;
    private FloatBuffer texVertices;
    private FloatBuffer posVertices;

    private int[] textureHandles = new int[1];

    @Override
    public void configureOpenGL() {

        shaderProgram = GLES20.glCreateProgram();
        GLES20.glAttachShader(shaderProgram, OpenGLUtils.loadShader(GLES20.GL_VERTEX_SHADER, VERTEX_SHADER));
        GLES20.glAttachShader(shaderProgram, OpenGLUtils.loadShader(GLES20.GL_FRAGMENT_SHADER, FRAGMENT_SHADER));
        GLES20.glLinkProgram(shaderProgram);

        int[] linkStatus = new int[1];
        GLES20.glGetProgramiv(shaderProgram, GLES20.GL_LINK_STATUS, linkStatus, 0);
        if (linkStatus[0] != GLES20.GL_TRUE) {
            String info = GLES20.glGetProgramInfoLog(shaderProgram);
            GLES20.glDeleteProgram(shaderProgram);
            shaderProgram = 0;
            throw new RuntimeException("Could not link program: " + info);
        }

        texSamplerHandle = GLES20.glGetUniformLocation(shaderProgram, "tex_sampler");
        texCoordHandle = GLES20.glGetAttribLocation(shaderProgram, "a_texcoord");
        posCoordHandle = GLES20.glGetAttribLocation(shaderProgram, "a_position");
    }

    @Override
    public void createBuffers() {
        ByteBuffer byteBuffer;

        byteBuffer = ByteBuffer.allocateDirect(TEX_VERTICES.length * FLOAT_SIZE_BYTES);
        byteBuffer.order(ByteOrder.nativeOrder());
        texVertices = byteBuffer.asFloatBuffer();
        texVertices.put(TEX_VERTICES);
        texVertices.position(0);

        byteBuffer = ByteBuffer.allocateDirect(POS_VERTICES.length * FLOAT_SIZE_BYTES);
        byteBuffer.order(ByteOrder.nativeOrder());
        posVertices = byteBuffer.asFloatBuffer();
        posVertices.put(POS_VERTICES);
        posVertices.position(0);
    }

    @Override
    public void draw() {

        // Select the program.
        GLES20.glUseProgram(shaderProgram);

        GLES20.glEnable(GLES20.GL_BLEND);
        GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA );

        // Set the vertex attributes
        GLES20.glVertexAttribPointer(texCoordHandle, 2, GLES20.GL_FLOAT, false, 0, texVertices);
        GLES20.glEnableVertexAttribArray(texCoordHandle);
        GLES20.glVertexAttribPointer(posCoordHandle, 2, GLES20.GL_FLOAT, false, 0, posVertices);
        GLES20.glEnableVertexAttribArray(posCoordHandle);

        // Set the input texture
        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandles[0]);
        GLES20.glUniform1i(texSamplerHandle, 0);

        GLES20.glGenTextures(textureHandles.length, textureHandles, 0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandles[0]);

        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, watermark, 0);

        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);

        GLES20.glDisableVertexAttribArray(texCoordHandle);
        GLES20.glDisableVertexAttribArray(posCoordHandle);

        GLES20.glDisable(GLES20.GL_BLEND);

        GLES20.glUseProgram(0);
    }

    @Override
    public void setProjectionMatrix(float[] projectionMatrix) {
    }

    public void setWatermarkTexture(Bitmap bitmap) {
        watermark = bitmap;
    }
}