音视频之opengl渲染图片
音视频之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渲染图片相关推荐
- 音视频之opengl绘制三角形
音视频之opengl绘制三角形 音视频之opengl渲染图片 音视频之渲染yuv图片 2018年用了一年业余时间学习了音视频,直播,解码,编码,倍速,跳转,滤镜,倒放等.,慢慢把这部分内容写到博客上, ...
- iOS音视频:OpenGL常用术语介绍
1.OpenGL简介 1.1 OpenGL是什么 OpenGL(Open Graphics Library,译为 开放图形库 或 开放式图形库):是用于 渲染 2D.3D矢量图形的跨语言.跨平台的应用 ...
- 视频实时OpenGL渲染并保存渲染结果合成MP4
这是一个能实时播放多个视频.图片在一个GL容器里的控件,通过这个控件,可以在一个view中绘制固定坐标.自由随机滚动的视频和图片,然后从该view中截取数据帧,实时保存成YUV格式的文件,最后合成MP ...
- 使用Matlab将抖音视频转换成gif图片
文章目录 1. 原由 2. 方法 3. 演示 3.1 将视频完整转换为gif图片 3.2 将指定时间的视频片段转换为gif图片 3.3 改变gif图片的播放速度 4. 联系作者 1. 原由 昨天的博文 ...
- Qt音视频开发31-Onvif抓拍图片
一.前言 抓拍是个很重要的功能,比如在报警视频联动中需要一张实时的图片,很多SDK不提供抓拍功能,而通过预览抓图,得到的图片已不具有实时性,那如何得到实时的图片呢?现在的IPC基本上都支持ONVIF协 ...
- 音视频之渲染yuv图片
音视频之opengl绘制三角形 音视频之opengl渲染图片 音视频之渲染yuv图片 前一篇我们讨论了如何渲染一个普通图片(rgb) 现在我们来讨论如何渲染一个yuv图片. 什么是yuv我们这里有一个 ...
- 音视频开发总结之一理论基础
一. 音频技术基础概念 1. 声音的物理性质 众所周知,声音是由物体振动而产生的.声音是一种压力波,当演奏乐器或者说话时,它们的振动都会引起空气有节奏的振动, 使周围的空气产生疏密变化,由此就产生了声 ...
- 【原理+实战+视频+源码】抖音,快手大热背后——Android 贴心的音视频学习指南来咯!
导语 Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 音视频的开发,往往是比较难的,而这个比较难 ...
- 23最新《Android音视频开发进阶指南》,音视频开发者速领
作为Android开发程序员,我们时刻站在互联网的前端,而音视频作为现在乃至未来几年一个强劲的风口,吸引了许多程序员的关注. 那么音视频开发的行业现状究竟如何呢?我们又该怎样入门呢?请看下文: 音视频 ...
最新文章
- typedef 函数指针
- DBA表现最好的7个习惯
- 清华大学计算机组成原理视频百度云,计算机组成原理第48讲:
- 自己在windows下第一次安装pygame成功的经历
- 【Python学习】 - - 链表推导式[ 2*x for x in X ]、匿名函数、并行迭代
- matlab cell计算,MATLAB Cell数组 | 学步园
- linux清缓存命令多节点,Liunx手动释放buffers/cache内存_linux,缓存,
- AndroidStudio_Android Studio项目中报Call requires API level 18 (current min is 16)---Android原生开发工作笔记232
- python: os.walk() 相关操作
- 酒精传感器实验-传感器原理及应用实验
- Link16通信战术数据链分析与MATLAB仿真程序
- hibernate操作步骤(代码部分)
- lt;一 SAP ABAP 将数字转换成本地语言(中文、英文)大写
- openssh8.3p1 RPM 升级
- gpg invalid解决方法
- ecb里使用自定义快捷键切换窗口
- Windows 10强制升级惹众怒:纽约总检察长正在积极推动诉讼
- 急诊与灾难医学-重点以及习题
- SLAM算法资料收集
- gitlab 分支保护