对WoW Shader文件的分析

Wow的渲染引擎是同时支持固定渲染管线渲染和Shader渲染管线渲染的.
bls文件是wow的shader文件,分析它的实现可以学习引擎是怎样渲染的,以及如何做一个兼容固定管线和Shader管线的引擎.

bls里存储的是OpenGL low-level shading language的指令,terrain1.bls,terrain2.bls,terrain3.bls,terrain4.bls分别对应渲染一块具有1/2/3/4层的纹理地形.terrain1_s.bls,terrain2_s.bls,terrain3_s.bls,terrain4_s.bls分别对应渲染带高光反射的地形,其对应使用的是带有_s的地形纹理.

虽然shader可以按任何算法和顺序来混合使用各层纹理,但Wow的shader的使用仍受限于与固定管线的兼容,使用ARBfp1.0标准,仍然是按标准纹理层次先后叠加.从使用的纹理可以看出,
layer0Texture,layer1Texture,..,,blendTexture,其中blendTexture的每一个分量都是一个Alpha图,

地形块为3层纹理时,第一层直接渲染不需要Alpha图,第2,3层各需要一张Alpha图,即共需2张Alpha图,这2张Alpha图存储在BlendTexture的x,w分量上.
使用4层纹理时,使用BlendTexture的x/y/w作3张Alpha图.
由于最多有4层地形纹理,BlendTexture的z就剩下来作为阴影图使用,完成了整个地形块的Shader.

posted on 2006-02-21 20:26 linghuye 阅读(2332) 评论(20)  编辑 收藏 引用 所属分类: 3D图形学研究

评论

# re: 对WoW Shader文件的分析  回复  更多评论   

wow 的图象引擎是什么公司做的啊?
2006-03-03 15:49 | Ori

# re: 对WoW Shader文件的分析  回复  更多评论   

嗯,是他们自己开发的引擎.
2006-03-03 20:05 | 平民程序

# re: 对WoW Shader文件的分析  回复  更多评论   

大哥,我BT了一个<鬼武者3 PC版>的游戏,,,,

这游戏的模型非常不错,是日本鬼子做的,

主角还是金城武的模型呢!

我很想把里面的模型搞出来做DEMO ,

看了一下里面的文件封装得很简陋,全是。LDT的

音乐文件都可以真接用WinAMP播放,

有许多纹理文件都可以用ACDsee直接打开,

我想请大哥出马,帮忙分析下日本鬼子模形文件。

http://dl2.www2.btchina.net/download.php?s=b93561e4b5ada269&attachmentid=589803

这是BT种子,我就下的这个





2006-03-04 12:27 | Ori

# re: 对WoW Shader文件的分析  回复  更多评论   

to Ori
你在这里找苦力来了?
2006-03-06 09:48 | kokk

# re: 对WoW Shader文件的分析  回复  更多评论   

分析模型,解放资源都是Linghuye老大的乐趣、爱好,何苦之有?

我也非常想做这些,虽然自已技术浅薄,但乐此不彼!
2006-03-06 10:15 | Ori

# re: 对WoW Shader文件的分析  回复  更多评论   

我得 wowmapview 编译不通过,没有SDL,不知道什么地方可以下载,或者可以给我一个马?谢谢 [email protected]
我是上次向你请教水平裁减的那个。
万分感谢!
2006-03-09 18:13 | zeng

# re: 对WoW Shader文件的分析  回复  更多评论   

就是SDL_opengl.h没有,
2006-03-09 18:14 | zeng

# re: 对WoW Shader文件的分析  回复  更多评论   

需要的SDL包可以在 http://www.libsdl.org/index.php 下载,要下载Source Code包.

wowmapview中的SDL/SDL.h,SDL/SDL_opengl.h,都在SDL包中的 include目录中,
复制一个到wowmapview工程目录下并改名为SDL目录即可,需要的lib,dll可以用包中VisualC.zip里的vc工程文件编译生成.
2006-03-09 19:11 | 平民程序

# re: 对WoW Shader文件的分析  回复  更多评论   

如果针对不同的纹理层数设计不同的pass,那就是说WOW的地形确实是按chunk来渲染的?那DP调用会不会太多了?而且要不停的切换纹理……
2006-05-20 16:04 | ZERO

# re: 对WoW Shader文件的分析  回复  更多评论   

我的意思是,如果按纹理来渲染,就是说对于当前每种可见的纹理都渲染一次,每次渲染都提供一张该纹理对应的alpha图(第一层不需要),当然这样就要求运行时把每种纹理对应的mesh组织好。这样渲染的优点是DP调用少,多少种纹理就多少次DP调用,而且不用频繁切换纹理;缺点是多层纹理重叠的象素实际上被渲染了多次,而且大部分顶点也都要被处理多次……说的我自己都没底气了,到底密集细碎的DP调用能多大程度影响效率这个我也没有经验,回头试一试。

