前言
游戏开发肯定是离不开渲染的,也是算在进行到深入开发不可避免的一个模块。
渲染分类
- 离线渲染
渲染一帧需要较长的时间,多用于电影,动画CG的渲染 - 实时渲染
能够保证每秒渲染23帧以上,用于需要实时同步的领域,如游戏(30-60),VR设备(90)等
2D渲染介绍:场景由2D图片或像素块组成,如:超级玛丽,DNF
3D渲染介绍:场景由3D模型构成,如:魔兽世界,英雄联盟。
卡通渲染(LOL)
3D网格
顶点数据
- 位置坐标数据
- 颜色数据
- 法线数据
例如正方体,每个顶点的法线数据,是其相邻三个面法线的平均值 - 骨骼权重数据
- 贴图UV数据
MipMap 比较远用小图,近距离用大图
材质
塑料、布料、毛发...
图形API
-
DX(着色语言:High Level shading language)
- DirectX(只能用于Windows)
-
OpenGL(GL Shading Language)
顶点着色器(Vertex)和片段(Fragment)着色器
渲染管线介绍
Vertex Shader
- 顶点变换...根据模型视图和投影矩阵变换
- 光照计算:法线变换(法线矩阵 是模型矩阵的左上角3*3的逆矩阵和法线规格化)
- 纹理坐标变换(纹理矩阵)
- 光照(每个顶点在这个阶段分别是单独处理的)
- 这个阶段所接收到的数据则是每个顶点的属性特征,输出则是变换后的顶点数据。
图元装配
Fragment Shader
在这一阶段对片元着色器输出的每一个片元进行一系列测试与处理,从而决定最终用于渲染的像素。
Pixel ownership test:该测试决定像素在framebuffer中的位置是不是为当前OpenGL ES所有。也就是说测试某个像素是否对用户可见或者被重叠窗口所阻挡
Scissor test:裁剪测试,判断像素是否在由glScissor定义的裁剪矩形内,不在该剪裁区域内的像素就会被裁剪掉。
Stencil test:模板测试,将模板缓存中的值与一个参考值进行比较,从而进行相应的处理。
深度测试
Framebuffer
这是流水线的最后一个阶段,FrameBuffer中存储着可以用于渲染到屏幕或纹理中的像素值,也可以从FrameBuffer中读回像素值,但不能读取其他值(如深度值、模板值等)
人物的渲染:分开绘制
换装需求与材质的不同
场景渲染
- 光照
- 全局光照
- 阴影
- 扭曲
- 上帝光线(God Ray)
后处理(图片处理)(所有的数据渲染完,就是一张图片,然后对该图片进行处理)
- 屏幕空间AO
- 景深效果(根据深度图)
- 模糊,辉光
实操
Unity
Properity
SubShader
Pass
CG