成就中心 DouJin Terraria! 社区服务 统计排行 帮助
  • 5060阅读
  • 8回复

[心得交流]关于从DLD就开始出现的Boss身体周围的扭曲特效的实现原理的想法

发帖
13
信仰
0
蓝点
5
符卡
0
如下图:


Boss周围的背景出现了扭曲


然后我在HGE的tutorial05里面看到了类似的东西:


仔细读过HGE里面相关的源代码以后,得知其实现原理是建立出一组矩形排列的顶点,然后分别设置好这些顶点的纹理坐标,再根据设置好的公式变换顶点的坐标,最后绘制出来。


然后我就想到,这种特效能否这样实现:
先用IDirect3DDevice9的CreateTexture函数创建一个指定大小的纹理,并且将Levels参数设为1以禁用mipmap
再用IDirect3DDevice9的SetRenderTarget函数将绘制目标设为此纹理对应的IDirect3DSurface9接口
(IDirect3DSurface9接口可以通过IDirect3DTexture9::GetSurfaceLevel函数获取)
然后再绘制背景元素。


这样就将整个背景绘制在一个纹理里面,此时再用HGE的tutorial05里面的方式就可以实现这种特效了。


问题:这样做稳定可靠吗?
根据DXSDK(June 2010)里面的说法,IDirect3DDevice9::EndScene函数是异步的,并不能保证调用以后就可以绘制完成。
于是民那对实现这种特效还有神马想法吗?想要交流一下呃。



--------------------------------------------------------------------


2011.11.15 20:15


实现了。
代码扔在附件里。
[ 此帖被月灵剑士在2011-11-15 21:19重新编辑 ]
附件: 哦哈哈.zip (19 K) 下载次数:11
Your brain has two parts:the left & the right.Your left brain has nothing right, and your right brain has nothing left.
诶?

Me.SetState("填坑");
发帖
13
信仰
0
蓝点
5
符卡
0
只看该作者 沙发  发表于: 2011-11-15
或者还有一种做法:
在绘制背景时,若有扭曲发生,则对扭曲范围之内的背景元素顶点坐标进行变换...这样似乎靠谱一点。
(躺在床上用手机发布。
Your brain has two parts:the left & the right.Your left brain has nothing right, and your right brain has nothing left.
诶?

Me.SetState("填坑");
发帖
82
信仰
1
蓝点
68
符卡
0
只看该作者 板凳  发表于: 2011-11-15
我觉着还是前者更靠谱一些吧。后者如果遇到一大张纹理的情况,还要分成小的quad(或者叫hge里的mesh),还要手动进行3D/2D坐标变换,而且雾和光照可能也乱了套了。前者我也只是想过,没真正试过,不清楚EndScene的异步性到底会产生什么后果。
发帖
13
信仰
0
蓝点
5
符卡
0
只看该作者 地板  发表于: 2011-11-15
的确,后者的话计算坐标非常麻烦……雾化也会乱套

但是我昨晚尝试了一下顶楼帖子里我说的做法……貌似没成功呃……
Your brain has two parts:the left & the right.Your left brain has nothing right, and your right brain has nothing left.
诶?

Me.SetState("填坑");
发帖
59
信仰
0
蓝点
17
符卡
0
只看该作者 4楼 发表于: 2011-11-15
跟据我学as3时的一点看法,扭曲效果除了可以用网格扭曲外,还可以用置换滤镜。

没玩DLD不太清楚具体效果,不过单是置换的话,比如球体,只要把目标像素向周围扩展移动就可以了,flash中实现效果大概像这样,好像这个又叫鱼眼镜头效果,把这个效果移植成C++应该就可以了吧。

fishEye.rar (24 K) 下载次数:8


非圆形的置换效果
DisplacementMapFilter.rar (21 K) 下载次数:4



原理大概是这样 ,就是一些像素操作,只对背景应用就可以,速度方面或者可以用个ps,这个滤镜flash中本身运行速度就不错,不过想更快还可以用PB,所以我想C++肯定比flash效率更好一些,实在慢就用ps(pixel shader )

http://blog.sina.com.cn/s/blog_72c7ab9d0100q06o.html



下了TH13玩了一下,发现就是网格扭曲....上面的置换效果请无视.....
[ 此帖被elegame在2011-11-15 15:29重新编辑 ]
发帖
82
信仰
1
蓝点
68
符卡
0
只看该作者 5楼 发表于: 2011-11-15
用target可以的。我直接用的hge自带的target。把那个龙猫满天飞的tut改了下。
附件: hge_tut07.zip (3 K) 下载次数:7
发帖
13
信仰
0
蓝点
5
符卡
0
只看该作者 6楼 发表于: 2011-11-15
回 5楼(隔壁的桌子) 的帖子
原来如此……看来是我之前的代码有些问题。把桌子大的代码下下来学习一下。


-------------------------------下午と晚上の境界-------------------------------


仔细翻看了一下HGE的代码……看到了一句相当奇葩的调用:
pD3DDevice->SetRenderTarget(pSurf, pDepth)

Google了一下才发现原来DX9的SetRenderTarget和DX8的SetRenderTarget是不一样的233
[ 此帖被月灵剑士在2011-11-15 19:06重新编辑 ]
Your brain has two parts:the left & the right.Your left brain has nothing right, and your right brain has nothing left.
诶?

Me.SetState("填坑");
发帖
13
信仰
0
蓝点
5
符卡
0
只看该作者 7楼 发表于: 2011-11-15
回 4楼(elegame) 的帖子
有些方面D3D还真不如其他东西来的方便呃
Your brain has two parts:the left & the right.Your left brain has nothing right, and your right brain has nothing left.
诶?

Me.SetState("填坑");
发帖
59
信仰
0
蓝点
17
符卡
0
只看该作者 8楼 发表于: 2011-11-15
GameMain好像没定义啊....编译不过.....另外大家是不是都被墙了?你们上得去小镇么?


自己添了几句行了,你这个就是试验一下网格扭曲啊,我以为实现游戏那个效果呢....


另外看来被墙是只是我们杯具的网通众啊,其可修~~~

楼主留言:

不好意思,打包的时候疏忽了~
现已更正。另外小镇神马的至少我这里上起来无鸭梨

[ 此帖被elegame在2011-11-15 23:39重新编辑 ]
描述
快速回复

您目前还是游客,请 登录注册
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
认证码: