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 的图象引擎是什么公司做的啊?re: 对WoW Shader文件的分析
嗯,是他们自己开发的引擎.re: 对WoW Shader文件的分析
大哥,我BT了一个<鬼武者3 PC版>的游戏,,,,这游戏的模型非常不错,是日本鬼子做的,
主角还是金城武的模型呢!
我很想把里面的模型搞出来做DEMO ,
看了一下里面的文件封装得很简陋,全是。LDT的
音乐文件都可以真接用WinAMP播放,
有许多纹理文件都可以用ACDsee直接打开,
我想请大哥出马,帮忙分析下日本鬼子模形文件。
这是BT种子,我就下的这个
re: 对WoW Shader文件的分析
to Ori你在这里找苦力来了?
re: 对WoW Shader文件的分析
分析模型,解放资源都是Linghuye老大的乐趣、爱好,何苦之有?我也非常想做这些,虽然自已技术浅薄,但乐此不彼!
re: 对WoW Shader文件的分析
我得 wowmapview 编译不通过,没有SDL,不知道什么地方可以下载,或者可以给我一个马?谢谢 inversewalking@133sh.com我是上次向你请教水平裁减的那个。
万分感谢!
re: 对WoW Shader文件的分析
就是SDL_opengl.h没有,re: 对WoW Shader文件的分析
需要的SDL包可以在 下载,要下载Source Code包.wowmapview中的SDL/SDL.h,SDL/SDL_opengl.h,都在SDL包中的 include目录中,
复制一个到wowmapview工程目录下并改名为SDL目录即可,需要的lib,dll可以用包中VisualC.zip里的vc工程文件编译生成.
re: 对WoW Shader文件的分析
如果针对不同的纹理层数设计不同的pass,那就是说WOW的地形确实是按chunk来渲染的?那DP调用会不会太多了?而且要不停的切换纹理……re: 对WoW Shader文件的分析
我的意思是,如果按纹理来渲染,就是说对于当前每种可见的纹理都渲染一次,每次渲染都提供一张该纹理对应的alpha图(第一层不需要),当然这样就要求运行时把每种纹理对应的mesh组织好。这样渲染的优点是DP调用少,多少种纹理就多少次DP调用,而且不用频繁切换纹理;缺点是多层纹理重叠的象素实际上被渲染了多次,而且大部分顶点也都要被处理多次……说的我自己都没底气了,到底密集细碎的DP调用能多大程度影响效率这个我也没有经验,回头试一试。WOW基本是没有LOD的(最多可以有两级好象),如果使用LOD的话,那么最坏的情况下对于远处的一个chunk可能一个DP调用只绘制了两个三角形,想起来就相当不爽
re: 对WoW Shader文件的分析
问下什么是DP?切换显存中的压缩纹理,我以为消耗不大,不用每次都下载.
重要的是按每种可见的顺序是有要求的,不是简单的纹理都渲染一次,达不到最终要渲染的效果,一个chunk的每层纹理叠加权重累加.
不知道按当前每种可见的纹理都渲染一次,且不按chunk来渲染,如何作到这点?
另外我以为实践中应该避免的似乎是"而且大部分顶点也都要被处理多次".
re: 对WoW Shader文件的分析
DP可能是DrawPramitive函数, D3D的re: 对WoW Shader文件的分析
对,DP就是指d3d的DrawPrimitive(DrawIndexedPrimitive)。按纹理不按chunk渲染,具体说就是对于每种纹理,都把用到该纹理的chunk的顶点都拼成一个大vertex buffer(或index buffer),用一张alpha图(实际上只需要一个通道)来控制该层纹理在每个顶点位置的混合权重。这样对每层纹理渲染一次就得到最终的结果了。
re: 对WoW Shader文件的分析
这只是我初步的考虑,还没有实践过。我会把两种方案都试一下,哪种效率高应该很容易判断。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.
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
re: 对WoW Shader文件的分析
不好意思我这里说的都是d3d的东西,OGL没有用过不过应该也有类似的概念吧re: 对WoW Shader文件的分析
我后来看了一下WOW地形渲染bls文件,之前都是用HLSL,汇编形式的看的比较吃力,不过还是看明白了。我认为你看的不够仔细,alpha图的x,y,z通道分别对应第1,2,3层纹理的alpha权重(如你所说,和叠加顺序有关),w通道应该是阴影值(1为阴影,0为正常),而且能看出最终屏蔽了阴影中的高光,保留了70%的diffuse亮度。
re: 对WoW Shader文件的分析
To 平民程序,我和你的理解是完全一致的,也实现了类似的室外地形。这里有一点点细微的差别,就是wow也许是把Blend Factor保存在了贴图中,然后在PS里面Sampler,而我是直接增加了一个Vertex stream, 保存float4 的alpha值,使用TEXCOORD1的语意,让顶点渲染引擎直接进行插值。
楼主我很想和你交个朋友,我人在上海。
re: 对WoW Shader文件的分析
lol can't read nothingall is chinese :(