OpenGL播放yuv数据流(着色器SHADER)_第1页
OpenGL播放yuv数据流(着色器SHADER)_第2页
OpenGL播放yuv数据流(着色器SHADER)_第3页
OpenGL播放yuv数据流(着色器SHADER)_第4页
OpenGL播放yuv数据流(着色器SHADER)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——OpenGL播放yuv数据流(着色器SHADER)OpenGL播放yuv数据流(着色器

SHADER)-android(一)

这个和windows还有iOS略有不同,下面将步骤整理一下以做记录:1:在avtivity_main.xml中添加用于显示的GLsurfaceView[html]viewplaincopy

android:id=\android:layout_width=\android:layout_height=\

2:将GLsurfaceView传到里面[cpp]viewplaincopy

//得到opengal渲染用的surfaceView

openglsurfaceView=(GLSurfaceView)findViewById(R.id.lvsPlaySurfaceView);

3:需要添加权限在AndroidMainfest.xml中:[html]viewplaincopy

0){//刷新让他能显示在onDrawFrame中处理mTargetSurface.requestRender();try{Thread.sleep(m_millis_realtime[0]);}catch(InterruptedExceptione){

e.printStackTrace();}}else{try{Thread.sleep(1);}catch(InterruptedExceptione){e.printStackTrace();}}

//递归调用自身,java用递归调用本身有问题了,外面for循环调用处理//TimerFunc1(opengl_interface);}}

//初始化intinitopengl(intyuvdata_width,intyuvdata_height,Lvs_Play_Interface_Sdk_Android.OpenGl_DisplayCallBackInterfacedisplaydatack){

intret=0;

m_yuvdata_width=yuvdata_width;m_yuvdata_height=yuvdata_height;m_displaydatack=displaydatack;

//分派内存

if(yuvplaner_y==null){

yuvplaner_y=ByteBuffer.allocate(m_yuvdata_width*m_yuvdata_height+100);}

if(yuvplaner_u==null){

yuvplaner_u=ByteBuffer.allocate(m_yuvdata_width*m_yuvdata_height+100);}

if(yuvplaner_v==null){

yuvplaner_v=ByteBuffer.allocate(m_yuvdata_width*m_yuvdata_height+100);}

ret=1;returnret;}

//初始化着色器,类似于告GPU当传进去数据的时候采用什么样的规则。

voidInitShaders(){

interror=0;

createBuffers(vertexVertices,textureVertices);

p=createProgram(vertexShaderString,yuvFragmentShaderString);ATTRIB_VERTEX=GLES20.glGetAttribLocation(p,\if(ATTRIB_VERTEX==-1){

Log.i(TAG,\}

ATTRIB_TEXTURE=GLES20.glGetAttribLocation(p,\if(ATTRIB_TEXTURE==-1){

Log.i(TAG,\}

//Program:在链接了程序以后,我们可以使用glUseProgram()函数来加载并使用链接好的程序

GLES20.glUseProgram(p);

//获取片源着色器源码中的变量,用于纹理渲染

m_textureUniformY=GLES20.glGetUniformLocation(p,\m_textureUniformU=GLES20.glGetUniformLocation(p,\m_textureUniformV=GLES20.glGetUniformLocation(p,\

//初始化纹理

int[]textures_y=newint[1];

GLES20.glGenTextures(1,textures_y,0);m_textureid_y=textures_y[0];textures_y=null;//绑定纹理

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,m_textureid_y);//设置该纹理的一些属性

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);

int[]textures_u=newint[1];

GLES20.glGenTextures(1,textures_u,0);m_textureid_u=textures_u[0];textures_u=null;

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,m_textureid_u);

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);

int[]textures_v=newint[1];

GLES20.glGenTextures(1,textures_v,0);m_textureid_v=textures_v[0];textures_v=null;

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,m_textureid_v);

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);return;}

//具体显示图像的函数(参数是指针)intDisplayImage(longparm){

intret=0;

//关联到yuv数据的分量数组if(yuvplaner_y!=null){

yuvplaner_y.clear();

yuvplaner_y.put(m_yuvbuf,0,m_yuvdata_width*m_yuvdata_height);yuvplaner_y.position(0);}

if(yuvplaner_u!=null){

yuvplaner_u.clear();

yuvplaner_u.put(m_yuvbuf,m_yuvdata_width*m_yuvdata_height,m_yuvdata_width*m_yuvdata_height/4);

yuvplaner_u.position(0);}

if(yuvplaner_v!=null){

yuvplaner_v.clear();

yuvplaner_v.put(m_yuvbuf,m_yuvdata_width*m_yuvdata_height+m_yuvdata_width*m_yuvdata_height/4,m_yuvdata_width*m_yuvdata_height/4);yuvplaner_v.position(0);}

//Clear

//清除颜色设为黑色,把整个窗口清除为当前的清除颜色,glClear()的唯一参数表示需要被清除的缓冲区。

GLES20.glClearColor(0.0f,0.0f,0.0f,1.0f);

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

//定义顶点数组,android平台要在这里做其他平台在initshader中,否则显示不出来图像

GLES20.glVertexAttribPointer(ATTRIB_VERTEX,2,GLES20.GL_FLOAT,false,0,vertexVertices_buffer);

//启用属性数组,android平台要在这里做其他平台在initshader中,否则显示不出来图像

GLES20.glEnableVertexAttribArray(ATTRIB_VERTEX);

//定义像素纹理数组,android平台要在这里做其他平台在initshader中,否则显示不出来图像

GLES20.glVertexAttribPointer(ATTRIB_TEXTURE,2,GLES20.GL_FLOAT,false,0,textureVertices_buffer);

//启用属性数组,android平台要在这里做其他平台在initshader中,否则显示不出来图像

GLES20.glEnableVertexAttribArray(ATTRIB_TEXTURE);

//显卡中有N个纹理单元(具体数目依靠你的显卡能力),每个纹理单元(GL_TEXTURE0、GL_TEXTURE1等)都有GL_TEXTURE_1D、GL_TEXTURE_2D等//Y

//选择当前活跃的纹理单元

GLES20.glActiveTexture(GLES20.GL_TEXTURE0);//允许建立一个绑定到目标纹理的有名称的纹理

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,m_textureid_y);//根据指定的参数,生成一个2D纹理(Texture)。相像的函数还有glTexImage1D、glTexImage3D。

GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D,0,GLES20.GL_LUMINANCE,m_yuvdata_width,m_yuvdata_height,0,GLES20.GL_LUMINANCE,GLES20.GL_UNSIGNED_BYTE,yuvplaner_y);

GLES20.glUniform1i(m_textureUniformY,0);//设置纹理,依照前面设置的规则怎样将图像或纹理贴上(参数和选择的活跃纹理单元对应,GL_TEXTURE0)

//U

GLES20.glActiveTexture(GLES20.GL_TEXTURE1);

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,m_textureid_u);

GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D,0,GLES20.GL_LUMINANCE,m_yuvdata_width/2,m_yuvdata_height/2,0,GLES20.GL_LUMINANCE,GLES20.GL_UNSIGNED_BYTE,yuvplaner_u);

GLES20.glUniform1i(m_textureUniformU,1);//V

GLES20.glActiveTexture(GLES20.GL_TEXTURE2);

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,m_textureid_v);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论