音视频之opengl绘制三角形

音视频之opengl渲染图片

音视频之渲染yuv图片

首先来看看渲染效果

我们先来看看关于纹理的坐标:
他是如下图:

顶点着色器代码:texture_vertext_shader_java_1.glsl

attribute vec4 a_Position;
attribute vec2 a_TextureCoordinates;
varying vec2 v_TextureCoordinates;void main() {v_TextureCoordinates = a_TextureCoordinates;gl_Position = a_Position;
}

a_Position:是顶点的坐标
a_TextureCoordinates:是用来接收的纹理坐标的属性。
v_TextureCoordinates:这个是用来将坐标传递给片段着色器。

片段着色器代码: texture_frament_shader_java_1.glsl

precision mediump float ;
uniform sampler2D u_TextureUnit;
varying vec2 v_TextureCoordinates;void main() {gl_FragColor = texture2D(u_TextureUnit , v_TextureCoordinates);
}

u_TextureUnit:这是用来接收纹理数据的数组。
v_TextureCoordinates:是从顶点着色器传递过来的纹理坐标
texture2D方法:他会读入特定坐标的颜色值,然后传递给gl_FragColor

现在来看看java上的代码:
这些都是加载代码,然后编译,连接,然后使用,和上篇渲染三角形是一样的。

String vertexShaderSource = TextResourceReader.readTextFileFromResource(context, R.raw.texture_vertext_shader_java_1);
String frgShaderSource = TextResourceReader.readTextFileFromResource(context, R.raw.texture_frament_shader_java_1);
int vertextShader = ShaderHelper.compileVertextShader(vertexShaderSource);
int fragmentShader = ShaderHelper.compileFragmentShader(frgShaderSource);
program = ShaderHelper.linkProgram(vertextShader, fragmentShader);
ShaderHelper.validatePrograme(program);
glUseProgram(program);

下面是获取三个变量的地址:

uTextureUnitL = glGetUniformLocation(program, "u_TextureUnit");
aPositionL = glGetAttribLocation(program, "a_Position");
aTextureCoordinatesL = glGetAttribLocation(program, "a_TextureCoordinates");

接下来我们着重看下加载纹理的地方:loadTexture

先创建一个纹理对象:

final int[] textureObjectIds = new int[1];
glGenTextures(1,textureObjectIds , 0);
if(textureObjectIds[0] == 0){Log.e("xhc" , "cant open opengl texture object !");return 0;
}
//然后将图片加载成一个bitmap
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources() , resourceId , options);
if(bitmap == null){Log.e("xhc" , "bitmap create faild ");glDeleteTextures(1, textureObjectIds , 0);return 0;
}
//在使用这个新生成的纹理之前,我们需要告诉opengl纹理调用应该应用于这个纹理对象
//第一个参数GL_TEXTURE_2D 告诉这个纹理是个二维的纹理,对应的id是 textureObjectIds[0]
glBindTexture(GL_TEXTURE_2D , textureObjectIds[0]);
/*** 设置过滤器GL_TEXTURE_MIN_FILTER指缩小的情况选择GL_LINEAR_MIPMAP_LINEAR说明缩小使用三线性过滤* GL_TEXTURE_MAG_FILTER 指放大的情况GL_LINEAR使用双线性过滤*/
glTexParameteri(GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR);

我们简单来看看过滤方式:

//加载位图数据到opengl中
texImage2D(GL_TEXTURE_2D , 0 , bitmap,0);
//释放位图,节约内存
bitmap.recycle();
//生成mip贴图
glGenerateMipmap(GL_TEXTURE_2D);
//解除纹理绑定,这里不是把纹理数据和纹理id解除绑定,只是为了让后面的操作不要操作到此纹理,如果就是想操作,再从新绑定即可
glBindTexture(GL_TEXTURE_2D , 0);
//我们再来看看坐标,顶点坐标和纹理坐标都放在一起
//注意顶点和纹理的坐标做好对应
float[] tableVerticesTexture = {//x, y , s , t0f, 0f, 0.5f, 0.5f,-1f, -1f, 0f, 1f,1f, -1f, 1f, 1f,1f, 1f, 1f, 0f,-1f, 1f, 0f, 0f,-1f, -1f, 0f, 1f,
};

将坐标数据传入对应的opengl中,并使能。

    private void setVertexAttribPointer(int dataOffset, int attributeLocation, int componetCount, int stride) {vertexData.position(dataOffset);glVertexAttribPointer(attributeLocation, componetCount, GL_FLOAT, false, stride, vertexData);glEnableVertexAttribArray(attributeLocation);vertexData.position(0);}

最后绘制:

//通过  glActiveTexture(GL_TEXTURE0);把活动的纹理单元设置成纹理单元0,
//然后通过glBindTextture()把纹理绑定到这个单元。通过调用
//glUniformli(uTextureUnitLocation ,0)把被选定的纹理单元传递给片段着色器中。@Overridepublic void onDrawFrame(GL10 gl10) {glClear(GL_COLOR_BUFFER_BIT);glUseProgram(program);//drawtextureglActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, texttureId);glUniform1i(uTextureUnitL, 0);glDrawArrays(GL_TRIANGLE_FAN, 0, 6);}

