设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 9693|回复: 28
打印 上一主题 下一主题

[已经过期] Pixel Shader[来吧 杀了这个就能升级了]

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
182 小时
注册时间
2012-2-11
帖子
233
跳转到指定楼层
发表于 2013-4-3 08:14:04 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 viktor 于 2013-4-3 21:39 编辑

===拿出所有的VIP悬赏 跪求能够在RM中使用Shader的脚本===



具体要求:
能够使用Shader对RM的Bitmap进行操作,或者使用其他的合适方式,引入Shader对RM的画面进行处理也行
处理速度要能满足实时处理:至少20fps吧
使用的hlsl/cg脚本很容易在脚本里修改
原创脚本或者在网上搜索的都可以(虽然在下已经粗略地搜索过了,没有相关内容),请提供一个中文或者英文的样例

现在的讨论进展:
  • 既然我诚心诚意地问了,那么一定有解决的办法,如果想放弃RGSS,请出门左转Unity
  • 本帖也是探讨一下使用Shader处理Bitmap的可行性,如果您觉得【不可能!】或者【不可能实时!】请说出您的理由,我也会重新考虑这个问题的可行性。如果真的不能做到,那么悬赏的VIP也会分给能提出充分理由的童鞋。
  • 关于那个视野脚本,如果Shader问题能够顺利解决,我会第一时间发一个XP/VA的版本呢。至于现在,我并不想发一个半成品。





以下是背景资料和线索

1【Shader是什么?】
pixel shader是在显卡上执行的一种程序。它可以高效地对纹理的每一个像素进行运算。
这使我们能够实时地完成多种特殊效果,比如多重纹理、逐像素光照、视野深度、云层仿真、火焰仿真和复杂阴影技术。
可以部分理解为使用显卡,实时地对游戏的图片进行PS

2 【为什么RM需要Shader?】
为了更炫丽的效果。
有很多前辈都开发过RM的图片滤镜库,例如6R天干宝典中就有“图片滤镜效果样例”,或者11区的WF-RGSS,或者RMVA自带的Bitmap.blur/radial_blur模糊效果。
但是这些库里面各种效果都没有办法实时使用,原因就是“这一操作需要时间”

因为它们都是使用CPU进行计算,没有利用到显卡。
而Shader的最大特点就是他完全是在显卡里运行,非常高效而且不耗CPU。现在即使是集显也支持相当数量的Shader效果

3 【有什么线索么?】
在下不会DX,知道的只有以下这些:
http://blog.csdn.net/pizi0475/article/details/4241024
RM的Bitmap,其实就是DX的纹理。所以用Pixel Shader去操作RM的图片,实际上是对纹理进行操作

4 【我拿这个准备用在哪里】
Shader有很多用途,上面已经说了。
我自己写了一个实时视野光效的脚本,现在需要增加一个动态模糊效果,否则效果只能是这样的……

如果有了动态模糊,这个光影就会变得非常自然。我曾经用那个WF-RGSS试过,非常慢(0.5fps)


再次跪谢


@喵呜喵5 @晴兰 @yangff @凌童鞋  
堵上人参的悬赏,当掉了骑士的高头大马,重新拿起量产型长剑

点评

不明觉厉,纯支持……  发表于 2013-4-3 13:57

Lv1.梦旅人

秋寒

梦石
0
星屑
63
在线时间
801 小时
注册时间
2013-1-17
帖子
1992
28
发表于 2013-4-25 13:02:00 | 只看该作者
建议下个《少侠一炷香》开源版,记得里面有一个技能使用后突然全场变黑白,效果差不多吧...

点评

那个黑白用事件就可以做吧。改变画面色调  发表于 2013-4-26 12:18
嗯用Shader做黑白很容易 我去下一个看看~~  发表于 2013-4-26 11:47
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
182 小时
注册时间
2012-2-11
帖子
233
27
 楼主| 发表于 2013-4-24 14:09:04 | 只看该作者
yangff 发表于 2013-4-4 23:58
我懂了,你的光照是一个窗口大小的bitmap是吧。
很遗憾的告诉你……就算你用了Shader,优化效果不会特别 ...

果然是我想复杂了。
如果光是为了做视野的话,根本不需要用到Shader,只要能用DX往画面上叠加3D模型就好了。

如果屏幕是20x15格的话 ,就搞一个20x15格的3D平面模型,顶点是每个格子的中心点,
然后顶点的颜色是那个格子的亮度,格子中间的颜色让他自己去插值。
设置合适的视角让他显示出来和屏幕一样大。
生成了这样一个3D模型以后,渲染到纹理,然后传送给RGSSBitmap 就可以了。

但是这个问题还是留在这里。毕竟用了Shader可以实现更多的功能啊
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

26
发表于 2013-4-5 19:06:35 | 只看该作者
除非你不用RMAV,否则不可能,因为语言不同,就算转换成同种语言也不会是一种效果
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

25
发表于 2013-4-5 16:01:39 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
182 小时
注册时间
2012-2-11
帖子
233
24
 楼主| 发表于 2013-4-5 15:22:21 | 只看该作者
本帖最后由 viktor 于 2013-4-5 15:29 编辑
yangff 发表于 2013-4-4 23:58
我懂了,你的光照是一个窗口大小的bitmap是吧。
很遗憾的告诉你……就算你用了Shader,优化效果不会特别 ...


恩……好吧我还是把视野脚本悄悄地贴出来吧。关于实现原理在这里不想做更多的解释了,看了就知道了其实做法很水 而且也并不是真正的【光照】计算。
因为我根本就没有想要做光照 只是想做一个根据当前的地图障碍物的情况改变视野明暗的,实时的 但是是伪的 视野效果。这个效果有点像是Elona的那种

