读书笔记:渲染管线及3D开发步骤

      渲染管线在一定程度上可以理解为3D开发的步骤,因此理解渲染管线的机制是很有必要的。
    渲染管线有时也成为渲染流水线,一般由显示芯片GPU内部处理图形信号的并行处理单元组成。这些并行处理单元两两之间是相互独立的,在不同型号的硬件上独立处理单元的数量也有很大的差异。一般越高端型号的硬件,其中处理单元的数量也越多。
    在有些没有GPU的硬件设备上也有采用软件模拟实现管线的各个处理单元的情况,一般多见于廉价的低端设备。
    与普通应用程序通过CPU串行执行不同,将渲染工作通过渲染管线中多个相互独立的处理单元进行并行处理后,渲染效率可以得到极大的提升。
从另一个角度看,OpenGL ES 中的渲染管线实质上是指一系列绘制过程。这些过程输入的是带渲染3D物体的相关描述信息数据,经过渲染管线,输出的是一帧想要的图像。
    OpenGL ES2.0与1.0渲染管线图自行搜索,应该相互比较学习,其各部分:
    1,基本处理:该阶段设定3D空间中物体的顶点坐标,定点对应的颜色,定点的纹理坐标等属性,并制定绘制方式,如:点绘制,线绘制,三角形绘制等。对应与程序中的初始化阶段。
    2,顶点缓冲对象:这部分功能在程序中是可选的,对于某些在整个场景中定点的基本数据不变的情况。可以在初始化阶段将定点数据经过处理后送入定点缓冲对象,在绘制每一帧想要的图像时就省去了定点数据IO的麻烦,直接从顶点缓冲对象中获取顶点数据即可。相比于每次绘制时单独蒋鼎点数据送入GPU的方式,可以在一定程度上节省GPU的IO贷款,提供渲染效率。
    3,变换和光照:该阶段的主要工作是进行顶点变换以及根据程序中设置的光照属性对顶点进行光照计算。定点变换的任务是对3D物体的各个顶点进行平移,旋转,缩放等操作。光照计算的任务是根据程序送入的光源位置,性质,各通道强度,物体的材质等,同时在根据一定的光照数学模型计算各顶点的光照情况。
    OpenGL ES2.0中“顶点着色器”取代了1.0中的“变换和光照”阶段,这使得开发3D场景时对顶点的变换,法向量的计算,纹理坐标的变换,光照与材质的应用等均有开发者使用着色器代码完成,灵活性大大增强。
    定点着色器:是一个可编程的处理单元,功能为执行定点的变换,关照,材质的应用与计算等顶点的相关操作。其每顶点执行一次。其工作过程为首先将原始的定点几何信息及其他属性传送到定点着色器中,经过自己开发的定点着色器处理后产生纹理坐标,颜色,点位置等后继流程需要的各顶点属性信息,然后将其传给图源装配阶段。
    定点着色器的输入主要为待处理定点相应的attribute(属性)变量,uniform(全局)变量,采样器以及临时变量,输出主要为经过定点着色器后生成的varying(易变)变量及一些内建输出变量。
    4,图源装配:该阶段主要有两个任务,一是图源装配,另一个是图源处理。图源组装是指顶点数据根据设置的绘制方式被结合成完整的图元。图元处理最重要的工作是剪裁,其任务是消除位于半空间之外的部分集合图元,这个半空间是由一个剪切平面所定义的。
    5,光栅化:在真正执行光栅化工作之前,首先需要将虚拟3D世界中的物体投影到视平面上,需要注意的是,由于观察位置不同,同一个3D场景中的物体投影到视平面可能会产生不同的效果。
    另外,由于虚拟3D世界中物体的几何信息一般采用连续的数学量来表示,因此投影的平面结果也是用连续的数学量表示的。但目前的显示设备屏幕都是离散化的(由一个一个的像素组成),因此还需将投影的结果离散化。将其分散为一个一个离散化的小单元,这些小单元一般称之为片元。
    每个片元都对应与帧缓冲中的一个像素,之所以不称之为像素是因为3D空间中的物体是可以相互遮挡的,而一个3D场景最终显示到屏幕上虽然是一个整体,但每个3D物体的每个图元是独立处理的。
    6,纹理环境和颜色求和:该阶段主要有两个任务,一是纹理采样任务,其主要是根据当前需处理片元的纹理坐标及采用的纹理id对应的纹理图进行纹理采样,获取采样值;另一个是颜色求和,主要是执行颜色的变化,其根据纹理采样及光照计算等的结果综合生成需处理片元的颜色。
    7,雾:该阶段主要是根据程序中设置的雾的相关参数,如颜色,浓度,范围等,以及某种雾的数学模型来计算当前处理的片元受雾影响后的颜色。
    8,Alpha测试:如果程序中启用了Alpha测试,OpenGL ES会检查每个片元的Alpha值,只有Alpha值符合测试条件的片元才会送入下一阶段,不满足条件的片元则会被丢弃。
    9,剪裁测试:如果程序中启用了建材测试,OpenGL ES会检查每个片元在帧缓冲中对应的位置,若对应位置在剪裁窗口中则将此片元送入下一阶段,否则丢弃此片元。
    2.0中的“片元着色器”取代了1.0中的纹理环境和颜色求和,雾,以及Alpha测试等阶段,这使得这些都由开发者自行开发,大大增强了程序对片元的处理能力,可以实现很多1.0难以完成的片元处理任务。
    片元着色器:是处理片元值及其相关数据的可编程单元,其可以执行纹理的采样,颜色的汇总,计算雾颜色等操作,每片元执行一次。片元着色器的主要功能为通过重复执行将3D物体中的图元光栅化后产生的每个片元的颜色等属性计算出来送入后继阶段,如剪裁测试,深度测试及模板测试等。
    10,深度测试和模板测试:深度测试是指将输入片元的深度值与帧缓冲区中存储的对应位置片元的深度值进行比较,若输入片元的深度值小则将输入片元送入下一阶段准备覆盖帧缓冲中的原片元或帧缓冲中的原片元混合,否则丢弃输入片元。模板测试的主要功能为将绘制区域限定在一定的范围内,一般用在湖面倒影,景象等场合。
    11,颜色缓冲混合:若程序中开启了Alpha混合,则根据混合因子将上一阶段送来的片元与帧缓冲中对应位置的片元进行Alpha混合,否则送入的片元将覆盖帧缓冲中对应位置的片元。
    12,抖动:抖动是一种简单的操作,其允许只是用少量的颜色模拟出更宽的颜色显示范围,从而使颜色视觉效果更加丰富。例如可以使用白色以及黑色模拟出一种过度的灰色。使用抖动会损失一部分分辨率,因此对于现在主流的原声颜色就很丰富的显示设备一般是不需要启用抖动的。
    13,帧缓冲:OpenGL ES 中的物体绘制并不是直接在屏幕上进行的,而是预先在帧缓冲区进行绘制,每绘制完一帧再将绘制的结果交换到屏幕上。因此每次绘制新的一帧时都需要消除缓冲区中的相关数据,否则有可能产生不正确的绘制结果。
    为了应对不同方面的需要,帧缓冲是由一套组件组成的,主要有颜色缓冲,深度缓冲,模板缓冲。颜色缓冲用于存储每个片元的颜色值,每个颜色值包括RGBA( 红,绿,蓝,透明度 )4个色彩通道,应用程序运行时在屏幕上看到的就是颜色缓冲中的内容。深度缓冲用来存储每个片元的深度值,所谓深度值,是指以特定的内部格式表示的从片元处到观察点(摄像机)的距离。在启用深度测试的情况下,新片元想进入帧缓冲是需要将自己的深度值与帧缓冲中对应位置片元的深度值进行比较,若结果小于才有可能进入缓冲,否则被丢弃。 模板缓冲用来存储每个片元的模板值,供模板测试使用。模板测试是几种测试中最为灵活和复杂的一种。

3D开发经典步骤:
1, 开发需要用到的工具类,其功能是将着色器脚本加载到显卡并编译,大致包含如下操作:加载着色器内容的方法,检查每一步操作是否有错误的方法,加载着色器编码进GPU并进行编译的方法,创建着色器程序的方法
2,开发用于创建3D图形的类,该类的主要功能是初始化定点数据,初始化着色器,设置相应的矩阵,绘制图形等
3,开发显示3D场景的类,MyTDView,该类继承自GLSurfaceView。并且在该类中通过内部类的形式创建了渲染器。
4,主控制类,继承Activity,在程序开始时执行。该类主要是创建MyTDView对象,然后调用setContentView()方法跳转到相关界面。
5,用着色器语言开发着色器,着色器的代码可以存储在后缀名为“.sh”文件中,这些文件放在项目的assets目录下。
定点着色器:主要作用为执行顶点变换,纹理坐标变换等顶点操作;

片元着色器:主要作用为执行纹理的访问,颜色的汇总,以及雾效等操作。

--《Android3D游戏开发技术宝典》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值