渲染流水线

渲染流水线的工作任务

根据一个三维场景,生成一张二维图像
从一系列的顶点数据、纹理等信息出发,将这些信息转换为一张人眼可见的图像
该工作由CPU和GPU共同完成

渲染流程可从概念上分为3个阶段

应用阶段

在CPU中进行(该阶段由开发者控制)

任务

准备好场景数据

  • 摄像机的位置
  • 视锥体
  • 场景中包含的模型
  • 场景中使用的光源

粗粒度剔除

  • 剔除不可见的物体(避免在下一阶段时再处理)
  • 为了提高渲染性能

设置各模型的渲染状态

  • 使用的材质(漫反射颜色、高光反射颜色)
  • 使用的纹理
  • 使用的Shader
输出

渲染所需的几何信息(渲染图元)

  • 点、线、三角面

几何阶段

在GPU中进行

任务

对各渲染图元进行处理,将顶点坐标变换到屏幕空间中

输出

屏幕空间的二维顶点坐标、各顶点的深度值和着色等信息

光栅化阶段

在GPU中进行

任务

决定各渲染图元中哪些像素应被绘制到屏幕上(对各顶点数据进行插值后,逐像素处理)

输出

最终的二维图像

真正用于实现的渲染流水线

应用阶段

将数据加载到显存

所有渲染所需的数据都需从硬盘加载到内存中,然后,网格和纹理等数据需加载到显存(显卡的存储空间)中
因为

  • 显卡访问显存比访问内存快
  • 大多数显卡无权直接访问内存

需要加载到显存的数据

  • 顶点的位置信息、法线方向、颜色
  • 纹理坐标

对于加载到显存的数据,如果CPU无需访问(有时CPU需要访问网格数据进行碰撞检测,这种情况不能删除内存中的该数据,因为将数据从硬盘加载到内存很耗时),则可以删掉内存中的数据

设置渲染状态

渲染状态定义了场景中的网格如何(使用哪个着色器,光源属性,材质)被渲染
CPU设置渲染状态来指导GPU渲染
CPU通过调用渲染命令DrawCall来通知GPU

调用Draw Call

该命令由CPU发起,由GPU接收,指向一个需被渲染的图元列表
GPU根据渲染状态和顶点数据进行计算,输出成在屏幕上显示的像素
该计算过程就是GPU流水线(几何阶段和光栅化阶段)

几何阶段

顶点着色器

完全可编程
输入进来的每个顶点都会调用一次顶点着色器
顶点着色器无法创建或销毁顶点,无法得到顶点间关系(因顶点相互独立,所以可并行处理多个顶点)
可修改顶点坐标和颜色,模拟水面或布料等
顶点着色器必须要将顶点坐标从模型空间转换到齐次裁剪空间(最基本工作)
顶点着色器可将数据经光栅化后交给片元着色器处理,在现代Shader Model中,可将数据发送给曲面细分着色器或几何着色器

曲面细分着色器

非必须执行
细分图元

几何着色器

非必须执行
逐图元地着色或产生更多图元

裁剪

不可编程(是硬件上的固定操作),可配置(自定义裁剪平面来配置裁剪区域,控制裁剪三角图元的正或反面)
将不在摄像机视野内的顶点裁剪掉并剔除某些三角图元的面片
图元与摄像机视野的关系有3种

  • 完全在视野内
    传递给下一阶段
  • 部分在视野内
    进行裁剪操作
  • 完全在视野外
    无需传递给下一阶段(无需被渲染)
屏幕映射

不可配置,不可编程
将各图元坐标(三维坐标)转换到屏幕坐标系(二维坐标)
OpenGL的最小窗口坐标为左下角
DirectX的最小窗口坐标为左上角

光栅化阶段

计算各图元覆盖了哪些像素,计算这些像素的颜色

三角形设置

固定函数阶段
计算三角网格表示数据的过程
根据顶点数据算出边界各像素的数据,使用算得的数据表示三角形边界
判断一个三角网格覆盖了哪些像素,根据顶点信息对覆盖区域的像素进行插值,得到一个片元序列(片元不是像素,包含了许多用于计算像素最终颜色的状态,如坐标、深度、纹理、法线等)

三角形遍历(扫描变换)