主要的函数是iterate_tiles和update_bitmap,像素填充和准备做的模糊都写在update_bitmap里面,那个也是主要要优化的地方
http://blog.csdn.net/xulai1001/article/details/8761416
@Sion @yangff  
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

23
发表于 2013-4-4 23:58:35 | 只看该作者
本帖最后由 yangff 于 2013-4-5 00:01 编辑
viktor 发表于 2013-4-4 22:43
另外因为我暂时只需要对1个大的Bitmap进行处理,从效率上来说,就按你先前说的,先拷贝过去,再处理,再 ...


我懂了,你的光照是一个窗口大小的bitmap是吧。
很遗憾的告诉你……就算你用了Shader,优化效果不会特别明显(比Ruby肯定快,但是和直接用C操作),而且这种实现其实是有问题的。
首先,你是要计算一个BrightnessMap作为每个像素的亮度,
如果直接
for i in 0...width
  for j in 0...height
  end
end
的话非常慢(O(N^2))(其实我搞不懂你为什么一定要用模糊)。
另外我也不知道你到底用了什么算法计算:
是根据光源暴力扩展亮度还是根据距离和轮廓线进行计算……
【另外提一点,这里可以用kdtree优化……具体看《计算几何算法与应用》光线采样什么的。。】

但是实际上就算你用了shader……也不能改变内存和显存交换数据的问题……
(如果要做到兰兰所谓的单向,仅仅外包一个dx是不够的)
数据交换还是width*height的……

所以我还是坚持,MMX解决问题……

另外,我不知道你是怎么把光源合成进地图的。
如果是修改地图的亮度,然后把光源用加法合成上去……其实是会出问题的。
不细说,你把全局亮度调到0,然后光源亮度随便给,东西会全部没掉。
不过如果是固定alpha然后修改颜色……虽然可以……但是其实效果比较坑爹。。

点评

另外对于填充像素,C实现和Ruby脚本速度没多大区别。毕竟只有MMX或者Shader才是game-changing的。而Shader能做的会更多,不仅仅是模糊。  发表于 2013-4-5 15:31
我现在是用O((N/32)^2)的办法计算的亮度,所以需要加上模糊,差不多就是暴力扩展。交换数据并不是问题。比如Blt整个屏幕,也还是很快的。  发表于 2013-4-5 15:24
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
182 小时
注册时间
2012-2-11
帖子
233
22
 楼主| 发表于 2013-4-4 22:43:23 | 只看该作者
yangff 发表于 2013-4-4 13:21
如果只是这样用shader的话,直接用兰兰的DxRuby就行了。
不过我很奇怪,这种覆盖的操作方式是怎么处理加 ...

另外因为我暂时只需要对1个大的Bitmap进行处理,从效率上来说,就按你先前说的,先拷贝过去,再处理,再拷贝回来,那也是完全可以接受的。
所以就按你说的做一个就行了~不要想那么多

1. 把Bitmap的内容拷贝到DX可以处理的结构里
2.渲染
3.拷回来

我会拿DxRuby试一下的

点评

用了DX11你会发现……shader真是又爱又恨啊。。  发表于 2013-4-4 23:13
主要是最近折腾DX11有点蛋疼= =|  发表于 2013-4-4 23:13
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

21
发表于 2013-4-4 13:21:35 | 只看该作者
本帖最后由 yangff 于 2013-4-4 13:35 编辑
viktor 发表于 2013-4-4 12:29
不需要操作Tilemap,只需要引用里面的地形标记。现在是直接Fill_rect填充32x32的格子,每帧大概0-800次操 ...


如果只是这样用shader的话,直接用兰兰的DxRuby就行了。
不过我很奇怪,这种覆盖的操作方式是怎么处理加法和减法的?
另外,你这样的操作(我是指你现在这种效果,其实不用fillrect,直接操作单点,然后zoom=32就行了……)
模糊不是很理解,阙值多少?
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
182 小时
注册时间
2012-2-11
帖子
233
20
 楼主| 发表于 2013-4-4 12:29:32 | 只看该作者
yangff 发表于 2013-4-4 10:12
LZ的做法我只想知道,会不会涉及到对tilemap图元的操作,如果不会(也就是简单的加法减法合成,给方块光 ...

不需要操作Tilemap,只需要引用里面的地形标记。现在是直接Fill_rect填充32x32的格子,每帧大概0-800次操作,是可以流畅运行的。
但是我还需要动态模糊效果。所以想到用shader
当然如果使用MMX混合的话,还有一种办法就是做一个32x32的圆形渐变图,把它按照当前格子的亮度值 blend到光照mask上面,但是这样做也就是15年前云风那个时代使用的折中的处理办法。在云风的博客里面也有很多相关内容。相比之下,如果能够使用Shader 岂不更加优美一些?
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

19
发表于 2013-4-4 10:12:10 | 只看该作者
本帖最后由 yangff 于 2013-4-4 10:20 编辑
晴兰 发表于 2013-4-4 00:27
不管你怎么界定,和我相同也好不同也好(二进制层面上是不分引用/导入/需要/包含啥的。。),
现在的实际 ...


LZ的做法我只想知道,会不会涉及到对tilemap图元的操作,如果不会(也就是简单的加法减法合成,给方块光源增加梯度),我有不需要shader的处理方法(在RM的最后一次描绘的之后直接MMX修改,效率不会太差,至少640*480.。)。

如果只是问题本身的话,绝对是要dd7hook的,这货谁爱弄谁弄去。
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-9 02:50

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表