??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产综合久久天堂,伊人久久大香线蕉AV色婷婷色,亚洲国产日韩欧美综合久久http://www.shnenglu.com/flashboy/------3D游戏研发zh-cnTue, 06 May 2025 22:28:50 GMTTue, 06 May 2025 22:28:50 GMT60MMORPG游戏服务器框架的可行性报?(提高生效率)http://www.shnenglu.com/flashboy/archive/2010/07/09/119837.htmlRedLightRedLightFri, 09 Jul 2010 02:45:00 GMThttp://www.shnenglu.com/flashboy/archive/2010/07/09/119837.htmlhttp://www.shnenglu.com/flashboy/comments/119837.htmlhttp://www.shnenglu.com/flashboy/archive/2010/07/09/119837.html#Feedback2http://www.shnenglu.com/flashboy/comments/commentRss/119837.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/119837.html
在Linux上,古老的Linux CE序员一般会采用一个文本编辑工P比如QVI{,׃我以前是在windows下生zȝQ对VS.netq一cȝ工具颇ؓ喜爱Q它的开发方便快P又有开发辅助插件的支持Q你可以尽情用智能提C,快捷键,代码模板{高效生产代码。可以说~码更多的是依靠可视化工h错,快速蟩转代码等。反正我的意思就是开发相当愉悦。但Linux下的CE序员则不然Q我也曾l问q他们ؓ什么要采用VI{编辑工h~代码,首先Q他们给到我的第一{案?专业", 其实我也不太懂他们说的专业是什么,是传l意义上的,q是习惯性必ȝQ然后他们说Q?#8220;使用makefile文g来编译代码很爽,速度很快”Q这一Ҏ是赞同的Q但有个问题是程序员的入门门槛比较高Q要求大安要会q东西,q是ȝQ从HR招聘处可以看刎ͼ本来投C++E序员的人就比较了Q因为C++应用的领域基是应用YӞ游戏啊,电信啊,q是一些MFC界面性的东西Q而且要求功底比较好,实有时候招是挺隄Q更不用说还要有Linux开发经验的Z。最后,我问了linux开发不员说那你们的调试用什么工P他们_“gdb”, 又是一?手打牛肉?Q自我感觉很痛苦Q心里想“Z么有那么先进的工P比方_Eclipse CDTQ?你们不用?”Q其实他们心中也是有{案的,“~码要养成一U好习惯Q而不是依靠于某种工具”Q显然LinuxE序员在~码上大体要比windows上的E序员来得严|也感觉到他们的代码比较有质量。但很显然的Q由于开发环境的布v比较ȝQ对于大规模生是否能够每个人都有那么高素质的编E能力,那就是个"?Q?----- “猜不?”

针对上面的情况,我也自己分析了一下,软g开发的三大要素是什么,成本Q质量,q度Q?只有q三东西控制得好,那才能控制好目?br>那Y件编E的基础是什么? 当然是调用操作系l的API了,很显然的Q?不同操作pȝ有不同的APIQ除非你有一个跨q_的开发框Ӟ或者叫cd也行?br>接下来Y件架构在不同领域是否通用Q比方说Q通信框架Q很昄的,q是有区别的Q比方说电信pȝ与游戏系l,那显然还是不一L?br>最后,软g~码与接?API)是不是应该更多h常用的,而且Ҏ上手?友好W一Q?Q这h可以减少开发成本及协调工作?br>
ȝ一下,我心中已有答案了Q必采用一U大多数E序员可以接受的Q而且是他们熟悉的Q不要DIY的)Q而且开发速度快速的开发方式那才是真道理?br>以下是我的基本方案:
 

一?span>   跨^?/span>框架的基设施 (lg?/span>)

1.    MySQL数据库操作组?/span>

2.    U程?/span> ?/span> d?/span>

3.    基础数据cdQ容器,内存池,环Ş~冲?/span>

4.    IOCP?/span>Epoll跨^台的面向对象通信框架

5.    集成LuaTinker脚本交互模块{?/span>

 

二?span>   开发方式与调试环境

本框架的初步设想是前期在Windows下?/span>VS.net 2008q行开发调试,争取?/span>Windows下解?/span>80%左右的逻辑错误。之后由ȝ序员把代码移植到LinuxQƈ使用Eclipse CDT可视化开发环境进行后期的调试工作。这样也大大降低招聘人员的知识要?/span>(不用?/span>Linux)Q在某一E度降低了h员成本和加快了开发效率?br>



RedLight 2010-07-09 10:45 发表评论
]]>
MMORPG服务器组集群Ҏhttp://www.shnenglu.com/flashboy/archive/2010/07/09/119830.htmlRedLightRedLightFri, 09 Jul 2010 02:05:00 GMThttp://www.shnenglu.com/flashboy/archive/2010/07/09/119830.htmlhttp://www.shnenglu.com/flashboy/comments/119830.htmlhttp://www.shnenglu.com/flashboy/archive/2010/07/09/119830.html#Feedback2http://www.shnenglu.com/flashboy/comments/commentRss/119830.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/119830.html




 

1.     LoginApp

即登录服务器, 它主要完成玩家帐L验证, 同时它通过BaseAppMgrq向玩家发送一?/span>SessionKey作ؓ基础服务?/span>(BaseApp)的登录密钥;同时LoginServerq向玩家发送服务器列表信息?/span>

2. BaseApp

     卛_服务器, 也称q接服务器,它还l持着一个客Lq接列表(用户列表), q样它可以实现区域消息广播及通过BaseAppMgr实现世界聊天, 玩家信息查看{功能;它还负责消息的分发到CellAppq行处理Qƈ把结果返回到客户端?/span>

3. CellApp

x戏服务器Q它负责世界数据的加载,游戏逻辑的处理及世界对象的管理。在本架构中当ؓ支线服务器?/span>

4. DBMgr

用户服务器,它负责用Lx据的存取。一般是用户d选择角色后就获得角色所有相x据给?/span>MapServer, q由MapServer定时保存角色的相x据?/span>

5. BaseAppMgr

            基础服务器管理器Q主要负责分配基服务器给到客Lq接Q同时它采用某种{略可以实现用户的均衡负载等?/span>

6. CellAppMgr

            支线服务器管理器, 它主要根据支U?/span>ID为基代理对象分配支线服务器实?/span>, q样可以实C客户端的通信了?/span>

7. DB

     数据库服务器主要分ؓ三个库来存取Q?/span>AccountDB为玩家̎户信息,CharacterDB为玩家角色相关信息,WorldDB为所胡的世界数据?/span>



RedLight 2010-07-09 10:05 发表评论
]]>
~程常用快捷?/title><link>http://www.shnenglu.com/flashboy/archive/2009/12/15/103252.html</link><dc:creator>RedLight</dc:creator><author>RedLight</author><pubDate>Tue, 15 Dec 2009 06:12:00 GMT</pubDate><guid>http://www.shnenglu.com/flashboy/archive/2009/12/15/103252.html</guid><wfw:comment>http://www.shnenglu.com/flashboy/comments/103252.html</wfw:comment><comments>http://www.shnenglu.com/flashboy/archive/2009/12/15/103252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/flashboy/comments/commentRss/103252.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/flashboy/services/trackbacks/103252.html</trackback:ping><description><![CDATA[<p>1. 调试快捷?br>2. ~辑快捷?br>3. 代码快捷?br>4. H口快捷?/p> <p><br>Ctrl+Tab 切换~辑ȝ口中的代码选项?/p> <p>Esc键关闭当前的非模式窗?(比方?查找H口, 切误?Alt + F4, q样会连VS.net2005都关?</p> <p>F5: 启动调试<br>Ctrl+F5: 开始执?不调?</p> <p>Shift+F5: 停止调试<br>Ctrl+Shift+F5: 重启调试</p> <p>F7: 生成解决Ҏ<br>Ctrl+U: 生成当前目</p> <p>F11: 独句调试<br>F10: q程调试</p> <p>F9: 打断??取消断点<br>Alt+F9: 昄断点H口</p> <p>F12: 定位到函数的实现?br>???: 定位到函数的声明, 只能用右?-->选择A</p> <p>Shift+Alt+Enter: 切换全屏~辑</p> <p>Ctrl+F: 查找<br>Ctrl+Shift+F: 在文件中查找</p> <p>F3: 查找下一?br>Shift+F3: 查找上一?/p> <p>Ctrl+H: 替换<br>Ctrl+Shift+H: 在文件中替换</p> <p>Ctrl+左右头? 一ơ可以移动一个单?br>Ctrl+上下头? 滚动代码屏幕Q但不移动光标位|?/p> <p>Ctrl+L: 删除当前?/p> <p><br>Ctrl+M,M: 隐藏或展开当前嵌套的折叠状?br>Ctrl+M,L: 所有过E设|ؓ相同的隐藏或展开状?或?右键 + L + O<br>Ctrl+M,P: 停止大纲昄 或者再按一ơCtrl+M,L  或?右键 + L + O</p> <p>Ctrl+G: 转到指定?br>Shift+Alt+头? 选择矩Ş文本<br>Alt+鼠标左按? 选择矩Ş文本<br>Ctrl+Shift+U: 全部变ؓ大写<br>Ctrl+U: 全部变ؓ写</p> <p>//有点隑ֺ?<br>Ctrl+K, Ctrl+C: 注释    <br>Ctrl+K, Ctrl+U: 解除注释</p> <p>Ctrl+Shift+A: d新项<br>//----------------------------------------<br>VAssistX: 操作<br>1. 定义标准的代码段, q设|快捷键<br>2. Alt+M, 再打上函数名的前几个字母, ׃qo掉很多函? 最后按Enter定位到当前文件所查找的函C<br>3. Shift+Alt+O, 查找文g, 输入文g名的前几个字? ׃qo掉很多文? 最后按Enter定位到当前文件所查找的文?br>4. Alt+O: 切换?h?cpp文g<br>5. 右键+查看所有引??VassistX菜单中的Find References, Find References in Files : 查看函数引用的所有地?br>6. Shift+Alt+S: 查找全局变量<br>//----------------------------------------<br>F7: 查看代码<br>Shift+F7: 查看H体设计?/p> <p>Windows?E 打开资源理器?br>Windows?D 昄桌面?br>Windows?M 最化所有被打开的窗口?br>Alt+Tab  切换d栏中的激zȝ?/p> <p><br> </p> <img src ="http://www.shnenglu.com/flashboy/aggbug/103252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/flashboy/" target="_blank">RedLight</a> 2009-12-15 14:12 <a href="http://www.shnenglu.com/flashboy/archive/2009/12/15/103252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WOW地ŞShader分析(?http://www.shnenglu.com/flashboy/archive/2009/12/11/102960.htmlRedLightRedLightFri, 11 Dec 2009 02:04:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/12/11/102960.htmlhttp://www.shnenglu.com/flashboy/comments/102960.htmlhttp://www.shnenglu.com/flashboy/archive/2009/12/11/102960.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/102960.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/102960.htmlSPXG // 标识
// 用到5张图?
{
   blendTexture  = 0
   layer0Texture = 1
   layer1Texture = 2
   layer2Texture = 3
   layer3Texture = 4
}
!!ARBfp1.0
// 定义帔R:
PARAM c[1] = { { 1, 0.30000001, 0.69999999 } };
// 声明3个寄存器:
TEMP R0;
TEMP R1;
TEMP R2;
// 开始؜?
// 一.W?层和W?层用第4张图的x通道作ؓalphaq行混合:
TEX R1, fragment.texcoord[0], texture[0], 2D;
TEX R0, fragment.texcoord[1], texture[1], 2D;
ADD R2, R0, -R1;
// r2=Tex1-Tex0
TEX R0, fragment.texcoord[4], texture[4], 2D;
MAD R2, R0.x, R2, R1;
// r2 = Tex4.x*r2+Tex0
// 说明:
// 其中的Tex4.x是对应第1层alpha? 下面把Tex4.x当a1?br>// ?r2 = a1 * (Tex1-Tex0) + Tex0
// 转换一下即? Tex0*(1-a1)+a1*Tex1, 呵呵,看到了吧,q就是؜合公?
// ?W?层和前面l果使用W?张图的y通道作ؓalphaq行混合:
TEX R1, fragment.texcoord[2], texture[2], 2D;
ADD R1, R1, -R2;
// r1=Tex2-r2
MAD R2, R0.y, R1, R2;
// r2 = Tex4.y*r1+r2, ?a2*r1+r2 = a2*(Tex2-r2)+r2, 即r2*(1-a2)+Tex2*a2, 其中r2x上次0?层؜合后的结?br>// ?W?层和前面l果使用W?张图的z通道作ؓalphaq行混合:
TEX R1, fragment.texcoord[3], texture[3], 2D;
ADD R1, R1, -R2;
// r1=Tex3-r2
MAD R1, R0.z, R1, R2;
// r1=a3*r1+r2 , ?a3*r1+r2 = a3*(Tex3-r2)+r2, 即r2*(1-a3)+Tex3*a3
// q样r1׃存了最l的混合l果
// ?让阴影地表光泽系Cؓ0(Tex4.w即a通道代表地Ş的阴?0为阴?1为正?而每层脓图中的a通道是光泽通道,所以R1.w保存的是最l的光泽通道?:
MUL R0.x, R1.w, R0.w;
// r0.x = r1.w(光泽)*Tex4.w(阴媄? 是阴影则=0,否则=1)
// 计算削减pL?
MAD R0.w, R0, c[0].y, c[0].z; // r0乘上0.3(削减?0Q?再加上一个常?.69999999
// 反射高光 = secondary_color(反射?*光泽:
MUL R0.xyz, R0.x, fragment.color.secondary;
// 贴图最lcolor = 最l脓图؜出的color*削减pL:
MUL R1.xyz, R1, R0.w;
// 贴图最lcolor * primary_color(光照色或是顶点色) + 反射高光:
MAD result.color.xyz, R1, fragment.color.primary, R0;
// alpha:
MOV result.color.w, c[0].x;
END
  
  

本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/flipcode/archive/2008/03/03/2143452.aspx



RedLight 2009-12-11 10:04 发表评论
]]>
RedLight引擎原型初成http://www.shnenglu.com/flashboy/archive/2009/12/05/102609.htmlRedLightRedLightSat, 05 Dec 2009 09:36:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/12/05/102609.htmlhttp://www.shnenglu.com/flashboy/comments/102609.htmlhttp://www.shnenglu.com/flashboy/archive/2009/12/05/102609.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/102609.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/102609.html最q我被安排到一个小l中Q做的项目是一个体感游戏,之前考虑q用ogre开源引擎来做,可惜我对q东西又不熟的,听h家说q要用第三方cdCEGUI, q要配置一些东西,一听头都大了,光学习理想都用半个月了,我们的工E只l两个月的时_唉呀Q算了吧Q自׃是还有些׃八糟的代码可用吗Q狠下决心,军_q它一把!哪怕辛苦一点,做下来一个游戏引擎以后就Ҏq事了?br>l过和另外一个同事两个月的时间奋斗,一路中虽说遇到些困难,也常加班的,目l于也做完了?br>




