https://blog.csdn.net/poem_qianmo/article/details/41923661
浅墨大神讲渲染管线的,下面偷一张图
流水线
图元:点、线、多边形。(primitives)
片元:二维图象上每个点都包含了颜色、深度和纹理数据。将该点和相关信息叫做一个片元(fragment)
大概流程: 顶点着色器 >> 图元装配 >> 几何着色器 >> 光栅化 >> 片元着色器 >> aplha混合
硬盘 -> CPU -> RAM ->显卡
http://candycat1992.github.io/unity_shaders_book/unity_shaders_book_images.html
- 几何阶段
- 光栅化阶段
Draw Call
是一个命令 发起方是CPU,接受方是GPU
提交大量很小的Drawcall会造成cpu性能瓶颈
减小Drawcall开销
- 避免使用大量很小的网格。尽量合并他们
- 避免使用过多的材质。尽量在不同的网格之间公用同一个材质
FallBack
如果所有的subshader都使用不了 那么就使用最低级的unity shader
空间变换
模型空间 | 世界空间 | 观察空间 | 裁剪空间 | 屏幕空间 |
---|---|---|---|---|
local space | 摄像机空间 | 正交投影 | ||
透视投影 | ||||
视椎体 |
OpenGL 对象
帧缓冲对象FBO 相当于Unity 的RenderTexture,FBO可以让不渲染到屏幕当中去,而是渲染到离屏的buffer中
关于Clip
问答
问: 请说明深度测试的作用和在渲染流水线的实施位置?
答: 在现代的渲染流水线中,深度测试执行在每个片元着色器程序被调用之前,深度测试失败,则丢弃该片段,原因是片元着色器程序,是GPU上的主要瓶颈,而深度测试可以避免不必要的昂贵的片元着色器的程序调用。
问:以OpenGL为例,说出片元处理程序阶段做的处理?
答:处理对象是,把三角面经过光栅化得到的一个个小格子(像素),
在像素真是使用pixelshader前,需要对于这个像素进行一系列测试。
模板测试(更好的翻译是为蒙版测试)->深度测试(这里之前测试通不过就都被抛弃)->片元着色器->alpha混合。如何处理光、阴影、遮挡、环境等等对物体表面的影响,最终生成一副图像的小程序。