老久没更新,发点吧,让前面一篇降下去。

 

    * 在D9下,SetStreamSource/DrawIndexedPrimitive,这几个参数的意思,久了经常忘记。
    OffsetInBytes: 设置VB的数据从哪一个位置开始,即IB里的第0个顶点,从这个地址开始算起。
    BaseVertexIndex: IB里的每个索引,加上这个数值,比如设置了2,则IB里的5会变成7。。。不太常用,但有时候会有意想不到的作用。
    MinVertexIndex: 告诉D3D,使用到的顶点从VB里的第几个开始,设置之后,对渲染无影响,只是帮助D3D在某些时候改进性能。。。
    NumVertices: 告诉D3D,本次DP,用了多少个顶点,设置之后,对渲染无影响,要注意的是这个跟MinVertexIndex没啥关系,并不是从MinVertexIndex开始算起的,只是帮助D3D在某些时候改进性能。。。
    startIndex: 与OffsetInBytes类型,设置IB的数据从哪一个开始读起。

 

    * Cry的地形并不是用一张图来算每一层的Alpha,而是用顶点中的color的256级来表示,每一个数值表示一个层。因此它不能表示半透明的层,只能在边缘1格的地方由1降到0。

 

    * D3DFORMAT MAKEFOURCC('N', 'U', 'L', 'L')格式的Target并没有必要设置成1x1(cry中是这么搞的)的大小。这个target无论多大,都不会消耗显存,并且draw的时候写入的像素也是0,速度也没啥变化。

 

    * 简易骨骼动画:

    Mesh当前帧顶点 = Mesh绑定时顶点 * 绑定时骨骼的变换到本帧骨骼的变换的改变量。

                           = Mesh绑定时顶点 * 绑定时骨骼的变换的逆矩阵 * 本帧的骨骼变换。

                           = Mesh绑定时顶点 * 绑定时骨骼的变换的逆矩阵 * 本帧的骨骼相对父节点的变换 * 本帧父骨骼的变换。

    其中,

    Mesh绑定时顶点:由Max导出。

    绑定时骨骼的变换的逆矩阵:从Max的Skin Modifier的GetBoneInitTM中取得(或者Physique Modifier的GetInitNodeTM中取得)矩阵。

    本帧的骨骼相对父节点的变换:从Max的骨骼的NodeTM和父骨骼的NodeTM得到,注意对于行矩阵,矩阵顺序是 ParentToChild = ChildToWorld * Inverse(ParentToWorld)。列矩阵则相反,根节点则直接保存NodeTM即可。帧之间的插值也主要是对这些数据做插值,在两帧之间没有很大变化的时候,四元数加向量和矩阵视觉上并没有很大差别。

    本帧父骨骼的变换:由前面从根节点累加。

 

    * deferred shading中light画volume的简单方法。
    眼睛在volume外,用CCW直接画volume;眼睛即将进入volume或在volume中时,用CW画,并且将volume轻微放大一些包含住camera。除了修改下cullmode,渲染流程完全不用变。

 

    * CSM中,如果shadowmap用atlas放到一张图中的时候,比如4个slice放到一张图的时候,计算shadow receive时,可以用一张很小的(64x64)的图,来选择slice的UV。比直接计算快。