github项目链接

音视频之opengl渲染图片相关推荐

  1. 音视频之opengl绘制三角形

    音视频之opengl绘制三角形 音视频之opengl渲染图片 音视频之渲染yuv图片 2018年用了一年业余时间学习了音视频,直播,解码,编码,倍速,跳转,滤镜,倒放等.,慢慢把这部分内容写到博客上, ...

  2. iOS音视频:OpenGL常用术语介绍

    1.OpenGL简介 1.1 OpenGL是什么 OpenGL(Open Graphics Library,译为 开放图形库 或 开放式图形库):是用于 渲染 2D.3D矢量图形的跨语言.跨平台的应用 ...

  3. 视频实时OpenGL渲染并保存渲染结果合成MP4

    这是一个能实时播放多个视频.图片在一个GL容器里的控件,通过这个控件,可以在一个view中绘制固定坐标.自由随机滚动的视频和图片,然后从该view中截取数据帧,实时保存成YUV格式的文件,最后合成MP ...

  4. 使用Matlab将抖音视频转换成gif图片

    文章目录 1. 原由 2. 方法 3. 演示 3.1 将视频完整转换为gif图片 3.2 将指定时间的视频片段转换为gif图片 3.3 改变gif图片的播放速度 4. 联系作者 1. 原由 昨天的博文 ...

  5. Qt音视频开发31-Onvif抓拍图片

    一.前言 抓拍是个很重要的功能,比如在报警视频联动中需要一张实时的图片,很多SDK不提供抓拍功能,而通过预览抓图,得到的图片已不具有实时性,那如何得到实时的图片呢?现在的IPC基本上都支持ONVIF协 ...

  6. 音视频之渲染yuv图片

    音视频之opengl绘制三角形 音视频之opengl渲染图片 音视频之渲染yuv图片 前一篇我们讨论了如何渲染一个普通图片(rgb) 现在我们来讨论如何渲染一个yuv图片. 什么是yuv我们这里有一个 ...

  7. 音视频开发总结之一理论基础

    一. 音频技术基础概念 1. 声音的物理性质 众所周知,声音是由物体振动而产生的.声音是一种压力波,当演奏乐器或者说话时,它们的振动都会引起空气有节奏的振动, 使周围的空气产生疏密变化,由此就产生了声 ...

  8. 【原理+实战+视频+源码】抖音,快手大热背后——Android 贴心的音视频学习指南来咯!

    导语 Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 音视频的开发,往往是比较难的,而这个比较难 ...

  9. 23最新《Android音视频开发进阶指南》,音视频开发者速领

    作为Android开发程序员,我们时刻站在互联网的前端,而音视频作为现在乃至未来几年一个强劲的风口,吸引了许多程序员的关注. 那么音视频开发的行业现状究竟如何呢?我们又该怎样入门呢?请看下文: 音视频 ...

最新文章

  1. typedef 函数指针
  2. DBA表现最好的7个习惯
  3. 清华大学计算机组成原理视频百度云,计算机组成原理第48讲:
  4. 自己在windows下第一次安装pygame成功的经历
  5. 【Python学习】 - - 链表推导式[ 2*x for x in X ]、匿名函数、并行迭代
  6. matlab cell计算,MATLAB Cell数组 | 学步园
  7. linux清缓存命令多节点,Liunx手动释放buffers/cache内存_linux,缓存,
  8. AndroidStudio_Android Studio项目中报Call requires API level 18 (current min is 16)---Android原生开发工作笔记232
  9. python: os.walk() 相关操作
  10. 酒精传感器实验-传感器原理及应用实验
  11. Link16通信战术数据链分析与MATLAB仿真程序
  12. hibernate操作步骤(代码部分)
  13. lt;一 SAP ABAP 将数字转换成本地语言(中文、英文)大写
  14. openssh8.3p1 RPM 升级
  15. gpg invalid解决方法
  16. ecb里使用自定义快捷键切换窗口
  17. Windows 10强制升级惹众怒:纽约总检察长正在积极推动诉讼
  18. 急诊与灾难医学-重点以及习题
  19. SLAM算法资料收集
  20. gitlab 分支保护

热门文章

  1. EasyMesh最简单的入门级介绍
  2. Swing关于JButton去除点击后的内边框的问题纪要!
  3. Systemverilog中的logic和bit
  4. Simulink学习之Combinatorial Logic模块
  5. 大陆汽车:汽车电子电器架构的发展及其对车载以太网的影响
  6. mysql备份用户权限【转】
  7. 11台计算机的英语,计算机常见英语词汇
  8. 白苹果了怎么办_建行储蓄卡云闪付bug还款玩法(苹果和安卓机攻略)
  9. bugku---game1
  10. Android2.3.4陀螺仪移植