一个游戏引擎原型基本蛋生了Q我们命名它?RedLightQ它基本实现?br>
(0) Win32E序渲染框架
(1) UI的基本消息交互流E,XMLH体配置理QUI皮肤配置理Q基本的UI控g库,多分辩率无缝UI拼图
(2) 室外场景理
(3) 摄相\径摄?br>(4) 3D Max8模型及骨骼动d出插?br>(5) 模型渲染, 关键帧动d骨骼动画控制
(6) 基本的水面反效?br>(7) 单的面粒子系l?br>(8) 声音控制接口

q是一个单机游戏引擎的原型Q功能有限,但它ȝ不i使命完成了一个项目了Q以后再扩展使它日益强大吧!

RedLight 2009-12-05 17:36 发表评论
]]>
工具-----NVPerfHUD分析Beijing 2008http://www.shnenglu.com/flashboy/archive/2009/12/05/102607.htmlRedLightRedLightSat, 05 Dec 2009 09:06:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/12/05/102607.htmlhttp://www.shnenglu.com/flashboy/comments/102607.htmlhttp://www.shnenglu.com/flashboy/archive/2009/12/05/102607.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/102607.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/102607.html阅读全文

RedLight 2009-12-05 17:06 发表评论
]]>
WOW字体研究报告http://www.shnenglu.com/flashboy/archive/2009/12/01/102347.htmlRedLightRedLightTue, 01 Dec 2009 09:13:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/12/01/102347.htmlhttp://www.shnenglu.com/flashboy/comments/102347.htmlhttp://www.shnenglu.com/flashboy/archive/2009/12/01/102347.html#Feedback1http://www.shnenglu.com/flashboy/comments/commentRss/102347.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/102347.html                                      

