OpenGL基础及学习及OpenGL Demo(1)

 OpenGL在游戏、视频和图像上的原理与运用。openGL 好多都是矩阵运算。OpenGL ES是一个图形处理库。
 滤镜,图形变换处理核心是拿到纹理对象的rgb做算法处理.
 OpenGL大量使用了向量和矩阵,矩阵的最重要的用途之一就是建立正交和透视投影。其原因之一是,从本质上来说,使用矩阵做投影只涉及对一组数据按顺序执行大量的加法和乘法,这些运算在现代GPU上执行的非常快。
 OpenGL ES 2.0渲染过程为:读取顶点数据——执行顶点着色器——组装图元——光栅化图元——执行片元着色器——写入帧缓冲区——显示到屏幕上。
 OpenGL 2D/3D的旋转、平移、缩放、剪切?

  opengl有两种渲染模式:连续不断的渲染和被动渲染,应用的动画直接是默认的连续不断的渲染,这样一来只要打开了应用GPU就会一直渲染,从而造成了功耗偏高。优化的方式就是将动画渲染模式更改为被动渲染。

https://img-blog.csdn.net/20180917171946888?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NoYXJlVXM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

https://i-blog.csdnimg.cn/blog_migrate/c1ea72ad0447833ce955ae24bb9d9477.png

https://i-blog.csdnimg.cn/blog_migrate/6d063a1fa24054ab7bcf443c786a97a4.png

> OpenGL 图像直接渲染到屏幕上的步骤:
 1.编写Shader。(检查支持、权限什么的就不再提了)
 2.创建GL环境,直接使用GLSurfaceView,GLSurfaceView内部实现了创建GL环境。
 3.GL环境创建后,编译Shader,创建GL Program。获取可用Texture,设置渲染参数。(onSurfaceCreated中)
 4.设置ViewPort。(onSurfaceChanged中)
 5.清屏(onDrawFrame中)
 6.启用必要的属性,useProgram,绑定纹理,传入参数(顶点坐标、纹理坐标、变换矩阵等)。(onDrawFrame中)
 7.绘制。(onDrawFrame中)
 8.下一帧数据,requestRender,再一次从第5步开始执行。

> OpenGL ES当前主要版本有1.0/1.1/2.0/3.0/3.1/4.x。这些版本的主要情况如下:
  1. OpenGL ES1.0是基于OpenGL 1.3的,OpenGL ES1.1是基于OpenGL 1.5的。Android 1.0和更高的版本支持这个API规范。OpenGL ES 1.x是针对固定硬件管线的。
  2. OpenGL ES2.0是基于OpenGL 2.0的,不兼容OpenGL ES 1.x。Android 2.2(API 8)和更高的版本支持这个API规范。OpenGL ES 2.x是针对可编程硬件管线的。OpenGLES1.x和OpenGLES2.0的渲染管道图,即可知道固定渲染管道和可编程渲染管道的区别。 
  3. OpenGL ES3.0的技术特性几乎完全来自OpenGL 3.x的,向下兼容OpenGL ES 2.x。Android 4.3(API 18)及更高的版本支持这个API规范。
  4. OpenGL ES3.1基本上可以属于OpenGL 4.x的子集,向下兼容OpenGL ES3.0/2.0。Android 5.0(API 21)和更高的版本支持这个API规范。

> openGL API ANdroid
  openGL应用领域:视频、图形、图片处理,2D/3D游戏引擎开发,科学可视化,医学软件的开发 ,CAD(计算机辅助技术),虚拟实境(AR VR),AI人工智能;
Android OpenGL20 setIdentityM,translateM,rotateM,multiplyMV等方法- https://blog.csdn.net/qq_31726827/article/details/51492784
OpenGL 常用 API- https://blog.csdn.net/MissXy_/article/details/75806636
OpenGL API简介- https://blog.csdn.net/baidu_37503452/article/details/80800773
  OpenGL函数库相关的API有核心库(gl)、实用库(glu)、辅助库(aux)、实用工具库(glut)、窗口库(glx、agl、wgl)和扩展函数库等。从图可以看出,gl是核心,glu是对gl的部分封装。glx、agl、wgl 是针对不同窗口系统的函数。glut是为跨平台的OpenGL程序的工具包,比aux功能强大。扩展函数库是硬件厂商为实现硬件更新利用OpenGL的扩展机制开发的函数。

