﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-3d Game Walkman -随笔分类-前台客户端</title><link>http://www.cppblog.com/tonykee/category/7261.html</link><description>3d图形渲染，网络引擎 — tonykee's  Blog</description><language>zh-cn</language><lastBuildDate>Tue, 01 Dec 2009 14:42:09 GMT</lastBuildDate><pubDate>Tue, 01 Dec 2009 14:42:09 GMT</pubDate><ttl>60</ttl><item><title>Early ZBuffer [转]</title><link>http://www.cppblog.com/tonykee/archive/2009/12/01/102326.html</link><dc:creator>李侃</dc:creator><author>李侃</author><pubDate>Tue, 01 Dec 2009 06:20:00 GMT</pubDate><guid>http://www.cppblog.com/tonykee/archive/2009/12/01/102326.html</guid><wfw:comment>http://www.cppblog.com/tonykee/comments/102326.html</wfw:comment><comments>http://www.cppblog.com/tonykee/archive/2009/12/01/102326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tonykee/comments/commentRss/102326.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tonykee/services/trackbacks/102326.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/tonykee/archive/2009/12/01/102326.html'>阅读全文</a><img src ="http://www.cppblog.com/tonykee/aggbug/102326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tonykee/" target="_blank">李侃</a> 2009-12-01 14:20 <a href="http://www.cppblog.com/tonykee/archive/2009/12/01/102326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>渲染方面加了一个bloom效果</title><link>http://www.cppblog.com/tonykee/archive/2009/09/14/96165.html</link><dc:creator>李侃</dc:creator><author>李侃</author><pubDate>Mon, 14 Sep 2009 14:17:00 GMT</pubDate><guid>http://www.cppblog.com/tonykee/archive/2009/09/14/96165.html</guid><wfw:comment>http://www.cppblog.com/tonykee/comments/96165.html</wfw:comment><comments>http://www.cppblog.com/tonykee/archive/2009/09/14/96165.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/tonykee/comments/commentRss/96165.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tonykee/services/trackbacks/96165.html</trackback:ping><description><![CDATA[<p>我的显示部分做的还不够强，这段时间实在是忙，为换工作的事忙和了半个月<br>总算如愿以偿，去了国内一家大型网游公司，马上需要接受更多新的挑战，现在手头许多工作只能暂时搁置<br><br>上个月做了一个bloom的效果，用的postprocess，backbuffer交换链方式的，后处理技术来实现的，这样的特效几乎是现在游戏的的标配了，实现技术有点老套，但即使是一点点改变，前后的效果也是大有改观啊，基本的思路可以去看SDK 里面的原版的例子，里面不止是bloom的特效，还有很多别的效果，这个例子非常值得推敲，用到的技术可以说是dx9里面非常成熟的一项技术了。<br><br>目前还没有加入HDRLight的光效，这个效果和bloom类似，但似乎比bloom更好，看什么时候有时间再弄个HDR版本的出来玩玩，下面是用了以后，和用之前的场景渲染效果对比，感觉光线柔和了一些，不会那么生硬，我觉得可以使用这个技术做出些别的特效，比如偏蓝，偏黄，老照片，黑白的特效，有点类似photoshop滤镜了，但是据说有些玩家看多了就很讨厌这样的效果，可能口味不同，因人而异吧<br><br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/tonykee/bloom.jpg" width=1228 height=768></p>
<img src ="http://www.cppblog.com/tonykee/aggbug/96165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tonykee/" target="_blank">李侃</a> 2009-09-14 22:17 <a href="http://www.cppblog.com/tonykee/archive/2009/09/14/96165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>新加入了PSSM全场景阴影</title><link>http://www.cppblog.com/tonykee/archive/2009/06/17/87925.html</link><dc:creator>李侃</dc:creator><author>李侃</author><pubDate>Wed, 17 Jun 2009 15:53:00 GMT</pubDate><guid>http://www.cppblog.com/tonykee/archive/2009/06/17/87925.html</guid><wfw:comment>http://www.cppblog.com/tonykee/comments/87925.html</wfw:comment><comments>http://www.cppblog.com/tonykee/archive/2009/06/17/87925.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/tonykee/comments/commentRss/87925.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tonykee/services/trackbacks/87925.html</trackback:ping><description><![CDATA[这几天把场景的渲染进行了重构,把拣选出来的模型按类型进行了分组，然后安装组进行渲染，最大程度的减少了pass的数量，另外加入了全场景的PSSM (Parallel-Split Shadow Maps for Large-scale Virtual Environments)，场景的视锥view分成了3个部分，每个部分是1024的shadowmap，对阴影进行了 3x3 PCF Filtering 的采样，锯齿感不那么强了，有了一定的优化，目前还没有加入高斯模糊，暂时不想再做更高的开销了，目前已经很好支持pssm和非pssm两种模式的渲染了，开关阴影都很自由，渲染效率基本满意。当然开和关阴影的效率差不多有40%的差异,这只是初略的测试，不过还有很多优化的地方，有些物体不需要影子，（比如花草的影子可以关闭，远距离树木关闭影子等等...优化）我想效率提升的余地还是很大的。<br><br>上个图看看效果<br><br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/tonykee/pssm.jpg" width=868 height=593> 
<img src ="http://www.cppblog.com/tonykee/aggbug/87925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tonykee/" target="_blank">李侃</a> 2009-06-17 23:53 <a href="http://www.cppblog.com/tonykee/archive/2009/06/17/87925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最新的进展，完成一些客户端的打怪的代码</title><link>http://www.cppblog.com/tonykee/archive/2009/03/18/76992.html</link><dc:creator>李侃</dc:creator><author>李侃</author><pubDate>Wed, 18 Mar 2009 05:48:00 GMT</pubDate><guid>http://www.cppblog.com/tonykee/archive/2009/03/18/76992.html</guid><wfw:comment>http://www.cppblog.com/tonykee/comments/76992.html</wfw:comment><comments>http://www.cppblog.com/tonykee/archive/2009/03/18/76992.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/tonykee/comments/commentRss/76992.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tonykee/services/trackbacks/76992.html</trackback:ping><description><![CDATA[
主要是物理攻击，魔法攻击（火球术），怪物的被攻击后锁定攻击者自动追逐的简单AI(当然，还没完全完善)，这些动作之间的协调性都经过了调试，利用我的骨骼插件加动作协调的代码基本都比较流畅了，这其中最难的其实还是动作之间的切换逻辑，还有物理碰撞部分，我整个碰撞大量使用到了physx里面的trigger shape，加入了攻击速度的运算，总之还是相当复杂的。下一步准备把这些动作的操作完全集成到lua脚本中去，用状态机来协调这写动作，实现动作控制部分与引擎的分离<div><img src="http://www.cppblog.com/images/cppblog_com/tonykee/warw.jpg" id="preview_image" onmousewheel="return Picture(this);" align="baseline"><br></div><img src ="http://www.cppblog.com/tonykee/aggbug/76992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tonykee/" target="_blank">李侃</a> 2009-03-18 13:48 <a href="http://www.cppblog.com/tonykee/archive/2009/03/18/76992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转载—网络游戏程序中解决加载卡顿的有效方法</title><link>http://www.cppblog.com/tonykee/archive/2009/02/28/75150.html</link><dc:creator>李侃</dc:creator><author>李侃</author><pubDate>Sat, 28 Feb 2009 05:47:00 GMT</pubDate><guid>http://www.cppblog.com/tonykee/archive/2009/02/28/75150.html</guid><wfw:comment>http://www.cppblog.com/tonykee/comments/75150.html</wfw:comment><comments>http://www.cppblog.com/tonykee/archive/2009/02/28/75150.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/tonykee/comments/commentRss/75150.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tonykee/services/trackbacks/75150.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/tonykee/archive/2009/02/28/75150.html'>阅读全文</a><img src ="http://www.cppblog.com/tonykee/aggbug/75150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tonykee/" target="_blank">李侃</a> 2009-02-28 13:47 <a href="http://www.cppblog.com/tonykee/archive/2009/02/28/75150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>这半个月把所有的Max导出插件全部集成了，新增加了骨骼导出插件</title><link>http://www.cppblog.com/tonykee/archive/2009/01/14/72047.html</link><dc:creator>李侃</dc:creator><author>李侃</author><pubDate>Wed, 14 Jan 2009 15:51:00 GMT</pubDate><guid>http://www.cppblog.com/tonykee/archive/2009/01/14/72047.html</guid><wfw:comment>http://www.cppblog.com/tonykee/comments/72047.html</wfw:comment><comments>http://www.cppblog.com/tonykee/archive/2009/01/14/72047.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/tonykee/comments/commentRss/72047.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tonykee/services/trackbacks/72047.html</trackback:ping><description><![CDATA[这半个月的收获太大了，终于可以宣布抛弃其他任何的mesh格式了，因为我完全拥有了自己的mesh格式<br><br>主要分为三类<br>1.普通的mesh<br>2.室内Portal 场景<br>3.骨骼动画<br>这三个类别做了个简单的整合，过两天打算做成max工具面板的形式来导出，我想操作起来会更方便吧<br><br>开发体会：<br>---------------------------------------<br>这段时间全力在攻克骨骼动画的导出，可真是不容易啊，找了很多资料，可以所是摸着石头过河的<br>把x格式研究了一遍又一遍，max sdk 快翻烂了，max sdk里面的东西简直就可以&#8220;没有天理&#8221;来形容<br>国外的资料也查的快疯掉，好歹摸索出来了<br><br>目前的数据导出基本按照x格式的思路来组织，导出数据来计算的，抛弃了3dmax建议的骨骼空间本地顶点的插值计算方式<br>而采用了对原始蒙皮姿势的mesh顶点直接按骨骼权重的方式进行计算，就蒙皮姿势的数据就让我好找啊<br>原来还觉得x的格式太繁琐复杂，现在回头看看人家的数据组织的却是非常的合理，导出的不仅仅只是动画<br>还可以用程序来控制里面的骨骼的变动，和物理引擎的结合就方便了，比如做一个从悬崖上掉下来的人，这可不是动画能解决的啦<br>目前的结构应该可以完好的和物理引擎进行整合，这将做为以后的研究了<br><br>总体上来说我的骨骼插件主要用的是Physique modifer 来支持动画输出的<br>目前支持能 max原始的bone骨骼，以及bip骨骼<br>原始的bone骨骼的IK还没能导出，存在一点点误差，不过bip骨骼运用的更多一些，已经完美支持了<br>所以IK计算的导出暂时也就放放了 (主要是IK的有些太复杂，还没来得及搞懂 -_-! ）<br>Floating 骨骼也暂时放放，要完善的内容其实也还是很多的<br><br>有了Physique 修改器的经验，我想做个blend之类的morph动画导出插件应该也没问题了，比如面部表情什么的，以后有需要的时候再继续吧<br><br>现在有了完整的一套自己的模型格式，以后要扩展，比如在mesh里加入粒子动画，甚至是逻辑数据都不成问题了，根据需要去扩展起来也相当容易了<br><br>明天打算把渲染的部分给搞出来，准备做个固定管线和&nbsp;&nbsp; GPU&nbsp; 计算的 vertBlend shader&nbsp;&nbsp; 的两个版本出来，这个很easy，预计明天上午就搞出来<br><br>还是老规矩，上图<br><br><img height=529 alt="" src="http://www.cppblog.com/images/cppblog_com/tonykee/bone0.PNG" width=713 border=0><br><br><br><img height=661 alt="" src="http://www.cppblog.com/images/cppblog_com/tonykee/bone1.PNG" width=725 border=0><br>
<img src ="http://www.cppblog.com/tonykee/aggbug/72047.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tonykee/" target="_blank">李侃</a> 2009-01-14 23:51 <a href="http://www.cppblog.com/tonykee/archive/2009/01/14/72047.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>能穿透alphatest纹理的shadowmap</title><link>http://www.cppblog.com/tonykee/archive/2008/05/27/51281.html</link><dc:creator>李侃</dc:creator><author>李侃</author><pubDate>Tue, 27 May 2008 07:57:00 GMT</pubDate><guid>http://www.cppblog.com/tonykee/archive/2008/05/27/51281.html</guid><wfw:comment>http://www.cppblog.com/tonykee/comments/51281.html</wfw:comment><comments>http://www.cppblog.com/tonykee/archive/2008/05/27/51281.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/tonykee/comments/commentRss/51281.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tonykee/services/trackbacks/51281.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这几天加入了shadowmap影子，着实费了点脑子看起来很简单的，可这东西牵扯到很多东西，场景要成像的对象都要统一纳入深度图里面渲染一遍，加了很多渲染方面的组织代码，静态模型，骨骼模型，等等，都要影子，渲染的方法还略有区别...&nbsp;&nbsp;<a href='http://www.cppblog.com/tonykee/archive/2008/05/27/51281.html'>阅读全文</a><img src ="http://www.cppblog.com/tonykee/aggbug/51281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tonykee/" target="_blank">李侃</a> 2008-05-27 15:57 <a href="http://www.cppblog.com/tonykee/archive/2008/05/27/51281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>晚上查了些资料，总算找到了MFC的游戏主循环，并好好研究了一把</title><link>http://www.cppblog.com/tonykee/archive/2008/03/18/44725.html</link><dc:creator>李侃</dc:creator><author>李侃</author><pubDate>Mon, 17 Mar 2008 16:42:00 GMT</pubDate><guid>http://www.cppblog.com/tonykee/archive/2008/03/18/44725.html</guid><wfw:comment>http://www.cppblog.com/tonykee/comments/44725.html</wfw:comment><comments>http://www.cppblog.com/tonykee/archive/2008/03/18/44725.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cppblog.com/tonykee/comments/commentRss/44725.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tonykee/services/trackbacks/44725.html</trackback:ping><description><![CDATA[<p>网络和流协议，文件打包，读取，等等一工作基本工作总算是完工了，现在人物可以在我的场景中漫游，人物和人物之间通过网络能相互通讯，都已经实现了，但是回头再看看我的场景，实在是汗颜啊，场景十分单调，之前我是把场景对象放入到一个大的XML文件中的，完全手工来编辑XML，因为没有自己的场景编辑器，唉，一直下不了决心去写啊。<br><br>从今天开始，我打算自己自作一个场景编辑器，这可是一个大工程啊，不过应该是很值的，如果能完善，那才真就有引擎的架式了<br>可能你会问，现在也有很多免费的引擎还自己写？<br>是啊，我的无限大地形是核心，里面溶入了我太多的心血，很多实现和别人的自然&#8220;不完全兼容&#8221;了，如今是时候了&#8230;&#8230;<br><br>进行了简单的设计之后，初步我打算用MDI窗口来制作场景编辑器，工具，参数调节面板在两旁，中间是D3D窗口<br>可才开始，就碰到问题了，天哪，MFC的主循环在哪里呢？How about&nbsp;<span class=title>Continuous Updating and Rending in MFC</span> ?<br><br>不过功夫不负有心人，总算查到了，不过研究了好一会儿，还好有了结果<br><br>那么说到正题，怎么在MFC应用程序里面加入主循环呢，MFC的WinMain可是看不到的哦，消息处理都做了高度封装<br><br>其实也是有解决方法的，请看下文：<br><br>//你需要重写你的应用程序的Run()方法，把原方法里面的代码统统复制过来下面都是copy的CWinApp::Run()的源码<br><br>int CMapEditorApp::Run()<br>{<br>&nbsp;//return CWinApp::Run();<br>&nbsp;if (m_pMainWnd == NULL &amp;&amp; AfxOleGetUserCtrl())<br>&nbsp;{<br>&nbsp;&nbsp;// Not launched /Embedding or /Automation, but has no main window!<br>&nbsp;&nbsp;TRACE(traceAppMsg, 0, "Warning: m_pMainWnd is NULL in CWinApp::Run - quitting application.\n");<br>&nbsp;&nbsp;AfxPostQuitMessage(0);<br>&nbsp;}</p>
<p><br>&nbsp;ASSERT_VALID(this);<br>&nbsp;_AFX_THREAD_STATE* pState = AfxGetThreadState();</p>
<p>&nbsp;// for tracking the idle time state<br>&nbsp;BOOL bIdle = TRUE;<br>&nbsp;LONG lIdleCount = 0;</p>
<p>&nbsp;// acquire and dispatch messages until a WM_QUIT message is received.<br>&nbsp;for (;;)<br>&nbsp;{<br>&nbsp;<br>&nbsp;//偷看消息队列，如果没有消息的话，就执行游戏的主循环框架完成渲染的Update<br>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br>&nbsp;while(!::PeekMessage(&amp;(pState-&gt;m_msgCur), NULL, NULL, NULL, PM_NOREMOVE))<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;//这里就可以放游戏的主循环了<br>&nbsp;&nbsp;&nbsp;//GameLoop();<br>&nbsp;&nbsp;&nbsp;DBWindowWrite("hello \r\n");<br>&nbsp;&nbsp;}<br>//加入上面这段就搞定了，这个方法里面的其他的代码就不要去动他们的了，否则&nbsp;^_^!<br>/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////</p>
<p>&nbsp;&nbsp;// phase1: check to see if we can do idle work，处理线程<br>&nbsp;&nbsp;while (bIdle &amp;&amp;<br>&nbsp;&nbsp;&nbsp;!::PeekMessage(&amp;(pState-&gt;m_msgCur), NULL, NULL, NULL, PM_NOREMOVE))<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;// call OnIdle while in bIdle state<br>&nbsp;&nbsp;&nbsp;if (!OnIdle(lIdleCount++))<br>&nbsp;&nbsp;&nbsp;&nbsp;bIdle = FALSE; // assume "no idle" state<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;// phase2: pump messages while available<br>&nbsp;&nbsp;do<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;//windows自己的GetMessage消息处理机制，类似于消息泵，有消息就处理消息<br>&nbsp;&nbsp;&nbsp;// pump message, but quit on WM_QUIT，<br>&nbsp;&nbsp;&nbsp;if (!PumpMessage())<br>&nbsp;&nbsp;&nbsp;&nbsp;return ExitInstance();</p>
<p>&nbsp;&nbsp;&nbsp;// reset "no idle" state after pumping "normal" message<br>&nbsp;&nbsp;&nbsp;//if (IsIdleMessage(&amp;m_msgCur))<br>&nbsp;&nbsp;&nbsp;if (IsIdleMessage(&amp;(pState-&gt;m_msgCur)))<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;bIdle = TRUE;<br>&nbsp;&nbsp;&nbsp;&nbsp;lIdleCount = 0;<br>&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;} while (::PeekMessage(&amp;(pState-&gt;m_msgCur), NULL, NULL, NULL, PM_NOREMOVE));<br>&nbsp;}<br>}</p>
<br><br>这只是一个初步的开始，MFC可不是一个好东西，这到不算什么，地图编辑器才是最麻烦的东西。<br>唉～～～<br><br>无论如何，现在开工吧！<br><br>
<img src ="http://www.cppblog.com/tonykee/aggbug/44725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tonykee/" target="_blank">李侃</a> 2008-03-18 00:42 <a href="http://www.cppblog.com/tonykee/archive/2008/03/18/44725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>