l研IӞ 其实Q上面的字体是用Ҏ楷体(不是windows楷体)字体来做的, 用Freetypecd得到每个字符的对应图Qƈl装排版C张预先创建好的空U理?256*256),  l成一张灰度图Q这样可以防止重复字W脓图两遍,提高效率Q就像活字印h一Lzȝ合?br>渲染的时候,采用字体颜色RGB + 灰度囑֐成最l效果?br>
也许你会发现Q左图ؓ什么这么清晎ͼ叛_好像E差一炏V对了,其实人的眼睛很奇怪,寚w色的识别是通过Ҏ的,wow正是利用q一点,背景色采用以黄色Z色调Q夹杂一些噪壎ͼ然后再渲上黑色的文字Q这样可以给人感觉到很清晰?br>
其实wow中还是其他一些文字效果,比方_阴媄文字Q原理是渲染两次同一字符Qƈ在第二次遍渲染作偏移卛_。当Ӟq有那种字体外边包v来的效果Q不q这U我q没研究它的法?br>
怎么说呢Q一个游戏世界中Q字体我觉得相当重要Q丰富的字体表现会给人相当美满的效果Q带lh好的印象,所以还是相当重要的。我也在做我的文字配|系l,福我早日完成吧Q?谢谢Q?

RedLight 2009-12-01 17:13 发表评论
]]>
BigWorld引擎初识大观http://www.shnenglu.com/flashboy/archive/2009/11/14/100914.htmlRedLightRedLightSat, 14 Nov 2009 05:16:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/11/14/100914.htmlhttp://www.shnenglu.com/flashboy/comments/100914.htmlhttp://www.shnenglu.com/flashboy/archive/2009/11/14/100914.html#Feedback2http://www.shnenglu.com/flashboy/comments/commentRss/100914.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/100914.html阅读全文

