GoodNight

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  4 Posts :: 2 Stories :: 16 Comments :: 0 Trackbacks

常用链接

留言簿

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

2010年6月30日 #

大多数游戏中,都有流光效果,这样大大增强装备的感官刺激。。

其实要实现流光,非常简单,只需要混合两层贴图,调整一下操作符,然后在流光贴图层变换UV就OK了。。。

但是这里有一个问题,也就是说这样的逻辑应该放在哪一层实现,如何实现?

我个人不推荐放在逻辑层实现。。。这样的话在逻辑层都出现了DEVICE之类的接口调用。。。缺乏美感了吧。。。

既然是纹理,那就应该用材质系统。。。

但是如果是用材质系统的话,我们先来看看OGRE对这样的效果有没有支持。。。。

其实但从实现流光的效果来讲,用OGRE的材质系统是可以实现的,1个pass里面2个TEXTURE_UNIT_STATE,搞定。。。

但是如果在我们的游戏中出现了500个装备,10种UV贴图,那就要配5000个材质脚本。。。

但是如果能将它们分离,而通过材质系统中叫做MaterialBlend的方法(自创,哈哈哈哈),由引擎的材质系统提供相关的接口,那这样就只需要配510个材质脚本。。

详细的设计就不提了。。。大致的思路就是通过passNew = pass1+pass2,用过重载操作符进行。。也有passNew = pass1*pass2,用以不同的方式混合

然后entity->setmaterial(passNew)

说起挺简单的,具体编码可能还是会遇到很多问题!
posted @ 2010-06-30 15:00 G++ 阅读(2023) | 评论 (9)编辑 收藏

2010年6月14日 #

最近由于工作需要,开始深入的研究MAX导出插件,在此做一点学习笔记和大家分享交流....

其实MAX的SDK说大也大,说小也小.....虽然说MAX那么多类那么多接口,但实际上如果是开发导出插件的话.....至少有70%以上的DLLEXPORT类都是用不上的.....而在这些用的上的类里面,Set一族函数也是没有用的.....虽然说网上的资料很少,只要耐心的啃SDKHELP,基本上还是可以满足自己的功能的.....在此提一些之前学习MAXSDK中的一些经验和教训..

1.MAX中的坐标系和DX不一样,需要交换Y和Z..

2.MAX中FACE的索引顺序和DX中的索引顺序是相反的...

3.MAX中遍历整个模型必须是通过面的遍历,首先获取每个"面"中的每个顶点的索引,以及每个"纹理面"中的每个纹理顶点的索引,然后你可以通过一个MAP表来建立关系,然后再通过MESH中的GETVERT和GETTVERT来传入"面"和"纹理面"的索引,来获取顶点坐标和纹理坐标,至于你要说,如果遇到一个顶点对应了多个纹理坐标怎么办...那只有在程序中手动的去把这个顶点拆成两个顶点,并且自己去添加索引序号...

好了,接下来到重点了...关于材质动画的导出

这里还是描述一下我这里所谓的材质的概念...基本上和OGRE的材质的概念差不多...但这里我所导出的实质上就是MATERIAL中的一个PASS...主要因为在我的FUNK引擎中并没有用到MATERIAL->TECH->PASS的概念,而是直接使用了PASS,主要是因为那样的框架比较复杂,而且也并不是那么的实用...而且我这里没有用到多PASS,那样的结构实在是又不实用又麻烦,因为个人认为做多PASS还是直接用SHADER吧....

我们要实现的目标就是导出每帧(我没有做关键帧)的纹理坐标,漫反射材质,镜面光材质,ALPHA信息

提供一些我编码中的一些接口供大家参考...

MtlBase:基础材质类,这个类中可能没有你需要导出数据的接口,但是,贴图类,材质类,标准材质类等都是从这个类中派生出来的...

Mtl:材质类,如果你是一个对敏感的图形程序员,你就会发现这里有你需要的接口了,类似GetAmbient,GetDiffuse之类的接口,没错,你的猜测没错,这里就可以导出环境光,漫反射光之类的数据了...但是这远远不够,我们需要的是动画啊,在GetAmbient的参数里面没有看到TimeValue,不要急,往下面看...

StdMat:标准材质类,哈哈,在SDK中查找这个类的接口后,你就发现
virtual Color StdMat::GetDiffuse TimeValue  t  )
之类的好东西了,材质动画的入口我们已经找到了...你会说,纹理呢?纹理在哪儿??不要急...且听下回分解!

哎...累啊!明天还要加班!哥先去睡咯!

P.S. 由于代码还没写完!暂时没图!哈哈哈!
posted @ 2010-06-14 00:20 G++ 阅读(2537) | 评论 (2)编辑 收藏

2009年10月14日 #

这些天在写场景管理的一些内容以及渲染自己导出的模型的渲染器...

