Skip to content

chentong-net/texture-renderer

Repository files navigation

texture-renderer

纹理渲染器

说明

渲染OES纹理到指定Surface

Vertex Shder

attribute vec4 vPosition;
attribute vec4 vTexCoordinateRgb;
varying vec2 v_TexCoordinateRgb;
void main() {
    v_TexCoordinateRgb = vec2(vTexCoordinateRgb.x, vTexCoordinateRgb.y);
    gl_Position = vPosition;
}

Fragment Shader

#extension GL_OES_EGL_image_external : require
precision mediump float;
uniform samplerExternalOES texture;
varying vec2 v_TexCoordinateRgb;
void main () {
    vec4 rgbColor = texture2D(texture, v_TexCoordinateRgb);
    gl_FragColor = vec4(rgbColor.r, rgbColor.g, rgbColor.b, rgbColor.r);
}

顶点坐标

public static final float[] VERTEX_COORDINATE = new float[]{
        -1f, 1f,
        -1f, -1f,
        1f, 1f,
        1f, -1f,
};

纹理坐标

/**
 * 纹理坐标
 */
public static final float[] TEXTURE_COORDINATE = new float[]{
                0f, 0f,
                0f, 1f,
                1f, 0f,
                1f, 1f,
};

使用方法

Renderer

  1. 创建Renderer

    IRenderer renderer = new OESRenderer();
  2. 关联显示的Surface

    renderer.attach(surface);
  3. 判断是否关联Surface

    renderer.isAttach();
  4. 设置外部纹理

    renderer.setTexture(genTexture[0]);
  5. 渲染一帧

    renderer.renderFrame();

    渲染方法应当在onFrameAvailable回调中,并且渲染前应当调用一次 glSurfaceTexture.updateTexImage();

  6. 清屏

    renderer.clearFrame();
  7. 显示区域大小变化

    renderer.updateViewPort(width, height);

    当显示区域(如:SurfaceViewTextureView)大小变化时,调用次方法进行更新

  8. 上屏

    renderer.swapBuffers();

    渲染后调用

  9. 销毁

    renderer.destroy();

Decoder

  1. 创建Decoder

    TextureView

    // 保证SurfaceTexture成功创建
    @Override
    public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surfaceTexture, int width, int height) {
        Decoder decoder = new HwDecoder(new Surface(surfaceTexture), renderer);
    }

    SurfaceView

    // 保证Surface成功创建
    @Override
    public void surfaceCreated(@NonNull SurfaceHolder holder) {
        Decoder decoder = new HwDecoder(holder.getSurface(), renderer);
    }
  2. 添加回调

    decoder.setDecoderListener(new IDecoderListener() {
    
        // 开始解码
        @Override
        public void onStart(int width, int height) {}
    
        // 解码
        @Override
        public void onDecode(long frameIndex) {}
    
        // 渲染
        @Override
        public void onRender() {}
    
        // 解码完成
        @Override
        public void onComplete() {}
    
        // 销毁
        @Override
        public void onDestroy() {}
    
        // 异常回调
        @Override
        public void onFailed(int errCode, String errMsg) {}
    });
  3. 设置循环播放

    decoder.setLoop(isLoop);
  4. 是否循环播放

    decoder.isLoop();
  5. 开始

    decoder.start();
  6. 更新Viewport

    decoder.updateViewPort(width, height);

    当Surface大小发生改变时(如:onSurfaceTextureSizeChangedsurfaceChanged),应当调用此方法

  7. 停止

    decoder.stop();

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published