WOW基本是没有LOD的(最多可以有两级好象),如果使用LOD的话,那么最坏的情况下对于远处的一个chunk可能一个DP调用只绘制了两个三角形,想起来就相当不爽
2006-05-20 16:21 | ZERO

# re: 对WoW Shader文件的分析  回复  更多评论   

问下什么是DP?
切换显存中的压缩纹理,我以为消耗不大,不用每次都下载.
重要的是按每种可见的顺序是有要求的,不是简单的纹理都渲染一次,达不到最终要渲染的效果,一个chunk的每层纹理叠加权重累加.
不知道按当前每种可见的纹理都渲染一次,且不按chunk来渲染,如何作到这点?
另外我以为实践中应该避免的似乎是"而且大部分顶点也都要被处理多次".
2006-05-21 12:11 | 平民程序

# re: 对WoW Shader文件的分析  回复  更多评论   

DP可能是DrawPramitive函数, D3D的
2006-05-22 09:11 | fannyfish

# re: 对WoW Shader文件的分析  回复  更多评论   

对,DP就是指d3d的DrawPrimitive(DrawIndexedPrimitive)。
按纹理不按chunk渲染,具体说就是对于每种纹理,都把用到该纹理的chunk的顶点都拼成一个大vertex buffer(或index buffer),用一张alpha图(实际上只需要一个通道)来控制该层纹理在每个顶点位置的混合权重。这样对每层纹理渲染一次就得到最终的结果了。
2006-05-22 15:43 | ZERO

# re: 对WoW Shader文件的分析  回复  更多评论   

这只是我初步的考虑,还没有实践过。我会把两种方案都试一下,哪种效率高应该很容易判断。
2006-05-22 15:48 | ZERO

# re: 对WoW Shader文件的分析  回复  更多评论   

我认为按纹理渲染不是效率上的问题,而是我怀疑根本做不出wow中的地形纹理混合的效果.我所知道的渲染公式是 (A * (1-a1) + B * a1)) * (1-a2) + C * a2,不是A * a0 + B * a1 + C * a2这种简单的权重混合.
我曾经想过按材质分类渲染,结论是不可行,只能尽可能减少纹理材质切换,但不能完全按材质分类渲染.
wow的alpha层数据是依附于每个chunk给出的,所以按chunk渲染是比较自然地,减少材质切换的优化建立在以chunk为渲染单位上,即归类具有相同层数,使用相同shader,使用相似纹理的chunk.

不过,期待你的实践.

// 顺便说一下,不喜欢DP这样的缩写,我用OpenGL,比较喜欢VBO,PBO,RTT,:),just joking.
2006-05-22 23:28 | 平民程序

# re: 对WoW Shader文件的分析  回复  更多评论   

我之前已经实现了。
方法是渲染每层细节纹理时都提供两个texturestage给显卡:stage0是alpha图(也就是只用到该图的alpha通道,如果用可编程管线实际上最多可以把4层alpha塞到一个alpha图里),对于这一层,COLOR取CURRENT,ALPHA取TEXTURE;stage1是纹理本身,COLOR取TEXTURE,ALPHA取CURRENT。之后在帧缓存里把这一层纹理和前面的结果混合:SRCBLEND设为SRCALPHA,DESTBLEND设为INVSRCALPHA。也就是说对于每一层纹理都是:Res_n = Cur_n-1 * ( 1 - alpha_n ) + color_n * alpha_n
2006-05-23 14:04 | ZERO

# re: 对WoW Shader文件的分析  回复  更多评论   

不好意思我这里说的都是d3d的东西,OGL没有用过不过应该也有类似的概念吧
2006-05-23 14:05 | ZERO

# re: 对WoW Shader文件的分析  回复  更多评论   

我后来看了一下WOW地形渲染bls文件,之前都是用HLSL,汇编形式的看的比较吃力,不过还是看明白了。

我认为你看的不够仔细,alpha图的x,y,z通道分别对应第1,2,3层纹理的alpha权重(如你所说,和叠加顺序有关),w通道应该是阴影值(1为阴影,0为正常),而且能看出最终屏蔽了阴影中的高光,保留了70%的diffuse亮度。
2006-05-30 17:00 | ZERO

# re: 对WoW Shader文件的分析  回复  更多评论   

To 平民程序,
我和你的理解是完全一致的,也实现了类似的室外地形。这里有一点点细微的差别,就是wow也许是把Blend Factor保存在了贴图中,然后在PS里面Sampler,而我是直接增加了一个Vertex stream, 保存float4 的alpha值,使用TEXCOORD1的语意,让顶点渲染引擎直接进行插值。

楼主我很想和你交个朋友,我人在上海。
2007-07-09 18:23 | Jackwolf

# re: 对WoW Shader文件的分析  回复  更多评论   

lol can't read nothing

all is chinese :(

你可能感兴趣的:(sha)