固定函数阶段
计算三角网格表示数据的过程
根据顶点数据算出边界各像素的数据,使用算得的数据表示三角形边界
判断一个三角网格覆盖了哪些像素,根据顶点信息对覆盖区域的像素进行插值,得到一个片元序列(片元不是像素,包含了许多用于计算像素最终颜色的状态,如坐标、深度、纹理、法线等)

片元着色器(在DirectX中叫 像素着色器)

完全可编程
逐片元地着色,仅影响单个片元,但可访问导数信息
根据输入的顶点信息进行插值,得到各片元的信息

逐片元操作

不可编程,高度可配置(设置每一步的操作细节)
通过进行深度测试和模板测试等来决定片元的可见性(是否允许其与颜色缓冲区合并)
模板测试
用于限制渲染区域、渲染阴影、轮廓渲染等
读取模板缓冲区中该片元位置的模板值,与读取到的参考值进行比较,根据比较结果修改模板缓冲区,并决定是否舍弃该片元
深度测试
将该片元的深度值与深度缓冲区中的深度值进行比较,决定是否舍弃该片元
未通过测试的片元无权修改深度缓冲区的值,可使用通过测试的片元的深度值覆盖原深度值(也可不覆盖)
可通过Early-Z技术将深度测试提前到片元着色器之前(但有时需在片元着色器阶段判断是否要舍弃片元)
合并
对通过了所有测试的片元,将其颜色值与已存储在颜色缓冲区中的颜色进行合并(混合)
决定是使用本次渲染得到的颜色完全覆盖掉之前的结果还是进行其他处理

屏幕图像

概念

OpenGL/DirectX

直接访问GPU很麻烦,麻烦体现在需要与各种寄存器和显存打交道
为了消除麻烦,在硬件基础上实现一层抽象,即图像编程接口(OpenGL和DirectX)
应用程序向接口发送渲染命令,接口向显卡驱动发送渲染命令,显卡驱动将命令翻译成GPU能理解的代码,进行绘制
应用程序 -> 图像编程接口 -> 显卡驱动 -> 显存和GPU

HLSL/GLSL/CG

GLSL:OpenGL,OpenGL Shading Language,可在多平台工作(原因是OpenGL未提供着色器编译器,由显卡驱动来完成着色器编译工作,因此只要显卡驱动支持该语言的编译即可),依赖硬件,导致编译结果不一致
HLSL:DirectX,High Level Shading Language,微软控制着色器编译,与硬件无关,仅支持微软平台
CG:NVIDIA,C for Graphic,与HLSL极相像,根据平台不同可编译成对应的中间语言(跨平台)

Draw Call

CPU调用图像编程接口,命令GPU进行渲染

CPU和GPU如何并行工作

使用命令缓冲区,使二者并行工作
缓冲区中包含一个命令队列

  • CPU添加指令
  • GPU读取指令

二者相互独立工作

Draw Call多了影响帧率

渲染速度快于提交命令的速度,过多的Draw Call导致CPU花费大量时间用在提交Draw Call上,造成CPU过载

如何减少Draw Call

批处理(将许多小Draw Call合并为一个大Draw Call)
适用于静态物体

  • 避免使用大量小的网格(考虑合并)
  • 避免使用过多材质(共用材质)

固定管线渲染

开发者只能进行配置操作(无法完全控制)
将该管线想象成一个控制电路,开发者只能设置电路中各开关的状态,无法控制电路排布
已退出历史舞台(被可编程渲染管线取代)

Shader(着色器)

GPU流水线中一些可高度编程的阶段,由着色器编译出来的最终代码在GPU上运行
有特定类型:顶点着色器,片元着色器
可通过着色器控制流水线的渲染细节

  • 顶点着色器 -> 顶点变换和传递数据
  • 片元着色器 -> 逐像素渲染
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容

  • 一,两个流量概念: 流量,进入你销售漏斗的潜在客户的数量。 流量成本,就是获得一个潜在客户的平均价格。 二,拓展流...
    b9173cba9a70阅读 139评论 0 1
  • 2017年10月20日 星期五 学习时间:580天 学习方法:137累积方法 一、今日学习: 1、《易经》系辞上传...
    静清小舍阅读 296评论 0 1