纹理渲染器
渲染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,
};-
创建
RendererIRenderer renderer = new OESRenderer();
-
关联显示的
Surfacerenderer.attach(surface);
-
判断是否关联
Surfacerenderer.isAttach();
-
设置外部纹理
renderer.setTexture(genTexture[0]);
-
渲染一帧
renderer.renderFrame();
渲染方法应当在
onFrameAvailable回调中,并且渲染前应当调用一次glSurfaceTexture.updateTexImage(); -
清屏
renderer.clearFrame();
-
显示区域大小变化
renderer.updateViewPort(width, height);
当显示区域(如:
SurfaceView、TextureView)大小变化时,调用次方法进行更新 -
上屏
renderer.swapBuffers();
渲染后调用
-
销毁
renderer.destroy();
-
创建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); }
-
添加回调
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) {} });
-
设置循环播放
decoder.setLoop(isLoop);
-
是否循环播放
decoder.isLoop();
-
开始
decoder.start();
-
更新Viewport
decoder.updateViewPort(width, height);
当Surface大小发生改变时(如:
onSurfaceTextureSizeChanged、surfaceChanged),应当调用此方法 -
停止
decoder.stop();