![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android OpenGL ES
jklwan
这个作者很懒,什么都没留下…
展开
-
学习OpenGL ES for Android(二十五)— 实例化
文章目录简介实例化使用实例化绘制矩形使用实例化数组小行星带简介本章对应文档如果我们想要绘制许多相同的物体,只是他们的位置或大小不同,按照之前学习的知识,正常的做法是构建一个变化矩阵数组,通过for循环进行循环绘制,当我们绘制的物体数量逐渐增加时会发现设备越来越卡。如果我们能够将数据一次性发送给GPU,然后使用一个绘制函数让OpenGL利用这些数据绘制多个物体,就会更方便了。这就是实例化(In...原创 2020-03-11 15:53:27 · 650 阅读 · 0 评论 -
学习OpenGL ES for Android(二十四)— 几何着色器
文章目录简介在本章之前还有两章:高级数据和高级GLSL,都是比较理论的知识,有兴趣的话可以自己学习。简介几何着色器(Geometry Shader)是一个可选功能,他介于在顶点和片段着色器之间,接收一组顶点数据,可以对数据进行处理,而且可以根据数据生成不止一个图形,假如你想绘制四个顶点,按照以前的方式,需要for循环四次,每次都顶点数据进行处理,最后传入顶点着色器中。而集合着色器就做了这样一...原创 2020-03-06 14:52:28 · 1243 阅读 · 0 评论 -
学习OpenGL ES for Android(二十三)— 立方体贴图
我们前面学过纹理贴图,我们可以用6个2D纹理的纹理构建成立方体,而立方体贴图本身就是包含6个2D纹理的纹理,它优势在于可以通过一个方向向量来进行索引/采样。只要在立方体贴图的中心点,就能使用立方体的实际位置向量来对立方体贴图进行采样。创建立方体贴图与2D纹理区别不大,创建立方体贴图同样是创建纹理,只是我们的glBindTexture的方法的参数要变为GLES20.GL_TEXTURE_CU...原创 2020-01-16 20:40:59 · 1524 阅读 · 0 评论 -
学习OpenGL ES for Android(二十二)— 帧缓冲
我们学过的颜色缓冲,深度缓冲已经模板缓冲结合起来就叫帧缓冲。默认系统会定义一个帧缓冲(在移动端就是EGL创建的),而且我们还可以创建自定义的帧缓冲来替代系统创建的。大概的步骤如下:创建一个帧缓冲并绑定; 正常绘制我们的图像(此时绘制的图像会绘制到自定义的帧缓冲上); 重新绑定到系统帧缓冲上; 绘制我们自定义帧缓冲的内容(此时我们可以对帧缓冲的内容进行各种处理以此实现各种效果)。创建帧缓...原创 2020-01-14 20:24:55 · 955 阅读 · 0 评论 -
学习OpenGL ES for Android(二十一)— 面剔除
首先我们绘制一个立方体,想象一下能看到几个面。一般情况下我们最多能看到三个面,极端的情况我们甚至只能看到一个面,这时候如果不绘制看不到的面,是不是非常节省资源,忽略掉看不到的面就叫面剔除。那么怎么判断一个面是否面向观察点呢,在OpenGL中用了这样一个技巧:分析顶点数据的环绕顺序(Winding Order)。环绕顺序绘制三角形时用到了三个顶点,这三个顶点的顺序就是我们提到的环绕顺序。三个...原创 2020-01-09 19:53:59 · 510 阅读 · 0 评论 -
学习OpenGL ES for Android(二十)— 混合
在之前使用物体时没考虑过透明的情况,而混合就是除了物体透明度的一种方式。在处理物体透明时一般有两种方式,一种是直接丢弃掉透明度达到一定程度的部分;另外一种就是混合。例如一扇窗户如果是全透明的我们看到的物体就是窗口后的物体;如果它是半透明的有色玻璃时,看到的就是玻璃和窗口后物体的叠加。之前我们使用纹理的颜色都是纹理的rgb颜色,没有用到最后一个alpha(也就是透明度),alpha的范围是0到1,1...原创 2020-01-08 16:46:08 · 729 阅读 · 0 评论 -
学习OpenGL ES for Android(十九)— 模板测试
模板测试的文档https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/02%20Stencil%20testing/,和深度测试类似,它也会丢弃片段。启用模板测试的代码GLES20.glEnable(GLES20.GL_STENCIL_TEST);注意:在Android中,只使用这句是无法启用模板测试的,还需要使用下面代码配置GLS...原创 2020-01-07 17:21:45 · 554 阅读 · 0 评论 -
学习OpenGL ES for Android(十八)— 深度测试
从这章开始学习高级OpenGL的内容。关于深度测试的理论知识,请参考https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/01%20Depth%20testing/文档详细阅读,感觉文档讲得已经非常清楚了,这里就不再复制一遍了。启用深度测试GLES20.glEnable(GLES20.GL_DEPTH_TEST);每次渲染时还...原创 2020-01-06 20:22:34 · 374 阅读 · 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_...原创 2020-01-05 22:08:19 · 408 阅读 · 0 评论 -
学习OpenGL ES for Android(十六)— 模型材料
上一章我们简单学习了.obj模型文件的读取和使用,这章我们学习材料文件(.mtl)的读取和使用,.mtl文件是和.obj文件息息相关的。材料文件可能定义一种或多种材料,我们找一个简单带材料的模型:https://free3d.com/3d-model/-x96-slider-doorblack-v1--87538.html,打开其中的mtl看下文件格式,同样我们参考https://en.m.wik...原创 2020-01-04 18:11:45 · 352 阅读 · 0 评论 -
学习OpenGL ES for Android(十五)— 模型结构
在之前的文章中都是我们使用代码绘制的图形图像,而如果我们想要使用别人设计的模型时就需要使用到模型加载。和桌面不同的是,Android上的模型加载库推荐使用jPCT-AE,官网http://www.jpct.net/jpct-ae/,可以直接下载并参考文档学习使用。当3D大师们使用Blender、3DS Max或者Maya等软件制作模型后,可以导出例如.blend,.x3d,.obj等等各种类型的文...原创 2020-01-03 18:02:41 · 495 阅读 · 0 评论 -
学习OpenGL ES for Android(十四)— 多光源
在学习过光照,材质,投光物之后,现在我们把这些效果结合起来。我们显示这样的效果:在阳光照射下,有几个点光源,同时有一个聚光灯,此时在不同位置的物体被光照的效果。要定义多个光源,那么就需要定义不同的结构体,同时我们分开来不同的光照计算,使代码更清晰,GLSL定义方法和C相似,不过需要先声明,然后再定义,如下void calc(); //声明一个函数void calc() //定...原创 2020-01-02 15:06:52 · 325 阅读 · 0 评论 -
学习OpenGL ES for Android(十三)— 投光物
在之前的章节学习的光源都是一个点,虽然效果不错,和现实世界的光源还有一定的差距。将光投射(Cast)到物体的光源叫做投光物(Light Caster),这里我们学习几种比较常见的光源:定向光(Directional Light),点光源(Point Light)还有聚光(Spotlight)。定向光当光源非常远时,来自光源的每条光线就会近似于互相平行,而且光源强度相同。当我们使用一个假设光...原创 2020-01-02 09:31:00 · 258 阅读 · 0 评论 -
学习OpenGL ES for Android(十二)— 光照贴图
在之前文章中,我们模拟了物体的独特的光照特效,但是在一个面上所有点的效果都是一样的,显然和现实情况还有差距。在现实世界中,大部分物体的表面都是有不同材质的,对光的反应也不相同。在光照场景中,通常有漫反射和镜面光贴图(Map)两种方式,来精确控制物体的漫反射分量和镜面光分量以模拟现实世界的物体。漫反射贴图现在我们使用纹理来代替前面的纯色实现立方体的面,然后显示光照的效果。我们使用下面这样一幅...原创 2019-12-28 17:31:45 · 291 阅读 · 0 评论 -
学习OpenGL ES for Android(十一)— 材质
现实世界的物体各种各样,不同物体会对光产生不同的反应。陶瓷,铁片之类的物体会比墙壁,木柜的反射更强。想要模拟现实世界的光照效果就要了解物体对光线的反应效果。在我们的着色器代码中,我们定义一个结构体:Material,来表示材质。在上一节中,我们指定了一个物体和光的颜色,以及结合环境光和镜面强度分量,来定义物体的视觉输出。当描述一个物体的时候,我们可以用这三个分量来定义一个材质颜色(Material...原创 2019-12-27 17:20:15 · 285 阅读 · 0 评论 -
学习OpenGL ES for Android(十)—冯氏光照
想要模拟真实世界的光照效果是比较困难的,我们使用一种叫做冯氏光照模型(Phong Lighting Model)的模型来实现近似的效果。冯氏光照模型的主要结构由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子:环境光照(Ambient Lighting):即使在黑暗的情况下,世界上通常也仍然有一些光亮(月...原创 2019-12-23 21:27:46 · 241 阅读 · 0 评论 -
学习OpenGL ES for Android(九)—简单光照
从这篇开始学习光照相关的知识,可以先阅读文档https://learnopengl-cn.github.io/02%20Lighting/01%20Colors/,了解光照的相关概念。光照至少需要一个光源和一个物体才能显示出的效果,那么我们就需要定义光源和物体的顶点位置和颜色,参考我们实现立方体的文章添加立方体并设置颜色,设置光源的颜色是白色,设置物体本来的颜色是橘色,那么光源照射之后的颜色就...原创 2019-12-20 14:49:21 · 568 阅读 · 0 评论 -
学习OpenGL ES for Android(八)
纹理不但可以和颜色叠加,纹理和纹理也可以叠加。纹理叠加时需要设置透明度,我们看下公式mix (x,y, a):返回x和y的线形叠加。a的范围0-1,结果= x*(1-a) + y * a根据上篇文章的着色器代码,修改gl_FragColor为两个纹理的叠加 vertexShaderCode = "uniform mat4 uMVP...原创 2019-12-17 23:51:46 · 246 阅读 · 0 评论 -
学习OpenGL ES for Android(七)
上篇我们简单的学习了纹理的显示,这篇我们先把图片等比显示,然后使纹理和颜色叠加显示。如果图片是正方形,直接使用缩放或投影即可,但是如果非正方形则需要计算图片的宽高比,然后和显示的宽高比一起计算得到真正的缩放,计算公式:比例=显示宽/显示高/(图片宽/图片高)。随后设置观察点,计算 @Override public void onSurfaceChanged(GL10 gl,...原创 2019-12-16 17:01:36 · 286 阅读 · 0 评论 -
学习OpenGL ES for Android(六)
前几篇主要学习的点线面的绘制,变换和投影的实现,绘制的都是颜色,如果想要绘制图片的话就需要使用纹理。一些相关的方法如下glGenTextures( int n, int[] textures, int offset ):生成n个纹理的index。其中n是就是数量,数组来保存这些index,offset是偏移量。glBindTexture( int target, int texture ...原创 2019-12-14 00:03:07 · 288 阅读 · 0 评论 -
学习OpenGL ES for Android(五)
上篇我们学习了对平面的变换,这篇我们将要学习对立体图形的变换。立体图形也可以称为3D图形,立体图形是由平面图形组合而来的,我先看下一个立方体的结构一个立方体有8个顶点,6个面,可以用12个三角形组合而成。我们可以使用36个(或24个)顶点的数据和glDrawArrays的方式来绘制,但是这样照成了浪费,有许多顶点都是可以复用的,所以我们使用8个顶点的数据和glDrawElements的方式...原创 2019-12-12 20:17:26 · 321 阅读 · 0 评论 -
学习OpenGL ES for Android(四)
在学习图形变换之前,可以先参考文档https://learnopengl-cn.github.io/01%20Getting%20started/07%20Transformations/学习基本概念。我们之前的绘制的都是静态的图像,如果我们使用改变顶点坐标的方式来让图像变换起来是非常麻烦的,而且会消耗更多的处理时间和性能。我们可以使用一个或多个矩阵(Matrix)对象可以更好的变换(Transf...原创 2019-12-11 17:39:48 · 655 阅读 · 0 评论 -
学习OpenGL ES for Android(三)
上篇我们看到绘制点和线,在平面上,点和线组成了面,我们先看绘制三角形。glDrawArrays的mode参数除了点和线,还有三角,是这三个:GL_TRIANGLE,GL_TRIANGLE_STRIP和GL_TRIANGLE_FAN。他们的绘制规则如下图所示,GL_TRIANGLE:每三个顶点绘制为三角形,如果不足三个则不绘制,绘制的三角形个数是:顶点数/3GL_TRIANGLE_ST...原创 2019-12-10 17:17:37 · 695 阅读 · 0 评论 -
学习OpenGL ES for Android(二)
本章将学习OpenGL ES中点和线的绘制,在绘制之前需要先了解这些:坐标系统;着色器;GLSL(OpenGL ES Shading Language),OpenGL ES着色语言;坐标系统和android布局的坐标不同,OpenGL是一个右手坐标系。简单来说,就是正x轴在你的右手边,正y轴朝上,而正z轴是朝向后方的。想象你的屏幕处于三个轴的中心,则正z轴穿过你的屏幕朝向你。坐标系画起来如...原创 2019-12-09 19:21:54 · 1041 阅读 · 0 评论 -
学习OpenGL ES for Android(一)
OpenGL是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API),而在嵌入式和移动平台的版本是OpenGL ES。Android最初就支持OpenGL ES的1.0版本,到现在已经支持到最新的3.2版本,下面的支持变化图当然这个版本支持不是绝对的,还有看硬件是否支持,例如genymotion模拟器只有OpenGL ES 2.0版本,如果你使用了高版本的API会导致崩溃。...原创 2019-12-07 17:42:07 · 1225 阅读 · 1 评论