RedLight 2009-11-14 13:16 发表评论
]]>
D3D与OpenGL常用API对译http://www.shnenglu.com/flashboy/archive/2009/11/14/100912.htmlRedLightRedLightSat, 14 Nov 2009 04:49:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/11/14/100912.htmlhttp://www.shnenglu.com/flashboy/comments/100912.htmlhttp://www.shnenglu.com/flashboy/archive/2009/11/14/100912.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/100912.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/100912.html作ؓ一?DE序? 我用了OpenGL两年? 最q在搞一个项? 从OpenGL转到D3D, 虽然工程外在的框枉装得不? 但想完全COpenGL转换到D3D, 看v来还是有隑ֺ? ׃我两个星期的旉, 我终于{换过来了?br>D3D与OpenGL的几Ҏ较明显不同的地方:
(一)、正交投影时QOpenGL以屏q左上角?0,0), 而D3D却以屏幕中心?0,0)
(?、OpenGL使用x坐标p, 而D3D使用左手坐标p?br>(?、OpenGL使用旋{操作{{入的角度参数?角度, 而D3D?弧度Q所以注意要PI * Angle / 180

下面我把具体地API对照关系列出?不是很全Q以后添加中.......)


1. 坐标变换
 pos = D3DXVECTOR3(0,2,-1.5);
 at  = D3DXVECTOR3(0,0,0);
 up  = D3DXVECTOR3(0,1,0);
 D3DXMatrixLookAtLH(&view,&pos,&at,&up);
 pd3dDevice->SetTransform(D3DTS_VIEW,&view);

2. l制
 pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);

    DrawPrimitive()
 DrawIndexedPrimitive()
 
 DrawPrimitiveUP()
 DrawIndexedPrimitiveUP()
3. 颜色


4. 片段试

 (1) 深度试
 g_pDevice->SetRenderState(D3DRS_ZENABLE, TRUE);           //glEnable(GL_DEPTH_TEST);  
 g_pDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);    //glDepthFunc(GL_LEQUAL);
 //--------------------------------------------------------------------------------------------------------
 g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);      //glEnable(GL_CULL_FACE);

 
 (2) Alpha试
 //-------------------------------------------------------------------------------------------------------- 
 g_pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);                //glEnable(GL_ALPHA_TEST);
 g_pDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);    //glAlphaFunc(GL_GREATER, 0.1f);
 g_pDevice->SetRenderState(D3DRS_ALPHAREF, 0.1 * 255); //取D?0 ~ 255
 
 (3) 剪裁试 (q面剪切)
 //--------------------------------------------------------------------------------------------------------
 // Enable clip plane for reflection map
 CMatrix44f pWorldViewProjIT=m_pWorldViewProj;
 //pWorldViewProjIT.Transpose();
 pWorldViewProjIT.Invert();   

 // Transform plane to clip-space
 float pClipSpacePlane[4];
 float pClipPlane[]= { 0, 0, 1, 0};   

 // Check if camera is below water surface, if so invert clip plane
 CVector3f pEye=(CVector3f)m_pCamera.GetPosition();
 if(-pEye.m_fZ<0.0)
 {
  pClipPlane[2]=-pClipPlane[2];
 }

 MatrixTransformPlane(pClipSpacePlane, pClipPlane, pWorldViewProjIT);

 // enable clip plane now
 g_pDevice->SetClipPlane(0, pClipSpacePlane);  
 g_pDevice->SetRenderState(D3DRS_CLIPPLANEENABLE, 1);
 
 
 
 (4) 模板试
 //--------------------------------------------------------------------------------------------------------
 g_pDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE);
    g_pDevice->SetRenderState(D3DRS_STENCILFUNC, 3DCMP_ALWAYS);
    g_pDevice->SetRenderState(D3DRS_STENCILREF, 0x1); //取D?0 ~ 255
   
    Device->SetRenderState(D3DRS_STENCILPASS,  D3DSTENCILOP_KEEP);
 
