查看: 14255|回复: 15

[RMVA发布] [RMVA]游戏画面滤镜(目前有马赛克/浮雕/雪花屏)

[复制链接]

老黄鸡

梦石
4
星屑
45692
在线时间
7947 小时
注册时间
2009-7-6
回帖
13335

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2016-9-11 15:19:35 | 显示全部楼层 |阅读模式

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

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

×
http://pan.baidu.com/s/1sl1ydVB 密码:fux2
先扔范例。(注:范例不带DLL文件)

这个东西就作为回归之作扔出来好了

虽说之前有地图特效的脚本存在,但本帖的这玩意可不是把画面截图然后做特效处理那么简单的东西,
这东西具有“高效”、“全局适用”的特点,几乎不影响游戏FPS。

先扔脚本和几张预览图
[fold=点我展开脚本][pre lang="ruby"]class String
  
  def byte_length
    ret = 0
    self.each_byte{ret+=1}
    ret
  end
  
  def address
    [self].pack("p").unpack("L")[0]
  end
  
end

module Fux2
  
  module Win32Tools
   
    @@hModule = 0
   
    RtlMoveMemoryLP = Win32API.new('kernel32','RtlMoveMemory','lpl','l')
    RtlMoveMemoryPL = Win32API.new('kernel32','RtlMoveMemory','pll','l')
    GetModuleHandle = Win32API.new('kernel32','GetModuleHandle','p','l')
    VirtualProtect = Win32API.new('kernel32','VirtualProtect','lllp','l')
    GetProcAddress = Win32API.new('kernel32','GetProcAddress','lp','l')
    CallWindowProc = Win32API.new('user32','CallWindowProc','ppll','v')
    GetLastError = Win32API.new('kernel32','GetLastError','v','l')
   
    def self.readmem(buf,addr,len)
      RtlMoveMemoryPL.call(buf,addr,len)
    end
   
    def self.writemem(addr,buf,len)
      RtlMoveMemoryLP.call(addr,buf,len)
    end
   
    def self.unprotect(addr,len)
      VirtualProtect.call(addr,len,0x40,"\0"*4)
    end
   
    def self.init
      
    end
   
    def self.cache_module_handle
      @@hModule = GetModuleHandle.call("RGSS300.dll")
      @@hGdi32 = GetModuleHandle.call("gdi32.dll")
    end
   
    def self.module_handle
      @@hModule
    end
   
    def self.gdi32_handle
      @@hGdi32
    end

    def self.callfunc(funcstr,args)
      CallWindowProc.call(funcstr,args,0,0)
    end
   
    def self.getprocaddress(procname)
      GetProcAddress.call(module_handle,procname)
    end
   
    def self.getgdiprocaddress(procname)
      GetProcAddress.call(gdi32_handle,procname)
    end
   
    cache_module_handle
  end

  module Chicken
   
    @@hwnd = 0
   
    Addr_Close_Catch = Win32Tools.module_handle+0x17F396
    Addr_Eval = Win32Tools.module_handle+0xC580
    Addr_Hwnd = Win32Tools.module_handle+0x25EB00
   
    def self.unprotectfunc(func)
      Fux2::Win32Tools.unprotect(func.address,func.byte_length)
    end

    def self.get_hwnd
      rem = "\0"*4
      Fux2::Win32Tools.readmem(rem,Addr_Hwnd,4)
      base_addr = rem.unpack("L")[0]
      Fux2::Win32Tools.readmem(rem,base_addr+8,4)
      @@hwnd = rem.unpack("L")[0]
    end
   
    def self.hwnd
      @@hwnd
    end
   
    def self.init
      get_hwnd
    end
   
  end
  
  module CodeBox
   
    @@rem_vars = "\0"*200
   
    Nothing = "\x90"*12

    Dirt = [0x60,0xBB,@@rem_vars.address,0x8B,0x72,0x48,0x8B,0x7A,0x4C,0x8B,0x52,0x10,0x0F,0xAF,0xF7,0x8B,0xFA,0x33,0xC9,0xC7,0x43,0x30,0x00,0x00,0x00,0x00,0xC7,0x43,0x34,0x00,0x00,0x00,0x00,0x3B,0xCE,0x0F,0x8D,0x9D,0x00,0x00,0x00,0x33,0xC0,0x33,0xD2,0x56,0x33,0xF6,0x8A,0x04,0x8F,0x8A,0x53,0x34,0x2A,0xC2,0x66,0x05,0x80,0x00,0x66,0xBE,0x03,0x00,0x66,0xF7,0xEE,0x66,0xBE,0x0A,0x00,0x66,0xF7,0xF6,0x88,0x43,0x38,0x33,0xC0,0x33,0xD2,0x33,0xF6,0x8A,0x44,0x8F,0x01,0x8A,0x53,0x34,0x2A,0xC2,0x66,0x05,0x80,0x00,0x66,0xBE,0x3B,0x00,0x66,0xF7,0xEE,0x66,0xBE,0x64,0x00,0x66,0xF7,0xF6,0x88,0x43,0x39,0x33,0xC0,0x33,0xD2,0x33,0xF6,0x8A,0x44,0x8F,0x01,0x8A,0x53,0x36,0x2A,0xC2,0x66,0x05,0x80,0x00,0x66,0xBE,0x0B,0x00,0x66,0xF7,0xEE,0x66,0xBE,0x64,0x00,0x66,0xF7,0xF6,0x88,0x43,0x3A,0x8A,0x44,0x8F,0x03,0x88,0x43,0x3B,0x8A,0x43,0x38,0x02,0x43,0x39,0x02,0x43,0x3A,0x02,0x43,0x3B,0x88,0x04,0x8F,0x88,0x44,0x8F,0x01,0x88,0x44,0x8F,0x02,0x8B,0x43,0x30,0x89,0x43,0x34,0x8B,0x04,0x8F,0x89,0x43,0x30,0x5E,0x41,0xE9,0x5B,0xFF,0xFF,0xFF,0x61,*([0x90]*120)].pack("C2LC*")
    Emboss = [0x60,0xBB,@@rem_vars.address,0x8B,0x72,0x48,0x8B,0x7A,0x4C,0x8B,0x52,0x10,0x0F,0xAF,0xF7,0x8B,0xFA,0x8B,0x0F,0x89,0x4B,0x30,0xC7,0x43,0x34,0x00,0x00,0x00,0x00,0x33,0xC9,0x3B,0xCE,0x0F,0x8D,0x83,0x00,0x00,0x00,0x56,0x8B,0x04,0x8F,0x89,0x43,0x50,0x33,0xC0,0x33,0xD2,0x33,0xF6,0x8A,0x04,0x8F,0x8A,0x53,0x34,0x2B,0xC2,0x05,0x80,0x00,0x00,0x00,0x6B,0xC0,0x26,0x89,0x43,0x40,0x33,0xC0,0x33,0xD2,0x8A,0x44,0x8F,0x01,0x8A,0x53,0x34,0x2B,0xC2,0x05,0x80,0x00,0x00,0x00,0x6B,0xC0,0x4B,0x89,0x43,0x44,0x33,0xC0,0x33,0xD2,0x8A,0x44,0x8F,0x01,0x8A,0x53,0x36,0x2B,0xC2,0x05,0x80,0x00,0x00,0x00,0x6B,0xC0,0x0F,0x89,0x43,0x48,0x03,0x43,0x44,0x03,0x43,0x40,0xC1,0xE8,0x07,0x3D,0xFF,0x00,0x00,0x00,0x7E,0x05,0xB8,0xFF,0x00,0x00,0x00,0x88,0x04,0x8F,0x88,0x44,0x8F,0x01,0x88,0x44,0x8F,0x02,0x8B,0x43,0x30,0x89,0x43,0x34,0x8B,0x43,0x50,0x89,0x43,0x30,0x5E,0x41,0xE9,0x75,0xFF,0xFF,0xFF,0x61,*([0x90]*120)].pack("C2LC*")
    Mosaic = [0x60,0xBB,@@rem_vars.address,0x8B,0x72,0x48,0x8B,0x7A,0x4C,0x8B,0x52,0x10,0x89,0x53,0x20,0x33,0xC9,0x33,0xD2,0x3B,0xD7,0x7D,0x33,0x3B,0xCE,0x7D,0x29,0x8B,0x43,0x20,0x51,0x52,0x0F,0xAF,0xD6,0x03,0xD1,0x6B,0xD2,0x04,0x8B,0x0C,0x10,0x89,0x4C,0x10,0x04,0x03,0xD6,0x03,0xD6,0x03,0xD6,0x03,0xD6,0x89,0x0C,0x10,0x89,0x4C,0x10,0x04,0x5A,0x59,0x41,0x41,0xEB,0xD3,0x42,0x42,0x33,0xC9,0xEB,0xC9,0x61,*([0x90]*120)].pack("C2LC*")
   
  end

  module Graphics_Filter
   
    include CodeBox
   
    Inject_Addr = Win32Tools.module_handle+0x10FEFE

    def self.init
      rem_origin
      calc_all
      inject_filter(Nothing)
    end
   
    def self.rem_origin
      @@rem_origin = "\0"*7
      readmem(@@rem_origin,Inject_Addr,7)
      @@rem_inject = {}
    end
   
    def self.calc_all
      CodeBox.constants.each do |cn|
        con = CodeBox.const_get(cn)
        Chicken.unprotectfunc(con)
        cad = con.address
        cal = con.byte_length
        retn_addr = Inject_Addr+5-cad-cal
        hook_addr = cad-Inject_Addr-5
        @@rem_inject[cad] = hook_addr
        ender = [*@@rem_origin.unpack("C*"),0xE9,retn_addr].pack("C7CL")
        writemem(cad+cal-12,ender,12)
      end
    end
   
    def self.writemem(addr,buf,len)
      Win32Tools.writemem(addr,buf,len)
    end
   
    def self.readmem(buf,addr,len)
      Win32Tools.readmem(buf,addr,len)
    end
   
    def self.inject_filter(str)
      delete_filter
      hook_addr = @@rem_inject[str.address]
      writemem(Inject_Addr,[0xE9,hook_addr,0x90,0x90].pack("CLCC"),7)
    end
   
    def self.delete_filter
      writemem(Inject_Addr,@@rem_origin,7)
    end
   
    def self.start_mosaic
#~       cad = Mosaic.address
#~       cal = Mosaic.byte_length
#~       gcadr = Win32Tools.getgdiprocaddress("GetCurrentObject")-cad-20
#~       gbadr = Win32Tools.getgdiprocaddress("GetObjectA")-cad-29
#~       writemem(cad+16,[gcadr].pack("L"),4)
#~       writemem(cad+25,[gbadr].pack("L"),4)
      inject_filter(Mosaic)
    end
   
    def self.start_emboss
      inject_filter(Emboss)
    end
   
    def self.start_dirt
      inject_filter(Dirt)
    end

    def self.start_inverse
      writemem(Win32Tools.module_handle+0x10FEFA,[0x330008].pack("L"),4)
    end
   
    def self.end_inverse
      writemem(Win32Tools.module_handle+0x10FEFA,[0xCC0020].pack("L"),4)
    end

  end
  
  def self.init
    Win32Tools.init
    Chicken.init
    Graphics_Filter.init
  end
  
  init

end

module Graphics
  class << self

    def apply_filter(med,*args)
      Fux2::Graphics_Filter.method(med).call(*args)
    end
   
    def cancel_filter
      Fux2::Graphics_Filter.delete_filter
    end
   
    def start_inverse
      Fux2::Graphics_Filter.start_inverse
    end
   
    def cancel_inverse
      Fux2::Graphics_Filter.end_inverse
    end

  end