-- OpenGL+EGL
 OpenGL是一个操作GPU的API,它通过驱动向GPU发送相关指令,控制图形渲染管线状态机的运行状态。但OpenGL需要本地视窗系统进行交互,这就需要一个中间控制层,最好与平台无关。EGL——因此被独立的设计出来,它作为OpenGL ES和本地窗口的桥梁。
 EGL 是 OpenGL ES(嵌入式)和底层 Native 平台视窗系统之间的接口。EGL API 是独立于OpenGL ES各版本标准的独立API ,其主要作用是为OpenGL指令创建 Context 、绘制目标Surface 、配置Framebuffer属性、Swap提交绘制结果等。此外,EGL为GPU厂商和OS窗口系统之间提供了一个标准配置接口。
 一般来说,OpenGL ES 图形管线的状态被存储于 EGL 管理的一个Context中。而Frame Buffers 和其他绘制 Surfaces 通过 EGL API进行创建、管理和销毁。 EGL 同时也控制和提供了对设备显示和可能的设备渲染配置的访问。
 EGL标准是C的,在Android系统Java层封装了相关API。
 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。
 Android 2.0版本之后图形系统的底层渲染均由OpenGL负责,OpenGL除了负责处理3D API调用,还需负责管理显示内存及处理Android SurfaceFlinger或上层应用对其发出的2D API调用请求。

> openGL经常使用的场景有:
1.图片处理。比如图片色调转换、美颜等。
2.摄像头预览效果处理。比如美颜相机、恶搞相机等。
3.视频处理。摄像头预览效果处理可以,这个自然也不在话下了。
4.3D游戏。比如神庙逃亡、都市赛车等。

> Android OpenGLES Demo
学习openGL- https://learnopengl.com/
《Learn OpenGL 中文》- https://learnopengl-cn.readthedocs.io/zh/latest/
android-openGL-canvas- https://github.com/ChillingVan/android-openGL-canvas
use c++ to learn OpenGL ES2 on Android.- https://github.com/xglofter/GlesTutorial
来到OpenGL的世界LearnOpenGL中文化工程- https://github.com/LearnOpenGL-CN/LearnOpenGL-CN
来到OpenGL的世界LearnOpenGL- https://github.com/JoeyDeVries/LearnOpenGL
GPUImage滤镜- http://www.jianshu.com/nb/4268718
LearnOpenGLES- https://github.com/loyinglin/LearnOpenGLES  
LearnOpenGLES- https://github.com/wangdingqiao/noteForOpenGL/tree/master/modelLoading
AndroidOpenGLDemo- https://github.com/doggycoder/AndroidOpenGLDemo
GraphicsTestBed 滤镜处理和OpenGLES进阶- https://github.com/lb377463323/GraphicsTestBed
android-openGL-canvas- https://github.com/ChillingVan/android-openGL-canvas

简单3D图形构建- https://github.com/IceNum/MyOpenGLApplication
A Java math library for OpenGL rendering calculations- https://github.com/JOML-CI/JOML
Simple camera timer app for Android- https://github.com/dozingcat/CamTimer

OpenGLES20Study- https://github.com/renhui/OpenGLES20Study

LearnOpenGL中文化工程- https://github.com/LearnOpenGL-CN/LearnOpenGL-CN

Learn OpenGL-CN- https://learnopengl-cn.readthedocs.io/zh/latest/04%20Advanced%20OpenGL/01%20Depth%20testing/

OpenGL ES 3.0 Programming Guide Sample Code- https://github.com/danginsburg/opengles3-book/
Android OpenGL ES从白痴到入门(三):引入EGL- https://www.jianshu.com/p/9db986365cda
https://pan.baidu.com/s/1hrAYRlU?errno=0&errmsg=Auth%20Login%20Sucess&&bduss=&ssnerror=0&traceid=

