Device的使用者要准备好顶点数据,也就是一个顶点的数组A。传入device的渲染管线
坐标变换
objectvector 本地坐标 模型坐标
x
viewmatrix 世界坐标 view矩阵
x
projective matrix 视口(裁剪空间) 透视矩阵 or
orthogonal matrix 正交矩阵
然后除以顶点w分量透视除法 正交矩阵已经是一个立方体了 w分量=1 透视除法不会对顶点产生影响
用
齐次除法
vector4中w分量是用来区分 是否要透视除法的
然后除以顶点w分量透视除法 这样就从视锥变成里一个立方体 得到屏幕空间
用处 判断顶点是否在视锥内
透视矩阵后 的vector4 用 -w<= x,y,z <=w 来判断是否在视锥内
opengl里 是【-1,1】的值 directx里z分量范围是 0,1
unity用的opengl的 这套
从裁剪空间到屏幕空间是底层帮助完成的
得到新的顶点数据
处理掉渲染的顶点
顶点被组织成一个个三角形,然后对这些三角形进行裁剪(利用顶点数据里包含的那一个透视空间的位置),
背面剔除(注意背面剔除和顶点的法线是没关系的)
处理后
屏幕空间
这样就从视锥变成里一个立方体
unity屏幕空间 左下角是0
cg cpos是hlsl对屏幕坐标的语意 wpos 是cg对屏幕坐标的语意
dx10以后 像素坐标的中心被定为0.5
光栅化
对数据中每一个三角形,在屏幕空间找出它们在屏幕上覆盖的像素 (一个三角形覆盖的像素的数量有可能是很多的),对于每一个像素,
根据它在三角形中的位置,通过三角形的顶点进行线性插值,计算出一个像素数据(注意像素 数据是通过三角形的顶点数据插值而来,
所以它们的数据类型是一致的,在这个阶段里,三角形的数 组变成了像素数据数组)
stencil test
(根据stencilbuffer上的值)和z-test(根据这个像素的Z值和z-buffer上的值进行比较),根据测试结果会对stencil buffer进行一些修改
(使用一组render state来控制这个过程)
pixel shader
device对每个像素数据进行处理
alpha test
(根据像素的alpha 值),alpha test是最后一个test了,通过了alpha test的像素可以保证绘制到屏幕上去,通过test的像素会把它们的z值
更新到z-buffer中去(具体由一组render state控制),通过test的像素被存入数组G
混合
把算出来的画面颜色数据和屏幕上已有的像素进行混合,具体混合的方式有多种多样,由一系列render state进行控制.混合以后的像素就被
"画"到屏幕上了