版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外研八下英语Unit 2 Developing ideas《合作探究二》课件
- 人教 八年级 语文 下册 第2单元《8.时间的脚印 第1课时》课件
- 2025 高中信息技术数据结构在电商用户评价信息挖掘课件
- 海洋渔业资源增殖项目可行性研究报告
- 小学综合课程和综合实践活动
- 2025 高中信息技术数据与计算之算法的最小生成树算法课件
- 春季大风天气消防安全指南与防范措施
- 2025 高中信息技术数据与计算之数据与计算提升在线教育资源共享课件
- 2026年干法电极设备国产化与智能制造升级实践
- 2026年零点定位系统在五轴加工快速换产应用
- 矿业项目进退场交接措施
- 项目施工奖惩管理办法
- 【城市轨道交通客运组织优化研究-以天津地铁为例11000字(论文)】
- 隧道爆破安全培训课件
- 喝酒划拳活动方案
- T/CHES 59-2021组合式金属防洪挡板安装、验收及维护规范
- 建筑行业安全生产部岗位职责
- 宁夏砖瓦用粘土矿产地质勘查技术规程 DB64-T 1754-2020
- 校长在人工智能教师培训专题研讨会上讲话:主动拥抱人工智能才能为学生开辟更广阔的成长空间
- 电工实训项目二常用电工工具、仪表使用模块二 认识和使用常用电工仪表
- 《经络与腧穴》课件-腧穴
评论
0/150
提交评论