> OpenGL使用简便,效率高;OpenGL具有七大功能:
  1. 建模:OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面绘制函数。
  2. 变换:OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、缩放、镜像四种变换,投影变换有平行投影(又称正射投影)和透视投 影两种变换。其变换方法有利于减少算法的运行时间,提高三维图形的显示速度。
  3. 颜色模式设置:OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color Index)。
  4. 光照和材质设置:OpenGL光有自发光(Emitted Light)、环境光(Ambient Light)、漫反射光(Diffuse Light)和高光(Specular Light)。材质是用光反射率来表示。场景(Scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。
  5. 纹理映射(Texture Mapping)。利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。
  6. 位图显示和图象增强图象功能除了基本的拷贝和像素读写外,还提供融合(Blending)、抗锯齿(反走样)(Antialiasing)和雾(fog)的特殊图象效果处理。以上三条可使被仿真物更具真实感,增强图形显示的效果。
  7. 双缓存动画(Double Buffering)双缓存即前台缓存和后台缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。
  此外,利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊(Motion Blur)等特殊效果。从而实现了消隐算法。

> OpenGLOpenGL两种主要的投影:正交和透视投影
  “光栅化技术”,就是OpenGL会把点,直线,三角形分解成大量的小片段,类似像素,每个片段上有红,绿,蓝,透明度的颜色分量,每一个小片段根据不同的红,绿,蓝,透明度组合最终产生不同的颜色。这些小片段映射到屏幕上就是一个个像素,最终构成一幅美丽的图案。而片段着色器的作用就是告诉GPU每一个片段(像素)显示颜色的最终值。基于基本图元的每个片段,片段着色器都会被调用一次,如一个三角形被映射成1000个片段,则片段着色器会被调用1000次。 
  任何复杂的3D渲染效果都是通过变换,着色,纹理,混合这4种方式有效组合得到的。OpenGL 的基本形状是三角形,无论是绘制形状还是填充,都是对于图形进行操作.
  OpenGL一些需要掌握的概念:投影,视口(ViewPort),视景体,平截投体,近平面,远平面。 
  openGL中有两种投影分别是正投影或叫平行投影,透视投影。正投影物体实际大小在远平面上都是相同的,不会因为距离远近而投影大小发生变化。透视投影,则是离近平面越近投影越大,越远的物体投影越小。

> OpenGLES2.0基础
Android OpenGLES2.0(一)——了解OpenGLES2.0- http://blog.csdn.net/junzia/article/details/52793354
  OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。
  OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形(二维也包括) API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。OpenGLES中的矩阵有2*2、3*3和4*4三种矩阵。矩阵的运算是数值分析领域的重要问题。
  OpenGLES只有点、线、三角形。三角形就是OpenGLES提供的最复杂的图元单位。

-- OpenGL ES 2.0渲染过程为: 读取顶点数据——执行顶点着色器——组装图元——光栅化图元——执行片元着色器——写入帧缓冲区——显示到屏幕上。
  1.OpenGL作为本地库直接运行在硬件上,没有虚拟机,也没有垃圾回收或者内存压缩。在Java层定义图像的数据需要能被OpenGL存取,因此,需要把内存从Java堆复制到本地堆。
  2.顶点着色器是针对每个顶点都会执行的程序,是确定每个顶点的位置。同理,片元着色器是针对每个片元都会执行的程序,确定每个片元的颜色。
  3.着色器需要进行编译,然后链接到OpenGL程序中。一个OpenGL的程序就是把一个顶点着色器和一个片段着色器链接在一起变成单个对象。

--  GLSL语言实现的两类着色器:顶点处理器(Vertex Processor)和片断处理器(Fragment Processor).

  Opengl渲染的整个过程。openGL采用cs模型:c是cpu,s是GPU,c给s的输入是vertex信息和Texture信息,s的输出是显示器上显示的图像。
  几何顶点数据包括模型的顶点集、线集、多边形集,这些数据经过流程图的上部,包括运算器、逐个顶点操作等;图像数据包括象素集、影像集、位图集等,图像象素数据的处理方式与几何顶点数据的处理方式是不同的,但它们都经过光栅化、逐个片元(Fragment)处理直至把最后的光栅数据写入帧缓冲器。在OpenGL中的所有数据包括几何顶点数据和象素数据都可以被存储在显示列表中或者立即可以得到处理。OpenGL中,显示列表技术是一项重要的技术。
  OpenGL要求把所有的几何图形单元都用顶点来描述,这样运算器和逐个顶点计算操作都可以针对每个顶点进行计算和操作,然后进行光栅化形成图形碎片;对于像素数据,像素操作结果被存储在纹理组装用的内存中,再象几何顶点操作一样光栅化形成图形片元。
  整个流程操作的最后,图形片元都要进行一系列的逐个片元操作,这样最后的象素值BZ送入帧缓冲器实现图形的显示。 
  
-- OpenGL中的坐标是带有深度信息的三维坐标,把这些三维坐标转换成可以在LCD上显示的二维坐标,这个过程叫做pipeline。pipeline分为以下两个步骤: 
 第一步:将坐标值由3D的转换成2D。 
 第二步:对第一步中的2D坐标赋予颜色值(RGBA)。

-- 使用OpenGl ES关于渲染方式有以下两种:RENDERMODE_CONTINUOUSLY和 RENDERMODE_WHEN_DIRTY。
  默认渲染方式为RENDERMODE_CONTINUOUSLY,1)当设置为RENDERMODE_CONTINUOUSLY时渲染器会不停地渲染场景;2)当设置为RENDERMODE_WHEN_DIRTY时只有在创建和调用requestRender()时才会刷新。一般设置为RENDERMODE_WHEN_DIRTY方式,这样不会让CPU一直处于高速运转状态,提高手机电池使用时间和软件整体性能。

