渲染管线学习总结
如果你想学习,请去读Cg教程那本书吧,那才是正道。此文是总结使用的。
简单的流水线:输入顶点>顶点变换----(加上顶点连接信息)>图元装配(产生各种图元,三角形,线段,点)------>光栅化(产生片段)------->片段纹理映射和着色(插值贴图着色)------>光栅化操作-------->丢弃或更新像素
我预估:顶点shader作用在顶点变换阶段,可以替换掉顶点变换中部分流程,片段shader作用在光栅化后的2个阶段,影响纹理映射、片段着色和控制一些光栅化操作。但具体如何还需看文档后面。
1.每个顶点除了有效地位置信息外,还有一些其他属性,比如颜色、第二颜色(反射)、一个或多个纹理坐标集和一个法向量,法向量专门用来计算光照的。
2.顶点变换是流水线的第一个处理阶段。它在每个顶点上执行一系列数学操作,这些操作包括把顶点从原先位置(模型坐标系)变换到屏幕上给光栅使用、为贴图产生纹理坐标、照亮顶点来决定它的颜色(这些在后续会详细介绍)。
3.图元装配和光栅化。光栅化的结果是得到像素的位置集合和片段的集合。这里要区分一下像素和片段:
1.像素代表帧缓存中某个指定位置的内容,包括该位置的颜色、深度和其他和这个位置相关联的值。
2.片段:是更新一个特定像素 潜在需要的一个状态,可以把它看做是潜在的像素,它包括和一个像素相关联的位置、深度和其他经过插值的参数值,一个片段需要通过一系列测试(光栅化操作),如果通过了则用它来更新对应位置像素的信息,不通过则废弃,所以是潜在的像素,未来的排长。
4.插值、贴图、着色:这个阶段执行一系列贴图操作和数学操作(具体细节不清楚,是整体操作还是每个片段操作,等后面介绍),并为每个片段确定最终的颜色值和一个新的深度值(干啥呢?不懂),这个时候可以丢弃片段(我怀疑discard指令就是这里做的)。所以这个阶段就是为每个片段产生一个着过色的片段或不产生片段。
PS:片段被抛弃有裁剪、挑选、程序丢弃、各种测试。
裁剪其实一般是指图元装配后,不在可视平截体内的图元被抛弃,一半在内一半在外的生成新的图元,即部分抛弃,这个过程;
但除了这个裁剪外,还有背面朝向的图元会被抛弃(称为挑选culling,和裁剪同时期执行,如果Cull Front则抛弃前面朝向的);
程序丢弃,比如discard命令,这个发生在片段着色器阶段;
各种测试,比如alpha测试,深度测试等,不通过就被抛弃,这个发生在片段着色器之后,一般通过类似“配置”“声明”的方式控制,这里放一个模板测试的链接:
http://blog.csdn.net/u011047171/article/details/46928463
陆陆续续看完了,但收获一般般呐,不过对profile有了一些认识,所以我又滚去看real-time rendering 3rd(英文)+2rd(中文)了,到时候一并总结了吧。
这里有一个大佬开源了他写的软光栅器:
http://www.cnblogs.com/wantnon/p/4894980.html
里面包括了顶点变换、裁剪、光栅化的实现,我看了里面的实现,结合之前学的理论知识,心里确实踏实了一点,感兴趣的可以看一下,理论方面可以参考Twinsen的系列文章:推导相机变换矩阵,推导透视变换矩阵、光栅化的过程:透视纹理映射。