5. U理操作
 
 g_pDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
   g_pDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
   g_pDevice->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
   
 g_pDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
  g_pDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);

6. ~冲区操?br>  
 (1) 颜色~冲
 //--------------------------------------------------------------------------------------------------------
 g_pDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA);
 g_pDevice->SetRenderState(D3DRS_COLORWRITEENABLE, 0x000000F);
 
 (2) 深度~冲
 //--------------------------------------------------------------------------------------------------------
 g_pDevice->SetRenderState(D3DRS_ZENABLE, TRUE);           //glEnable(GL_DEPTH_TEST);
 g_pDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);        //glDepthMask(GL_TRUE);

 (3) 模板~冲
 //--------------------------------------------------------------------------------------------------------
 
 (4) 渲染到纹?br> //--------------------------------------------------------------------------------------------------------
 // Render targets
 IDirect3DSurface9 *m_plD3DBackbufferSurf,
  *m_plD3DDepthStencilSurfAA,
  *m_plD3DDepthStencilSurf;

 CRenderTarget *m_pRTRefraction, *m_pRTReflection; //(自定义纹理类)

 //-----------------------------------------------------------------------------------

 // Get backbuffer
 g_pDevice->GetRenderTarget(0, &m_plD3DBackbufferSurf);
 
 // Get depthstencil
 g_pDevice->GetDepthStencilSurface(&m_plD3DDepthStencilSurfAA);
 

 // Restore previous states
 g_pDevice->SetRenderTarget(0, m_plD3DBackbufferSurf);
 g_pDevice->SetDepthStencilSurface(m_plD3DDepthStencilSurfAA);
 
 // (1)折射?-------------------------------------------------------------------------
 
 //下面的语句调用了 g_pDevice->CreateRenderTarget(iWidth, iHeight, (D3DFORMAT) iFormat, (D3DMULTISAMPLE_TYPE)iAASamples, 0, 0, &m_plD3Surf, 0));
 if(FAILED(m_pRTRefraction->Create(m_fWidth>>1, m_fHeight>>1, D3DFMT_A8R8G8B8)))
 {
  return APP_ERR_INITFAIL;
 }
 
 // Create depthstencil withouth multisampling
 g_pDevice->CreateDepthStencilSurface(m_fWidth, m_fHeight, D3DFMT_D24X8, (D3DMULTISAMPLE_TYPE)0, 0, 0, &m_plD3DDepthStencilSurf, 0);
 
 
 g_pDevice->SetRenderTarget(0, m_pRTReflection->GetSurface());
 
 g_pDevice->StretchRect(m_plD3DBackbufferSurf, 0, m_pRTRefraction->GetSurface(), 0, D3DTEXF_NONE);
 
 // (2)反射?----------------------------------------------------------------------------------
 m_pRTReflection=new CRenderTarget;
 if(FAILED(m_pRTReflection->Create(m_fWidth>>2, m_fHeight>>2, D3DFMT_A8R8G8B8)))
 {
  return APP_ERR_INITFAIL;
 }
 
 g_pDevice->SetRenderTarget(0, m_pRTReflection->GetSurface());
 
 
 //-----------------------------------------------------------------------------------
 g_pDevice->SetRenderTarget(0, m_pRTReflection->GetSurface());
 g_pDevice->SetDepthStencilSurface(m_plD3DDepthStencilSurf);
 g_pDevice->Clear(0, 0, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(255, 0, 0, 128), 1.0f, 0);  
 SetViewport(m_pRTReflection->GetWidth(), m_pRTReflection->GetHeight());
 //-----------------------------------------------------------------------------------
 
 D3DXSaveTextureToFile("imageTex.jpg",D3DXIFF_JPG,(IDirect3DTexture9*)m_pWavesBump->GetTexture(),NULL);
 