-- OpenGL是图形硬件的一种软件接口,它的设计目标就是作为一种流线型的,独立于硬件的接口,在许多不同的硬件平台上实现。 
 Android提供了Canvas绘制工具,它可以轻而易举地完成图形绘制、位图绘制,但是OpenGL相对于Canvas而言,能够提供更强大的光照,三维绘制等等众多特性与功能,同时由于OpenGL是直接操作GPU渲染的,它的处理效率会非常快。
  OpenGL播放视频的技术- https://blog.csdn.net/gxflh/article/details/70259915
  OpenGL纹理坐标取值范围是0-1,坐标原点位于左下角。这一点和Direct3D是
不同的,Direct3D纹理坐标的取值虽然也是0-1,但是他的坐标原点位于左上角。
  在OpenGL中,物体表面坐标取值范围是-1到1。坐标系原点在中心位置。
  OpenGL ES采用的是右手坐标,选取屏幕中心为原点,从原点到屏幕边缘默认长度为1,也就是说默认情况下,从原点到(1,0,0)的距离和到(0,1,0)的距离在屏幕上展示的并不相同。即向右为X正轴方向,向左为X负轴方向,向上为Y轴正轴方向,向下为Y轴负轴方向,屏幕面垂直向上为Z轴正轴方向,垂直向下为Z轴负轴方向。
  OpenGL ES2.0的世界里面只有点、线、三角形,其它更为复杂的几何形状都是由三角形构成的。包括正方形、圆形、正方体、球体等。但是其他更为复杂的物体,我们不可能都自己去用三角形构建,这个时候就需要通过加载利用其他软件(比如3DMax)构建的3D模型。
  OpenGL ES将这种从3D到2D的转换过程利用投影的方式使计算相对使用者来说变得简单可设置。 
OpenGL ES中有两种投影方式:正交投影和透视投影。正交投影,物体不会随距离观测点的位置而大小发生变化。而透视投影,距离观测点越远,物体越小,距离观测点越近,物体越大。
  在OpenGL ES 2.0中,光照由三种元素组成(也可以说是三种通道组成),分别为环境光、镜面光及散射光。

  现实世界中的物体往往是绚丽多彩的,要模拟现实世界的绚丽多彩,绘制出更加真实、酷炫的3D物体,就需要用到纹理映射了。纹理映射是将2D的纹理映射到3D场景中的立体物体上。
  如3D模型加载、贴图、阴影、粒子、混合与雾、标志板、天空盒和与天空穹等。OpenGL中的坐标处理包括模型变换、视变换、投影变换、视口变换等内容。OpenGL中的平移、旋转、缩放。

