最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

Android显示系统(02)- OpenGL ES - 概述

业界 admin 1浏览 0评论

Android显示系统(01)- 架构分析
Android显示系统(02)- OpenGL ES - 概述
Android显示系统(03)- OpenGL ES - GLSurfaceView的使用
Android显示系统(04)- OpenGL ES - Shader绘制三角形
Android显示系统(05)- OpenGL ES - Shader绘制三角形(使用glsl文件)
Android显示系统(06)- OpenGL ES - VBO和EBO和VAO
Android显示系统(07)- OpenGL ES - 纹理Texture
Android显示系统(08)- OpenGL ES - 图片拉伸
Android显示系统(09)- SurfaceFlinger的使用
Android显示系统(10)- SurfaceFlinger内部结构
Android显示系统(11)- 向SurfaceFlinger申请Surface
Android显示系统(12)- 向SurfaceFlinger申请Buffer
Android显示系统(13)- 向SurfaceFlinger提交Buffer

一、前言:

为了介绍清楚Android显示系统,得从实战的目的花几篇文章介绍下OpenGL ES,对OpenGL ES熟悉的可以直接跳过这几章。OpenGL ES是OpenGL的精简版,专门用于嵌入式平台,因为嵌入式平台硬件资源有限,做了定向的优化。而OpenGL就是定义了一套渲染API标准(注意不是库),方便不同操作系统,不同硬件对渲染进行统一。目的就是一个:将3D世界转换到2D屏幕显示出来,比如以前小学课文中有一篇叫做《画杨桃》,3D空间中的杨桃就像我们设计的一个模型,但是,从不同视角去看,在2D屏幕上形成的一张画是不一样的:

二、OpenGL渲染管线:

OpenGL 1.0之前是固定管线,从2.0版本开始就成为可编程(写Shader程序)了,更灵活了。从3D世界转换为2D数据的过程,也就是渲染的过程,在OpenGL中前一个步骤输出结果又可以作为下一个步骤的输入,像工厂流水线一样,我们叫做渲染管线,如下图所示:

这是对GPU渲染管线各个阶段做了抽象,其中蓝色的三个部分我们可以自己写一段程序控制(着色器程序,英文:Shader)。由于现代GPU基本上有成百上千的核,因此,我们这种Shader就可以并行运行在GPU上,充分利用GPU资源。

同时,我们也可以看出,渲染管线做的事情可以粗略总结为:将三维模型转换为二维模型(几何阶段),然后,给模型中每个像素填充颜色(光栅化阶段),其中几何阶段就是上面渲染管线的前三步,光栅化阶段就是后三步,分解看看:

1、模型数据(Vertex Data)

就是将三维顶点数据二维化,顶点数据包括:顶点的(x, y, z)坐标,顶点的RGB颜色,还有一些顶点的法线、uv、切线等等。针对坐标系,以及数据生成的过程,总结起来就是,3D到2D的过程要经过:物体坐标系→世界坐标系→摄像机坐标系→屏幕坐标系变换。最终就在屏幕坐标系形成一幅画。

就像一个杨桃放到那里,我们可能画一张之后,我们人可能走动再画另外一个视角,或者走进走远再画,还有可能在旁边放几片叶子再画。但是,无论你怎么走动,杨桃本身还在那里,不增不减。也就是物体坐标系当中的不会变换。

三维变换主要有:模型变换、视图变换、投影变换三种。下面我以一个最简单的模型–三角形为例子说明下:

a)模型变换:

就是对模型进行:平移,缩放,旋转。

比如,刚开始三角形在世界坐标系中是这样:

我们进行平移下:

旋转缩放大家自己脑补下。

b)视图变换:

我们希望这个模型不再是以世界坐标系为中心了,而是以摄像机(眼睛)为中心的坐标系去观察这个世界。所以,在摄像机的地方建立一个右手坐标系:

然后,以摄像机为中心的坐标系,进行视图变换:

这样,就拿到了摄像机坐标系当中的坐标。

c)投影变换:

将我们前面摄像机角度看到的像投影到标准屏幕坐标系当中:

蓝色的就是屏幕啦!实际投影变换其实还要复杂一些,需要压缩成模盒,后面遇到再解释,先有点印象。

2、顶点着色器(Vertex Shader)

前面步骤形成的图片是线性的,并不能显示在屏幕上,要想显示,必须像素化。我们现在以三角形为例子在说明,实际OpenGL中任何图形都可以使用图元(点、线、三角形)来拼出来,比如:

上面就将一个人像模型用很多三角形表示了,复杂的地方(或者想更细腻)我们可以使用更多三角形表示。因此,我们为了更直观介绍,只介绍三角形这个最简单的模型,其他复杂模型就得继续深造。

所以,目前我们需要提取这个三角形的顶点数据。这些顶点数据会通过顶点数组对象(VAO)告诉OpenGL,通过索引缓冲对象(EBO)告诉OpenGL,这些顶点数据是如何绘制构成图形的。像这样:

