Skip to content

变换和光照

网格数据提交到API之后,接下来就是变换和光照(常用T&L表示)。这个阶段包含大量顶点级别的计算,常见的操作如下:

  • 物体空间顶点位置变换到裁剪空间
  • 使用光照设置及法向量计算光照
  • 根据顶点位置计算顶点几雾浓度
  • 阶段式产生纹理裁剪坐标
  • 在骨骼动画中,用skinning技术计算顶点值

当然,渲染上下文、提交数据不同,有些操作也不会执行

变换到裁剪空间

空间之间的转换常用矩阵乘法实现,转换顺序如下:

  • 将模型从模型空间转换为世界空间
  • 从世界空间转换到摄像机空间
  • 从摄像机空间转换到裁剪空间
vclip=vmodel(Mmodelworld)(Mworldcamera)(Mcameraclip)

实际上,变换矩阵是已经连接好的,可能是一个矩阵或两个矩阵

顶点光照

理想情况下应该使用Phong着色,但是实际中使用最多的是Gouraud着色。由于mdiff不是一个顶点级材质属性,它的值通常由纹理定义,因此无法直接使用光照合成公式

mamb=mdiff

因此我们做一下变换,分离出mdiff

clit=j=1n(ij(max((n·hj),0)mglssjspecmspec+max((n·lj),0)sjdiffmdiff))+gambmamb=(j=1n(ijmax((n·hj),0)mglssjspec)mspec+(j=1nij(max((n·lj),0)sjdiff))mdiff+gambmdiff=(j=1n(ijmax((n·hj),0)mglssjspec)mspec+(gamb+j=1nij(max((n·lj),0)sjdiff))mdiff

那么对于每个顶点,有

  • vdiff表示环境和散射分量
vdiff=gamb+j=1nij(max((n·lj),0)sjdiff)
  • vspec表示镜面分量
vspec=j=1n(ijmax((n·hj),0)mglssjspec

于是有

clit=vdiffmdiff+vspecmspec

其中mspec经常为常数

应使用哪个坐标空间计算光照?可以在世界空间中进行