OpenGL
塞尔维亚大叔
毕业于上海复旦大学,专注技术多年,产品控、代码控,拥有丰富的项目经验,参与主持研发了多个成功上线的大型互联网项目。
展开
-
音视频篇 - OpenGL ES 2.0的简介
今天开始正式的 Android 音视频技术的学习,根据前面的分析,先来学习图片相关的处理 - OpenGL ES 2.0。OpenGL ES 简介OpenGL (全写 Open Graphics Library) 是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像 (二维的亦可),是一个功能强大,调用方便的底层图形库。OpenGL 在不同的平台上有不同的实现,但是它定义好了专业的程序接口,不同的平台都是遵照该接口来进行实现的,思想完全相同,方法名也是一致的,所原创 2020-06-01 19:55:34 · 583 阅读 · 0 评论 -
音视频篇 - Android 图像处理技术简介
关于 Android 的音视频,也可以叫做多媒体,分成图像、声音和视频。我们先从最基本的图像入手,图像分成 2D 和 3D,Android 自身也提供了很多 API 来实现图像的功能。对于 Android 的图像内存优化,可以看我之前的这篇文章:Android应用篇 - 最全图片相关的优化。YUV 简介1. YUV 简介YUV 是一种颜色编码方法,常使用在各个视频处理组件中。 YUV 在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。YUV 是编译 true-color 颜色空原创 2020-06-01 18:03:29 · 545 阅读 · 0 评论 -
OpenGL ES for Android (立方体贴图)
简介我们前面学过纹理贴图,我们可以用6个2D纹理的纹理构建成立方体,而立方体贴图本身就是包含6个2D纹理的纹理,它优势在于可以通过一个方向向量来进行索引/采样。只要在立方体贴图的中心点,就能使用立方体的实际位置向量来对立方体贴图进行采样。创建立方体贴图与2D纹理区别不大,创建立方体贴图同样是创建纹理,只是我们的glBindTexture的方法的参数要变为GLES20.GL_TEXTURE_CUBE_MAP,然后同样要处理环绕和过滤方式。与2D纹理不同的是,它需要用6张图片来分别设置立方体的六个面原创 2020-05-27 17:16:25 · 392 阅读 · 0 评论 -
OpenGL ES for Android(几何着色器)
简介几何着色器(Geometry Shader)是一个可选功能,他介于在顶点和片段着色器之间,接收一组顶点数据,可以对数据进行处理,而且可以根据数据生成不止一个图形,假如你想绘制四个顶点,按照以前的方式,需要for循环四次,每次都顶点数据进行处理,最后传入顶点着色器中。而集合着色器就做了这样一件事。在移动平台上,几何着色器需要OpenGL ES 3.2版本(android 7之上),同样的我们可以先参考文档或其他相关资料学习3.0新特性。3.0变化这里简单学习一下3.0和2.0比较重要的变化原创 2020-05-27 17:13:32 · 551 阅读 · 0 评论 -
OpenGL ES for Android(混合)
简介在之前使用物体时没考虑过透明的情况,而混合就是除了物体透明度的一种方式。在处理物体透明时一般有两种方式,一种是直接丢弃掉透明度达到一定程度的部分;另外一种就是混合。例如一扇窗户如果是全透明的我们看到的物体就是窗口后的物体;如果它是半透明的有色玻璃时,看到的就是玻璃和窗口后物体的叠加。之前我们使用纹理的颜色都是纹理的rgb颜色,没有用到最后一个alpha(也就是透明度),alpha的范围是0到1,1表示不透明,0表示全透明。丢弃片段有些物体的部分,要么是全透明,要么是不透明,不存在其他的情况下原创 2020-05-26 17:56:03 · 289 阅读 · 0 评论 -
OpenGL ES for Android(面剔除)
简介首先我们绘制一个立方体,想象一下能看到几个面。一般情况下我们最多能看到三个面,极端的情况我们甚至只能看到一个面,这时候如果不绘制看不到的面,是不是非常节省资源,忽略掉看不到的面就叫面剔除。那么怎么判断一个面是否面向观察点呢,在OpenGL中用了这样一个技巧:分析顶点数据的环绕顺序(Winding Order)。环绕顺序绘制三角形时用到了三个顶点,这三个顶点的顺序就是我们提到的环绕顺序。三个点的顺序要么是顺时针,要么是逆时针的,而且当一个面在面向观察点时是顺时针时,那么它在背向观察点时肯定是逆原创 2020-05-26 17:45:25 · 193 阅读 · 0 评论 -
OpenGL ES for Android(帧缓冲)
简介我们学过的颜色缓冲,深度缓冲已经模板缓冲结合起来就叫帧缓冲。默认系统会定义一个帧缓冲(在移动端就是EGL创建的),而且我们还可以创建自定义的帧缓冲来替代系统创建的。大概的步骤如下:创建一个帧缓冲并绑定; 正常绘制我们的图像(此时绘制的图像会绘制到自定义的帧缓 冲 上); 重新绑定到系统帧缓冲上; 绘制我们自定义帧缓冲的内容(此时我们可以对帧缓冲的内容进行各种处理以此实现各种效果)。创建帧缓冲非常简单,使用以下方法:glGenFramebuffers( int n, int[] f原创 2020-05-26 17:41:05 · 340 阅读 · 0 评论 -
OpenGL ES for Android(深度测试)
简介从这章开始学习高级OpenGL的内容。关于深度测试的理论知识,请参考https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/01%20Depth%20testing/文档详细阅读,感觉文档讲得已经非常清楚了,这里就不再复制一遍了。启用深度测试 GLES20.glEnable(GLES20.GL_DEPTH_TEST);每次渲染时还需要清除上一次渲染的深度值 GLES20.glClear(GLES20.GL_COLOR_原创 2020-05-26 17:33:46 · 357 阅读 · 0 评论 -
OpenGL ES for Android(投光物)
简介在之前的章节学习的光源都是一个点,虽然效果不错,和现实世界的光源还有一定的差距。将光投射(Cast)到物体的光源叫做投光物(Light Caster),这里我们学习几种比较常见的光源:定向光(Directional Light),点光源(Point Light)还有聚光(Spotlight)。定向光当光源非常远时,来自光源的每条光线就会近似于互相平行,而且光源强度相同。当我们使用一个假设光源处于无限远处的模型时,它就被称为定向光。定向光非常好的一个例子就是太阳。太阳距离我们并不是无限远,但它原创 2020-05-25 17:38:15 · 179 阅读 · 0 评论 -
OpenGL ES for Android多光源
在学习过光照,材质,投光物之后,现在我们把这些效果结合起来。我们显示这样的效果:在阳光照射下,有几个点光源,同时有一个聚光灯,此时在不同位置的物体被光照的效果。要定义多个光源,那么就需要定义不同的结构体,同时我们分开来不同的光照计算,使代码更清晰,GLSL定义方法和C相似,不过需要先声明,然后再定义,如下: void calc(); //声明一个函数 void calc() //定义一个函数 { //函数代码 }我们先定义定向光,结构体定义为:原创 2020-05-25 17:08:43 · 201 阅读 · 0 评论 -
OpenGL ES for Android(模型结构)
简介在之前的文章中都是我们使用代码绘制的图形图像,而如果我们想要使用别人设计的模型时就需要使用到模型加载。和桌面不同的是,Android上的模型加载库推荐使用jPCT-AE,官网http://www.jpct.net/jpct-ae/,可以直接下载并参考文档学习使用。当3D大师们使用Blender、3DS Max或者Maya等软件制作模型后,可以导出例如.blend,.x3d,.obj等等各种类型的文件,我们要使用.obj类型的文件来读取模型的信息。jPCT-AE软件已经封装好读取的方法,虽然jPCT-原创 2020-05-25 17:02:53 · 329 阅读 · 0 评论 -
OpenGL ES for Android(模型材料)
简介上一章我们简单学习了.obj模型文件的读取和使用,这章我们学习材料文件(.mtl)的读取和使用,.mtl文件是和.obj文件息息相关的。材料文件可能定义一种或多种材料,我们找一个简单带材料的模型:https://free3d.com/3d-model/-x96-slider-doorblack-v1--87538.html,打开其中的mtl看下文件格式,同样我们参考https://en.m.wikipedia.org/wiki/Wavefront_.obj_file来分析文件内容: 与obj原创 2020-05-25 17:00:12 · 218 阅读 · 0 评论 -
OpenGL ES for Android (模型纹理)
模型纹理模型加载最后的一课,就是使用贴图,不再使用纯色显示物体。纹理的信息也是和材料一样存放在mtl文件中,格式也是类似的,只是一些信息以map开头的,我们先下载https://free3d.com/3d-model/crocus-flower-v1--75899.html这个模型的文件,找到mtl文件,同样根据https://en.m.wikipedia.org/wiki/Wavefront_.obj_file文档来分析文件内容: # 与obj文件同理,#开头是注释可以忽略 newm.原创 2020-05-25 16:58:24 · 192 阅读 · 0 评论 -
OpenGL ES for Android多光源
简介在学习过光照,材质,投光物之后,现在我们把这些效果结合起来。我们显示这样的效果:在阳光照射下,有几个点光源,同时有一个聚光灯,此时在不同位置的物体被光照的效果。要定义多个光源,那么就需要定义不同的结构体,同时我们分开来不同的光照计算,使代码更清晰,GLSL定义方法和C相似,不过需要先声明,然后再定义,如下: void calc(); //声明一个函数 void calc() //定义一个函数 { //函数代码 }我们先定义定向光,结构体定义为:原创 2020-05-25 16:04:34 · 201 阅读 · 0 评论 -
OpenGL ES for Android(光照贴图)
简介在之前文章中,我们模拟了物体的独特的光照特效,但是在一个面上所有点的效果都是一样的,显然和现实情况还有差距。在现实世界中,大部分物体的表面都是有不同材质的,对光的反应也不相同。在光照场景中,通常有漫反射和镜面光贴图(Map)两种方式,来精确控制物体的漫反射分量和镜面光分量以模拟现实世界的物体。漫反射贴图现在我们使用纹理来代替前面的纯色实现立方体的面,然后显示光照的效果。我们使用下面这样一幅图片来作为立方体的面: struct Material { sampler2D原创 2020-05-22 20:08:52 · 277 阅读 · 0 评论 -
OpenGL ES for Android(冯氏光照)
冯氏光照模型想要模拟真实世界的光照效果是比较困难的,我们使用一种叫做冯氏光照模型(Phong Lighting Model)的模型来实现近似的效果。冯氏光照模型的主要结构由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的:环境光照(Ambient Lighting):即使在黑暗的情况下,世界上通常也仍然有一些光亮(月亮、远处的光),所以物体几乎永远不会是完全黑暗的。为了模拟这个,我们会使用一个环境光照常量,它永远会原创 2020-05-22 17:29:08 · 216 阅读 · 0 评论 -
OpenGL ES for Android(简单光照)
简介从这篇开始学习光照相关的知识,可以先阅读文档https://learnopengl-cn.github.io/02%20Lighting/01%20Colors/,了解光照的相关概念。案例分析光照至少需要一个光源和一个物体才能显示出的效果,那么我们就需要定义光源和物体的顶点位置和颜色,参考我们实现立方体的文章添加立方体并设置颜色,设置光源的颜色是白色,设置物体本来的颜色是橘色,那么光源照射之后的颜色就是两种颜色的叠加,我们直接设置颜色,物体着色器的代码如下: vertexShaderC原创 2020-05-22 16:53:46 · 199 阅读 · 0 评论