7. 混合操作
 g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);    //glDisable(GL_BLEND);
 g_pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);  //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 g_pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
 

8. 灯光与材?br> g_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE); //glDisable(GL_LIGHTING);
 
 D3DMATERIAL9 mtrl;
 mtrl.Ambient  = a;
 mtrl.Diffuse  = d;
 mtrl.Specular = s;
 mtrl.Emissive = e;
 mtrl.Power    = p;
 Device->SetMaterial(&mtrl);  //在设|纹理前讑֮
 //讄当前使用的纹?br> 



RedLight 2009-11-14 12:49 发表评论
]]>
wmo(wow map object) researchhttp://www.shnenglu.com/flashboy/archive/2009/09/25/97235.htmlRedLightRedLightFri, 25 Sep 2009 08:39:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/09/25/97235.htmlhttp://www.shnenglu.com/flashboy/comments/97235.htmlhttp://www.shnenglu.com/flashboy/archive/2009/09/25/97235.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/97235.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/97235.htmlThe wmo是一个非常有的设计Qwow中比较小的物体用doodadQ而building使用wmoQ?br>q里的building可以是桥梁、了望台、简单的房子、复杂点的旅馆这L房屋、非?br>复杂的徏{群Q例如地下城场景Q,本文对wmo场景文gq行单的介绍Q关于wmo文g的具
体信息请参考wowmapview的source codeQ这里非常感谢ufoz所做的贡献?br>1、命名规?br>wmo保存在以.wmol尾的文件中Q这个文件用数据块来保存数据。一个wmo通常׃个或多个
groupl成Q而group数据也保存在?wmol尾的文件中Q不q文件名U存在不同,例如一个wmo
保存在name.wmo文g中,那么group文g名就为name_001.wmo name_002.wmo......
2、结?br>wmoql结构来说包含两个层ơ,group和batch。一个group通常包含多个batchQ其中group包含
一个AABB。batch是wmo最的渲染单元Q它保存了顶点烦引列表,可以直接调用DPq行渲染。group
内保存一个标志位Q可以将group分ؓindoor/outdoor两类Q这一个信息非帔R要,通过它wmo将
building分成了内外两部分Qoutdoor group是building的外壻I他通过portal与室内场景连?br>在一赗?br>3、portal
wmo文g中保存了portal信息Q在wmo中规定group必须通过portalq行q接Qportal由PVS和PRS
两部分组成,PVS记录portal点信息QPRS记录portal和group的连接信息,PRSl构如下Q?br>struct WMOPR {
int portal;
int group;
int dir;
};
需要注意的是dirQ这个成员只有两个?1?Q由于portal的顶点信息按照顺旉记录Q因此group
位于portal的正面时dir?Q否则ؓ-1Q通过dir可以快速确定group到底位于portal的哪一侧?br>通过wmo中记录的portal信息可以使用portal culling来检查group的可见性,但是q里q是有一?br>隑ֺQ主要是指portal的记录方式。由于一个group可能有多个portalQ而查找连接的portal只能
通过PRSQ这样在大的场景中非怸方便。而且在wmo中竟然没有记录portal的plane信息Q如何确?br>camera到底是位于portal的正面还是反面呢Q(现在wmo文g׃没有完全破解Q存在一些wowmapview
未读入的数据块,例如MVER、MOPT、MOVV、MOVB{,其中MVER应该是wmo文g的版本号QMOPT怀疑是?br>存所有plane信息Q而MOVV可能是保存包围体点信息Q而MOVB保存包围体信息,MOVV、MOVB应当用于
撞,q些暂时没有验证Q我的做法是在蝲入时计算portal的plane信息QƈPRS信息转换为类?br>Q3 BSP中portal的结构?br>struct portal_t {
int othergroup;
int pvs;//pvs index
int dir;
};
struct group_t {
int firstportal;
int numportals;
};
4、碰撞检?br>在wmo中ƈ没有使用BSP、OC TREEq样的结构来q行场景理Q可能所有h都感觉非常困惑?br>场景理的功能主要是Z加速渲染和方便撞,׃存在portalQ这L一个功能已l完成?br>而对于碰撞检,我的x应当是AABB TREE。仔l观察WOW的场景可以发现在indoor场景中曲面、斜?br>q样的几何物体非常少Q大多数是规则物体,因此可以判断在wmo中所有的物体都是严格按照轴对?br>方式q行建模Q也是对规则性物体AABB=OBB。由于MOVV和MOVB信息q没有完全研I彻Q因此关?br>q一部分只能是我的猜?br>5、渲?br>对wmo的渲染由于batch的存在从而变的简单化Q但q有可以优化的地斏V由于wmo中用portal其分割
成groupQ因此有大量的材质相同的model被分割成不同的batchQ在渲染时将材质相同的batch合ƈC?br>渲染可以避免一些无谓的DP调用。wmo一个o病的地方是用vertex lightQؓ了减图元数量从?br>佉KҎ量降低,造成渲染的时候出现色带效果,应当加入lightmapQ由于wmo的场景通常不大Q预处理
时做radiosity的时间也不会太长?br>6、动态蝲?br>对于只包含几个group的小场景的wmoQ由于蝲入时间不是太长,在动态蝲入时一ơ性蝲入对E序影响
q不会太大。但是对于超大场景的wmo需要考虑载入{略Q这样场景典型的是wow中的C城场景,
它一个wmo中包含了几百个groupQ一ơ性蝲入时间非帔RQ需要分D进行蝲入。此时就昄出wmo?br>文g保存group的优势了Qؓ了实现动态蝲入wmo场景Q一U可能的做法是在载入wmo后需要根据camera
所在的group快速的建立groupq接层次图,q个N过PRS数据建立Q徏立流E如下:
一、将camera所在group作ؓ当前groupQ获得所有相q的protalQ?br>二、将protalq接的group保存到第一层列表中Q遍历第一层列表中所有的groupQ?br>三、获得第一层列表中group的portalQ检查portal所q接的group是否保存在第一层列表中Q如果没?br>    其保存到第二层列表中;
四、重复上q过E,直到整个层次囑־立?br>q个层次囑֏以预先徏立然后保存到文g中运行时载入Q这样wmo是分层载入而不需要一ơ性蝲入?br>Q这里我考虑是否在wmo中也可以建立cMbsp的pvs数据呢?虽然pvs现在已经开始淘汎ͼ但是如果
存在pvs可以方便确定哪些group需要立卌入,只是不知被portal分割后的group到底是不是convex
hullQ如果是的话可以建立pvsQ但对徏模时限制更加明显Q两隄选择Q!Q)
7、徏?br>׃wmo是按照group对场景进行保存,因此Z建立wmo需要设计一个强力的模型构徏工具Q这个工?br>主要功能是对从建模工具Q?DS MAXQ中建立的场景模型进行分l和处理。美工在制作模型旉要非?br>心Q所有的模型要严格的轴对齐(轴对齐的原因是需要模型的AABB=OBBQ,然后模型导入工具中?br>模型构徏工具有以下功能:分组QgroupQ功能、group选择、group昄/隐藏、指定portalQportal?br>齐(考虑门、窗戯样天然的portalQ手动指定portal时肯定无法与外表墙壁寚wQ需要程序自动对齐)
、batch操作Q分剌Ӏ选择、显C?隐藏{)、图元操作Qtriangle拣选,用于batch分割Q、光照运?br>Q生vertex light数据Q、放|光源、放|doodadQ场景中的道P如桌子、椅子等Q。可能还需要其
他一些功能,但是Ҏ其他引擎的场景徏模工Phammer、sandboxQ明昄单化许多?br>8、优势及不
当前处理室内场景的主技术依然是bspQ但是随着g的发展bsp的优势在慢慢C失,bsp赖以生存?br>预处理PVS现在已经完全被实时的portal culling所取代Qbsp优势只剩下对囑օ排序Q用于透明物体?br>渲染Q和Zbrush的快速碰撞检上Q但是对比徏模工L复杂化和场景的限Ӟ采用bsp的开销实
昑־太大。而基于纯portal引擎的结构开始流行,例如cryengine中处理室内场景时完全抛弃bspQ?br>场景完全׃块块固定大小的墙壁组成,一块墙壁基本和bsp中brushcMQ这样做的好处是建模工具?br>的简单(不需要进行CSGq算Q,而且非常Ҏ的生portalQ同时由于场景用brush构成也兼具了
bsp方便q行撞的优势。wmo有些cMcryengineQ但是在某些斚w更具优势?br>首先在徏模方面,wmo的场景完全可以通过成熟的徏模工h构徏Q这样对于美工不需要重新学习新?br>建模工具Q可以节U大量的旉。其ơ模型构建工具需要的功能非常,减少了程序的复杂性,~短?br>~写相关工具的时间。再ơ,场景理单化Q相应代码量大幅度减,同时׃portal的存在,可以方便
的与其他引擎相对接。可以说wmo是一U可以进行快速开发的场景l构?

RedLight 2009-09-25 16:39 发表评论
]]>
ŷԴƬxxxxxþþ| þþþƷҰ| 99þùۺϾƷӰԺ| þþƷAVþþ| ˼˼þ99ֻƵƷ66| ˳ŷþ | þۺ༤| ƷþþĻ| þþþþŮ| ޹ƷۺϾþ| þպƬ| ĻþþƷ| Ʒþþþ9999| þһ99| ݺɫݺɫۺϾþ| þþþƷ| ͵þþþƷר| ɫۺϾþþþ| ͵͵þþþվ| þþþžоƷ| þAV| þþƷþ| ѾþþƷ99reѾy| ƷۺϾþĻ| ޾þþþþ77777| þùһ| þѾƷav | һaɫƬþٸһHƬѷ | ˾þþƷ鶹| ۺþþ| պһƵþ| һƷþ| ˾þô߽AVۺӰԺ| ҹƷþþþ| Ƭѹۿþ| Ʒ˾þþþӰԺ| ŷ糱þþXXXXx| þúݺݰۺӰԺ| þݺҹҹ2020츾| Ʒþþþþþ| Ʒþþþù|