作者Morshues (汪汪)
看板GameDesign
标题[程式] 用GL实作涟漪
时间Thu Mar 21 01:13:37 2013
因为前阵子有个关於游戏玩法的发想
想做一个关於涟漪特效
因此来请教板上的前辈们
有没有什麽改进效能的做法
我所指的涟漪
就是假设以一张图片为底图
触碰某个点的时候会产生随时间扩散的涟漪
类似像这样的效果
https://www.youtube.com/watch?v=Wtyxbi1c7r4
我使用的语言是android的openGL ES2
网路上找到一个关於涟漪的演算法
http://freespace.virgin.net/hugo.elias/graphics/x_water.htm
而网路上我看到对应到图片的作法 大致上有两类
一是将整张图片切成大量的三角片
再将水深资讯对应到Z轴坐标
二是将深度资讯做为texture的偏移量
越深的就偏移越多
我在试做的时候所使用的是第二种
是因为刚好找到这个
http://dl.dropbox.com/u/35529986/kokokakku/Mika.html
参考他的原始码来做的
做出来了之後没想到FPS低到差点吐血
我用的测试机是HTC OneX
所以深度资讯的array就用原生的1280x720
(PS:我是用sampler的buffer来丢深度资讯)
结果计算array以及把array丢进shader的buffer
没想到100 frames竟然需要47539ms!!
(算深度 23xxx,丢进buffer 23xxx)
等於等於FPS只有2....XDDDDDDDDDDD
( 题外话
( 另外android放进buffer的方式有两种
( 1. buffer.array()[index] = depth[index]
( 2. buffer.position(index)
( buffer.put(depth[index])
( 上面说的时间是-1-的时间
( -2-更高达73493ms
( 偏偏第一种方法在一些比较早期的手机会crash....
後来我把buffer改小剩下125x62就超顺 (约700ms)
只是解析度有点悲壮
原本期待第一种更变z轴buffer的方法
不过後来想想他也是堆进buffer啊....
只是还没试就是了
很想让深度资讯丢给shader自己算
可是参考那个网页的演算法
每次的深度资讯都需要前一次的深度资讯来计算
等於必须要存下每次的计算结果
不过shader program好像没有办法拿来储存结果?
看youtube别人的demo都跑好顺
不知道自己哪个环节出了错
请教板上的前辈有没有什麽好的建议?
感谢耐心看完!
後面附上片段的code
==计算深度的code==
for (int y = 1; y < rippleHeight - 1; y++) {
for (int x = 1; x < rippleWidth - 1; x++) {
rippleMap[y][x][1-bufferSwitch] = (((rippleMap[y][x+1][bufferSwitch]
+ rippleMap[y][x-1][bufferSwitch]
+ rippleMap[y+1][x][bufferSwitch]
+ rippleMap[y-1][x][bufferSwitch] )
/ 2f - rippleMap[y][x][1-bufferSwitch] )*rippleViscosity);
}
}
// PS:bufferSwitch是用来区分前後两次深度值的array
==array丢进buffer的code==
for (int y = 0; y < rippleHeight; y++) {
int tempY = y*rippleWidth*4;
for (int x = 0; x < rippleWidth; x++) {
depthBuffer.array()[tempY+x*4] =
(byte)(rippleMap[y][x][1-bufferSwitch]*rippleAmpRatio + 127);
}
}
==array丢进buffer的另一个方法==
==所花时间是上面那个方法的两倍,不过某些型号的手机只能用这个方法==
for (int y = 0; y < rippleHeight; y++) {
int tempY = y*rippleWidth*4;
for (int x = 0; x < rippleWidth; x++) {
depthBuffer.position(tempY+x*4);
depthBuffer.put(
(byte)(rippleMap[y][x][1-bufferSwitch]*rippleAmpRatio + 127));
}
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.24.6.218
1F:推 littleshan:这个可以用shader算,用render to texture就可以存结果 03/21 01:37
马上来研究看看!
感谢提供关键字!
2F:→ azureblaze:你需要使用shader 03/21 01:37
我是有写shader,
不过我一直以为没办法让shader算的结果存起来QQ"
※ 编辑: Morshues 来自: 114.24.6.218 (03/21 22:07)
3F:推 cjcat2266:VertexShader可以存结果,google "transform feedback" 03/22 01:36
4F:推 Killercat:普通都是丢pixel shader忽略掉y轴 03/22 12:10
5F:→ Killercat:要用vs的话 效能一定会被吃很大 直接用ps作弊会好点 03/22 12:11
6F:→ Killercat:当然你要做的很拟真就得vs或者gs(D3D11+)了 03/22 12:12
7F:→ Killercat:如果你用gs实作成功记得分享一下 关於gs资料真的太少=P 03/22 12:13
8F:推 Bencrie:gs 资料应该不算少吧 03/22 14:58
9F:→ bachi95:GL ES2应该没有支援geometry shader 03/22 16:20
10F:推 Bencrie:没注意到是 GLES2 XD 03/23 01:00