Archive

Archive for May, 2006

WOW的地形渲染

May 30th, 2006 No comments

魔兽世界的地形渲染,基本上有三种渲染路径:固定渲染管线(其中是不是又分几种就不清楚了);shader(带高光);shader(不带高光)

用到shader的渲染路径又分别针对1层,2层,3层,4层(最多允许每个chunk使用4层纹理)专门写了shader代码。

用MyWarCraftStudio打开WOW的misc.mpq包,shader \ pixel \ 目录下以”terrain”打头的bls文件就是地形渲染使用的shader,带有”_s”后缀的是带高光的渲染,否则就是不带高光的。

我仔细看了其中的terrain4_s.bls(用UltraEdit之类的工具可以直接当成文本文件打开)。是汇编形式的ps代码,由于之前俺只用过HLSL所以看起来有点吃力,好在还是看明白了。

texture0~3就是待混合的4层纹理,每层纹理的a通道是该层纹理对应的高光通道;texture4是一张用来控制混合权重的alpha纹理。texture4的r,g,b通道分别对应texture1~3的alpha值,而texture4.a则代表地形的阴影,0为阴影,1为正常。

Read more…

Categories: 程序/算法 Tags: ,

法线映射基本原理和相关的顶点数据压缩

May 22nd, 2006 No comments

输入到固定渲染管线的顶点结构虽然可以定制,但也不是完全自由的,比如顶点位置必须是float3,纹理坐标float2,法线float3等等。如果使用可编程管线,由于VS的输入可以自由解析,所以相对来说就增加了很多灵活性。

在使用切线空间的法线映射(normalmap)时,一般来说顶点数据中除了法线向量外还需要加入tangent向量和binormal向量信息,以便在VS中计算切线空间变换矩阵。其中tangent是切平面上纹理坐标u的正方向,binormal是切平面上纹理坐标v的正方向。normal,tangent和binormal三者互相垂直,构成了切线空间坐标系,于是切线空间到世界空间的变换矩阵就是 float3x3( tangent, binormal, normal )

法线映射的实现一般来说有两种:

1。在vertex shader中计算出切线空间变换矩阵(如上文所述),并将该矩阵输出。在pixel shader中用得到的矩阵将法线图中采样得到的切线空间的法向量变换到世界空间,然后再进行后续的光照计算。

2。同样在vertex shader中计算出切线变换矩阵,但不输出,而是在VS中将光线方向逆向变换到切线空间,将切线空间的光线方向输出。在PS中所有的计算都在切线空间进行。

Read more…

Categories: 程序/算法 Tags: ,

世界空间的法线映射

May 22nd, 2006 No comments

最近一直在研究地形相关的东西,其中一个问题就是地形在经过了LOD处理之后,顶点光照变得不再适用。因为patch的LOD级别变化时,一些顶点会突然出现或消失,如果采用顶点光照,pop顶点附近的亮度就会发生突然的改变,看起来很不自然;另一个缺点是视野中远处的地形会缺乏光照细节,因为顶点很少。

于是就考虑使用一个法线图来计算光照,分辨率只需要每地形格一个象素,可以根据顶点坐标事先处理好。这样在近处就能有和顶点光照同样的细节度,而远处不论mesh的精度有多低,光照细节始终保持不变。地形本身不会运动,所以这种法线映射可以是世界空间的,也就是说省去了切线变换等计算(关于切线空间法线映射的原理可以看前一篇文章),在PS中采样到的法线已经是世界空间的向量,可以直接拿来计算光照,这样也不用写VS了。另外由于使用了法线映射并且不需要计算切线变换矩阵,顶点数据中就不需要附带法线信息了。

Read more…

Categories: 程序/算法 Tags: , ,

搞了一把perez-670

May 8th, 2006 No comments

下午早退一小时跑到吉他中国去(老板应该不知道这里吧,嘿嘿),弹了一把650一把670(630也试了一下但马上被淘汰);大约弹了一个小时,终于说服自己670的声音的确比650好(差3000多块啊:`( ),据卖琴的人说那把650是近年少见的白松面板所以音质直逼670,但我觉得高音的延展还是明显差一些。

早就听说吉他中国做生意比较实在,所以就问了一下能不能优惠点,对方态度十分坚决地回答说能,然后直接报了底价。我一看kao这么爽快也不甘示弱说除了网站上说的赠品能不能再送点啥,于是他又拿出两张cd说挑一张。我有点不好意思又另外掏钱买了一套带vcd的谱子。

晚上拍的,光线比较暗而且摄影技术也比较烂

IMG_2238

Read more…

Categories: 音乐 Tags:

基于patch的地形PVS数据预处理(下)

May 7th, 2006 No comments

前面一篇说了pvs数据的预处理,当时是用纯CPU来计算patch之间的可见性。后来听说有个IDirect3DQuery9接口可以判mesh的可见性,就试了一下,果然比用纯粹CPU计算快了很多。计算同样的512地图的pvs数据,原来的算法需要4.7小时,利用GPU之后缩短到了不到800秒,快了大约20倍。更重要的是从不同尺寸地图的pvs预处理得到的大致算法复杂度估计从原来的 n ^ log_2( 48 ),降低到 n ^ log_2( 16 )。另外,新的算法在误差上比原来要少很多,只发现几处距离较远的patch有几个象素的跳变,可能是因为预处理用的表面较小(640×480)并且视角较大(pi / 3,实际游戏使用 pi / 4)

Read more…

Categories: 程序/算法 Tags: ,