float vertices[] 

Android显示系统(01)- 架构分析
Android显示系统(02)- OpenGL ES - 概述
Android显示系统(03)- OpenGL ES - GLSurfaceView的使用
Android显示系统(04)- OpenGL ES - Shader绘制三角形
Android显示系统(05)- OpenGL ES - Shader绘制三角形(使用glsl文件)
Android显示系统(06)- OpenGL ES - VBO和EBO和VAO
Android显示系统(07)- OpenGL ES - 纹理Texture
Android显示系统(08)- OpenGL ES - 图片拉伸
Android显示系统(09)- SurfaceFlinger的使用
Android显示系统(10)- SurfaceFlinger内部结构
Android显示系统(11)- 向SurfaceFlinger申请Surface
Android显示系统(12)- 向SurfaceFlinger申请Buffer
Android显示系统(13)- 向SurfaceFlinger提交Buffer

一、前言:

为了介绍清楚Android显示系统,得从实战的目的花几篇文章介绍下OpenGL ES,对OpenGL ES熟悉的可以直接跳过这几章。OpenGL ES是OpenGL的精简版,专门用于嵌入式平台,因为嵌入式平台硬件资源有限,做了定向的优化。而OpenGL就是定义了一套渲染API标准(注意不是库),方便不同操作系统,不同硬件对渲染进行统一。目的就是一个:将3D世界转换到2D屏幕显示出来,比如以前小学课文中有一篇叫做《画杨桃》,3D空间中的杨桃就像我们设计的一个模型,但是,从不同视角去看,在2D屏幕上形成的一张画是不一样的:

二、OpenGL渲染管线:

OpenGL 1.0之前是固定管线,从2.0版本开始就成为可编程(写Shader程序)了,更灵活了。从3D世界转换为2D数据的过程,也就是渲染的过程,在OpenGL中前一个步骤输出结果又可以作为下一个步骤的输入,像工厂流水线一样,我们叫做渲染管线,如下图所示:

这是对GPU渲染管线各个阶段做了抽象,其中蓝色的三个部分我们可以自己写一段程序控制(着色器程序,英文:Shader)。由于现代GPU基本上有成百上千的核,因此,我们这种Shader就可以并行运行在GPU上,充分利用GPU资源。

同时,我们也可以看出,渲染管线做的事情可以粗略总结为:将三维模型转换为二维模型(几何阶段),然后,给模型中每个像素填充颜色(光栅化阶段),其中几何阶段就是上面渲染管线的前三步,光栅化阶段就是后三步,分解看看:

1、模型数据(Vertex Data)

就是将三维顶点数据二维化,顶点数据包括:顶点的(x, y, z)坐标,顶点的RGB颜色,还有一些顶点的法线、uv、切线等等。针对坐标系,以及数据生成的过程,总结起来就是,3D到2D的过程要经过:物体坐标系→世界坐标系→摄像机坐标系→屏幕坐标系变换。最终就在屏幕坐标系形成一幅画。

就像一个杨桃放到那里,我们可能画一张之后,我们人可能走动再画另外一个视角,或者走进走远再画,还有可能在旁边放几片叶子再画。但是,无论你怎么走动,杨桃本身还在那里,不增不减。也就是物体坐标系当中的不会变换。

三维变换主要有:模型变换、视图变换、投影变换三种。下面我以一个最简单的模型–三角形为例子说明下:

a)模型变换:

就是对模型进行:平移,缩放,旋转。

比如,刚开始三角形在世界坐标系中是这样:

我们进行平移下:

旋转缩放大家自己脑补下。

b)视图变换:

我们希望这个模型不再是以世界坐标系为中心了,而是以摄像机(眼睛)为中心的坐标系去观察这个世界。所以,在摄像机的地方建立一个右手坐标系:

然后,以摄像机为中心的坐标系,进行视图变换:

这样,就拿到了摄像机坐标系当中的坐标。

c)投影变换:

将我们前面摄像机角度看到的像投影到标准屏幕坐标系当中:

蓝色的就是屏幕啦!实际投影变换其实还要复杂一些,需要压缩成模盒,后面遇到再解释,先有点印象。

2、顶点着色器(Vertex Shader)

前面步骤形成的图片是线性的,并不能显示在屏幕上,要想显示,必须像素化。我们现在以三角形为例子在说明,实际OpenGL中任何图形都可以使用图元(点、线、三角形)来拼出来,比如:

上面就将一个人像模型用很多三角形表示了,复杂的地方(或者想更细腻)我们可以使用更多三角形表示。因此,我们为了更直观介绍,只介绍三角形这个最简单的模型,其他复杂模型就得继续深造。

所以,目前我们需要提取这个三角形的顶点数据。这些顶点数据会通过顶点数组对象(VAO)告诉OpenGL,通过索引缓冲对象(EBO)告诉OpenGL,这些顶点数据是如何绘制构成图形的。像这样:

float vertices[] 
发布评论

评论列表 (0)

  1. 暂无评论