end[/pre][/fold]
 

用法嘛还是参见范例吧。
 
再来几张图

马赛克效果
1.png

浮雕效果
2.png

雪花屏效果,这个要特别说明一下,这个是做浮雕效果无意中做出来的东西,是动态的,
比较影响效率
3.png

画面滤镜范例.rar

304.22 KB, 下载次数: 332

评分

参与人数 7星屑 +779 收起 理由
VIPArcher + 150 你撸多了
子弹君 + 180 怒肛黄鸡
百里_飞柳 + 40 精品文章
天使喝可乐 + 300 肛了
雾影药师 + 10 我很赞同
WantMy蕙 + 33 塞糖
MeowSnow + 66 (。`Д´。)然而窝机智的点进来了.

查看全部评分

RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
梦石
0
星屑
400
在线时间
602 小时
注册时间
2014-5-8
回帖
602
发表于 2016-9-11 15:42:48 | 显示全部楼层
好东西,收下了,谢谢楼主

点评

小尾巴好评  发表于 2016-9-11 20:02

评分

参与人数 1星屑 +6 收起 理由
fux2 + 6 么么哒

查看全部评分

回复

使用道具 举报

漾夕☽星化残月☾

梦石
0
星屑
8604
在线时间
3858 小时
注册时间
2015-5-12
回帖
2021

剧作品鉴家

发表于 2016-9-11 15:59:39 | 显示全部楼层
我是不是x多了....
回复

使用道具 举报

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2016-9-11 16:33:15 | 显示全部楼层
有模糊滤镜吗?

点评

有这么奇怪的需求吗Orz 模糊的效率不知道怎么样,我试试  发表于 2016-9-11 16:37
回复

使用道具 举报

梦石
0
星屑
2724
在线时间
227 小时
注册时间
2016-3-27
回帖
557
发表于 2016-9-11 20:04:49 | 显示全部楼层
你可以看一下诶...ps...对,ps里面的滤镜然后照着多做,比如风格化扭曲等等。
相信lz会做的更好然后把这个脚本发扬!
现在还能改名吗qwq
回复

使用道具 举报

脚本白痴

梦石
0
星屑
422
在线时间
903 小时
注册时间
2007-7-9
回帖
1259
发表于 2016-9-11 21:18:56 | 显示全部楼层
可以强行变16位像素的游戏!

正统向RPG-大雄的高井山奇谈
https://rpg.blue/thread-369758-1-1.html
哆啦A梦RTP风格素材
https://rpg.blue/forum.php?mod=viewthread&tid=394608
回复

使用道具 举报

头像被屏蔽
梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
回帖
1577

开拓者

发表于 2016-9-12 08:27:38 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

梦石
0
星屑
50
在线时间
23 小时
注册时间
2016-9-15
回帖
9
发表于 2016-9-20 21:54:05 | 显示全部楼层
楼主有考虑添加线性过滤,fxaa,bloom这种高大上特效的想法吗?

点评

高级的特效是很好配置,如果对画面改善明显,那么即使做出的游戏更吃配置也是可以接受的,毕竟以后硬件会越来越好  发表于 2016-9-21 15:36
本来是写了双线性过滤的,但是有些影响效率,2x的过滤效果不明显,4x有点模糊。现在作为对bitmap放大进行处理的一个方法了。  发表于 2016-9-21 14:32
回复

使用道具 举报

梦石
0
星屑
50
在线时间
42 小时
注册时间
2016-11-27
回帖
23
发表于 2017-1-22 20:33:33 | 显示全部楼层
Map Effects v1.4.1 for VX and VXace by Zeus81
这个作者的脚本可以实现更多的滤镜效果
     - map_effects.set_linear_blur(角度,长度,宽度)
            线性模糊的一个方向。
     -map_effects.set_linear_blur(0,20,60)

点评

这个Mapeffect就是我主楼中说的,利用截图做的特效处理,而且并不是全局适用。  发表于 2017-1-22 22:30
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部