-- OpenGLES的着色器语言GLSL是一种高级的图形化编程语言,其源自应用广泛的C语言。与传统的C语言不同的是,它提供了更加丰富的针对于图像处理的原生类型,诸
如向量、矩阵之类。OpenGLES 主要包含以下特性:
  1.GLSL是一种面向过程的语言,和Java的面向对象是不同的。
  2.GLSL的基本语法与C/C++基本相同。
  3.它完美的支持向量和矩阵操作。
  4.它是通过限定符操作来管理输入输出类型的。
  5.GLSL提供了大量的内置函数来提供丰富的扩展功能。

下面是一个简单的 OpenGL ES 2.0 线性插值的示例代码,用于在两个顶点之间进行颜色的线性插值渲染: ```java import android.opengl.GLES20; import android.opengl.GLSurfaceView; import android.opengl.Matrix; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; public class MyRenderer implements GLSurfaceView.Renderer { private float[] vertices = { -0.5f, -0.5f, 0.0f, // 左下角顶点 0.5f, -0.5f, 0.0f, // 右下角顶点 0.0f, 0.5f, 0.0f // 顶部顶点 }; private float[] colors = { 1.0f, 0.0f, 0.0f, 1.0f, // 左下角顶点颜色 (红色) 0.0f, 1.0f, 0.0f, 1.0f, // 右下角顶点颜色 (绿色) 0.0f, 0.0f, 1.0f, 1.0f // 顶部顶点颜色 (蓝色) }; private int program; private int positionHandle; private int colorHandle; private int mvpMatrixHandle; private float[] projectionMatrix = new float[16]; @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode); int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode); program = GLES20.glCreateProgram(); GLES20.glAttachShader(program, vertexShader); GLES20.glAttachShader(program, fragmentShader); GLES20.glLinkProgram(program); positionHandle = GLES20.glGetAttribLocation(program, "vPosition"); colorHandle = GLES20.glGetAttribLocation(program, "vColor"); mvpMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); GLES20.glUseProgram(program); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { GLES20.glViewport(0, 0, width, height); float ratio = (float) width / height; Matrix.frustumM(projectionMatrix, 0, -ratio, ratio, -1, 1); } @Override public void onDrawFrame(GL10 gl) { GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); // 将投影矩阵传递给着色器 GLES20.glUniformMatrix4fv(mvpMatrixHandle, 1, false, projectionMatrix, 0); // 启用顶点位置和颜色属性 GLES20.glEnableVertexAttribArray(positionHandle); GLES20.glEnableVertexAttribArray(colorHandle); // 设置顶点位置数据 GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 0, vertexBuffer); // 设置顶点颜色数据 GLES20.glVertexAttribPointer(colorHandle, 4, GLES20.GL_FLOAT, false, 0, colorBuffer); // 执行绘制 GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3); // 禁用顶点位置和颜色属性 GLES20.glDisableVertexAttribArray(positionHandle); GLES20.glDisableVertexAttribArray(colorHandle); } private int loadShader(int type, String shaderCode) { int shader = GLES20.glCreateShader(type); GLES20.glShaderSource(shader, shaderCode); GLES20.glCompileShader(shader); return shader; } // 着色器代码 private final String vertexShaderCode = "attribute vec4 vPosition;" + "attribute vec4 vColor;" + "uniform mat4 uMVPMatrix;" + "varying vec4 interpolatedColor;" + "void main() {" + " gl_Position = uMVPMatrix * vPosition;" + " interpolatedColor = vColor;" + "}"; private final String fragmentShaderCode = "precision mediump float;" + "varying vec4 interpolatedColor;" + "void main() {" + " gl_FragColor = interpolatedColor;" + "}"; } ``` 注意,上述代码是一个简化的示例,只绘制了一个三角形,并将顶点的颜色进行了线性插值。你可以根据实际需求进行更复杂的插值操作和渲染效果的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值