首先先说两个导致我花了1天才解决的两个弱智BUG...望大家以后注意....

1. 如果使用固定管线渲染...千万千万记得在创建D3DMATERIAL9对象的时候ZeroMemory一下.....不然哪天你没有设置镜面光或者环境光的系数的时候就啥都看不到了....
2.由于粗心大意...在SHADER传参的时候将pEffect->SetTexture("g_Tex",...);写成了pEffect->SetTextrue("g_tex",...),结果悲剧就发生了....

这两天在测试模型渲染器的效率....遇到一些问题....还望各位大牛指点一下...

先来比较一下这两张图:





首先说一下,当把静态模型加到1000个以后,也就是所谓的百万个三角形后,其实对渲染的效率影响并不是很大...
可见现在GPU对于顶点的处理基本不是问题(不要太变态的情况下)...顺便提一句,我的是7300GS显卡

在渲染过程中用的是VS&PS2.0

但是大家可以看到第一张图中帧数比第二张图中的帧数少了8帧左右

先忽略掉那多出来的20个1024个面,我认为不是关键...

这两次渲染中我只是将模型的缩放比例从0.4变为了0.2,仅此而已...
不影响场景管理...因为我的场景管理还没有加动态的对象...呵呵...
那为什么效率出现了差别...

比较直观的看就是说第一张图中像素对后台缓冲区的填充率更高...而第二个更低...
那换句话说依然瓶颈是在于像素着色...但是具体在于像素着色的哪个方面呢,望高手解答一下...

再给一张图作为参考



其实这张图中渲染了200次骨骼动画模型
这次我把所有的渲染的位置都放在了同一个点...
帧数居然只有8了...如果说上面两张图的比较结果是像素填充后台缓冲区的填充率过高...
那么这张图又如何来解释呢....ZBUFFER的问题么???

同时...在场景管理中....想优化一下摄像机平截头体和四叉树节点的判断位置关系的代码...
望各位大牛提供一点思路...
posted @ 2009-10-14 19:57 G++ 阅读(1650) | 评论 (4)编辑 收藏

2009年10月4日 #

经过几个月的研究,终于搞定了我的导出插件...谈一点在学习过程中的一些心得与大家分享分享...

还是江湖规矩,先上个图吧...


这张是导出插件的简陋的不能再简陋的界面,哈哈...


这张是渲染器的简陋的不能再简陋的界面....

我使用的是D3D的SHADER渲染

其实导出插件的资料说多不多,说少也不少...
个人强烈推荐的看的资料是潘李亮的那篇文章,(做导出插件的话这篇文章必看!!!!不懂就多看几遍!!!)以及他的开源的导出插件的代码(代码口味比较重...)
还有OGRE1.6源代码里有个导出插件的代码,是基于IGAME的,其实也有一定的参考价值...
还有DXSDK2007FEB版本里有个源代码,也是基于IGAME的...
我的EXPORT没有用到IGAME,其实原理都差不多,GOOGLE一下还是有一些东西可以看一下的...

说几个我遇到的问题:
1.  3DMAX中的面分顶点几何数据面还有纹理数据面...face和tface,在遍历整个mesh求顶点索引的时候,可以使用一个MAP表把几何顶点和纹理顶点进行关联...
2.  3DMAX中面得索引和D3D中的顶点索引的顺序是相反的...
3.  其实我花的时间比较多的都是再渲染器上,如果你是用的顶点索引混合的方式来导出的话,一定要记得检查一下设备是否支持,当然用SHADER的话就另当别论了...
4.  3DMAX中的坐标必须要进行转换

//把Matrix3转换为Matrix4
void FunkTreeEnum::Matrix3_To_Matrix4(Matrix3& Mat3,Matrix4& Mat4)
{
 Mat4._11 = Mat3.GetRow(0).x;
 Mat4._12 = Mat3.GetRow(0).z;
 Mat4._13 = Mat3.GetRow(0).y;
 Mat4._14 = 0.0f;

 Mat4._21 = Mat3.GetRow(2).x;
 Mat4._22 = Mat3.GetRow(2).z;
 Mat4._23 = Mat3.GetRow(2).y;
 Mat4._24 = 0.0f;

 Mat4._31 = Mat3.GetRow(1).x;
 Mat4._32 = Mat3.GetRow(1).z;
 Mat4._33 = Mat3.GetRow(1).y;
 Mat4._34 = 0.0f;

 Mat4._41 = Mat3.GetRow(3).x;
 Mat4._42 = Mat3.GetRow(3).z;
 Mat4._43 = Mat3.GetRow(3).y;
 Mat4._44 = 1.0f;
}

本来想说的东西还是有很多...只不过这会儿想不起来了...

如果说有朋友在做导出插件的话可以和我交流...

QQ:  147449184

posted @ 2009-10-04 01:07 G++ 阅读(2266) | 评论 (1)编辑 收藏