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

Project1

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

[原创发布] 抛砖引玉 mv中使用shader

[复制链接]

Lv3.寻梦者

梦石
0
星屑
3439
在线时间
3054 小时
注册时间
2011-11-17
帖子
980
跳转到指定楼层
1
发表于 2017-10-4 11:54:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
虽然我已经不用rm了 为了庆祝论坛复活 国庆期间看了下mv 于是就有了这东西
JAVASCRIPT 代码复制
  1. function Sprite_Shader() {
  2.     this.initialize.apply(this, arguments);
  3. }
  4. Sprite_Shader.defultfrag = " \
  5.     varying vec2 vTextureCoord; \
  6.     uniform sampler2D uSampler; \
  7.     void main(void) \
  8.     { \
  9.         gl_FragColor = texture2D(uSampler, vTextureCoord); \
  10.     } \
  11. ";
  12.  
  13.  
  14. Sprite_Shader.defultvert= " \
  15.     attribute vec2 aVertexPosition; \
  16.     attribute vec2 aTextureCoord; \
  17.     uniform mat3 projectionMatrix; \
  18.     varying vec2 vTextureCoord; \
  19.     void main(void) \
  20.     { \
  21.         gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); \
  22.         vTextureCoord = aTextureCoord; \
  23.     } \
  24.     ";
  25.  
  26. Sprite_Shader.prototype = Object.create(Sprite.prototype);
  27. Sprite_Shader.prototype.constructor = Sprite_Shader;
  28.  
  29. Sprite_Shader.prototype.initialize = function(bitmap) {
  30.     Sprite.prototype.initialize.call(this);
  31.     this.bitmap = bitmap;
  32.     this.mode = -1;   
  33. };
  34.  
  35.  
  36. Sprite_Shader.prototype.gray = function() {
  37.     this.mode= 1;
  38.     var frag = " \
  39.         varying vec2 vTextureCoord; \
  40.         uniform sampler2D uSampler; \
  41.         void main(void) \
  42.         { \
  43.             gl_FragColor = texture2D(uSampler, vTextureCoord); \
  44.             float  gray = (gl_FragColor.r + gl_FragColor.g + gl_FragColor.b)/3.0; \
  45.             gl_FragColor.r = gray; \
  46.             gl_FragColor.g = gray; \
  47.             gl_FragColor.b = gray; \
  48.         } \
  49.     ";
  50.     var simpleShader = new PIXI.AbstractFilter(Sprite_Shader.defultvert,frag);
  51.     this._filters = [simpleShader];
  52. };
  53.  
  54.  
  55.  
  56. Sprite_Shader.prototype.shadow = function() {
  57.     this.mode= 2;
  58.     var uniform = {};
  59.  
  60.     var frag = " \
  61.         varying vec2 vTextureCoord; \
  62.         uniform sampler2D uSampler; \
  63.         const vec2 step = vec2(0.015, 0.002); \
  64.         void main(void) \
  65.         { \
  66.             vec3 color = texture2D(uSampler, vTextureCoord).rgb; \
  67.             float olda =  texture2D(uSampler, vTextureCoord).a; \
  68.             float weight = 10.0; \
  69.             float assess = texture2D(uSampler, vTextureCoord).a * weight; \
  70.             float alpha = assess; \
  71.             alpha += texture2D( uSampler, vTextureCoord.xy + vec2( -3.0*step.x, -3.0*step.y ) ).a; \
  72.             alpha /= (2.0+assess);  \
  73.             gl_FragColor = vec4(color, alpha); \
  74.         } \
  75.     ";
  76.     var simpleShader = new PIXI.AbstractFilter(Sprite_Shader.defultvert,frag,uniform);
  77.     this._filters = [simpleShader];
  78. };
  79.  
  80.  
  81.  
  82. Sprite_Shader.prototype.twist = function() {
  83.     this.mode= 3;
  84.     this.uniform = {};
  85.     this.uniform.iGlobalTime = {
  86.         type:"f",
  87.         value:0
  88.     }
  89.  
  90.     frag = " \
  91.         varying vec2 vTextureCoord; \
  92.         uniform sampler2D uSampler; \
  93.         uniform float iGlobalTime; \
  94.         void main(void) \
  95.         { \
  96.             vec2 uv = vTextureCoord.xy; \
  97.             float w = (0.5 - (uv.x)); \
  98.             float h = 0.5 - uv.y; \
  99.             float distanceFromCenter = sqrt(w * w + h * h); \
  100.             float sinArg = distanceFromCenter * 10.0 - iGlobalTime * 10.0; \
  101.             float slope = cos(sinArg) ; \
  102.             vec4 color = texture2D(uSampler, uv + normalize(vec2(w, h)) * slope * 0.05); \
  103.             gl_FragColor = color; \
  104.         } \
  105.     ";
  106.     var simpleShader = new PIXI.AbstractFilter(Sprite_Shader.defultvert,frag,this.uniform);
  107.     this._filters = [simpleShader];
  108. };
  109.  
  110. Sprite_Shader.prototype.magic = function(mode) {
  111.     this.mode= 4;
  112.     this.uniform = {};
  113.     this.uniform._Angle = {
  114.         type:"f",
  115.         value:0
  116.     };
  117.       this.uniform._Radius = {
  118.         type:"f",
  119.         value:0
  120.     };
  121.       this.uniform._mode = {
  122.         type:"f",
  123.         value:mode
  124.     };
  125.  
  126.     frag = " \
  127.         varying vec2 vTextureCoord; \
  128.         uniform sampler2D uSampler; \
  129.         uniform float _Angle;  \
  130.         uniform float _Radius;  \
  131.         uniform float _mode;  \
  132.         void main(void) \
  133.         { \
  134.             vec2 uv = vTextureCoord; \
  135.             uv -= vec2(0.25, 0.5); \
  136.             float dist = length(uv); \
  137.             float percent = (_Radius - dist) / _Radius; \
  138.             if (percent < 1.0 && percent >= 0.0) \
  139.             {  \
  140.                 float theta = percent * percent * _Angle * 3.0; \
  141.                 float s = sin(theta); \
  142.                 float c = cos(theta); \
  143.                 uv = vec2(uv.x*c - uv.y*s*_mode , uv.x*s + uv.y*c); \
  144.             } \
  145.             uv += vec2(0.25, 0.5); \
  146.             gl_FragColor = texture2D(uSampler, uv); \
  147.         } \
  148.     ";
  149.     var simpleShader = new PIXI.AbstractFilter(Sprite_Shader.defultvert,frag,this.uniform);
  150.     this._filters = [simpleShader];
  151. };
  152.  
  153.  
  154. Sprite_Shader.prototype.update = function() {
  155.     Sprite.prototype.update.call(this);
  156.     if(this.mode == 3){
  157.         this._filters[0].uniforms.iGlobalTime += 0.01;
  158.     }
  159.     else if(this.mode == 4){
  160.         this._filters[0].uniforms._Angle += 0.01;
  161.         this._filters[0].uniforms._Radius += 0.001;
  162.         if (this._filters[0].uniforms._Radius >= 0.6)
  163.         {
  164.             this._filters[0].uniforms._Angle = 0;
  165.             this._filters[0].uniforms._Radius = 0.1;
  166.         }
  167.     }
  168. };




至于用法 我随便找了个地方addchild
var test1 = new Sprite_Shader(ImageManager.loadPicture("Actor1_3"));
    test1.magic(-1);
    this.addChild(test1);

    var test2 = new Sprite_Shader(ImageManager.loadPicture("Actor1_3"));
    test2.magic(1);
    test2.x = 280;
    test2.y = 0;
    this.addChild(test2);

    var test3 = new Sprite_Shader(ImageManager.loadPicture("Actor1_3"));
    test3.twist();
    test3.x = 560;
    test3.y = 0;
    this.addChild(test3);


    var test4 = new Sprite_Shader(ImageManager.loadPicture("Actor1_3"));
    test4.shadow();
    test4.x = 0;
    test4.y = 300;
    this.addChild(test4);

    var test5 = new Sprite_Shader(ImageManager.loadPicture("Actor1_3"));
    test5.gray();
    test5.x = 560;
    test5.y = 300;
    this.addChild(test5);

评分

参与人数 3星屑 +200 梦石 +1 +2 收起 理由
石林尘影 + 1 认可答案
余烬之中 + 200 + 1 原创发布
fux2 + 1 精品文章

查看全部评分

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
39630
在线时间
7484 小时
注册时间
2009-7-6
帖子
13483

开拓者贵宾

2
发表于 2017-10-4 17:56:06 | 只看该作者
果然有人把pixi里的这玩意拿出来玩

点评

这东西 迟早得被挖掘,而且和美术资源一样 就算自己数学差脑补不出效果, 网上有大把的 cocos unity 现成的shader 拿来参考修改  发表于 2017-10-4 19:29
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3263
在线时间
3616 小时
注册时间
2006-9-6
帖子
37399

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

3
发表于 2017-10-4 21:33:54 | 只看该作者
变化范围不能超过原图尺寸是不是有点遗憾了

点评

解决方案有很多,懒得解决的话增加图片透明区域即可,图形学这个深坑我也只是抛砖的菜鸟  发表于 2017-10-4 23:31
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14218
在线时间
718 小时
注册时间
2011-7-16
帖子
1428

开拓者

4
发表于 2017-10-6 19:35:22 | 只看该作者
强,只能膜拜,已经挖不动了

点评

照葫芦画瓢就行了  发表于 2017-10-7 13:12
RMMV网络插件,开源免费,内含服务器端,无需强制登录,云数据,弹幕,云存档,排名,兑换码,版本检测,可自由上架下架删除。q群399090587
免打包运行MV游戏,云游戏,安卓App雷神游戏厅,在线玩游戏,上传下载游戏
开源游戏:重装机兵之重装归来【RMMV制作】全球首款按照美剧分季分集的方式发布的游戏
体素画 -- MV画3D像素图的画板
RMMV显示3D模型和场景的插件
RMMV显示spine骨骼动画的插件
RMMV秘密通道插件
突破敌群数量上限8个的插件
在rmmv中显示gif动态图片的插件
一款可以在mv游戏界面的任意位置显示任意文字的插件
RMMV Toast 插件 带物品得失提示,可以设置开启关闭 兼容yep itemcore
制作一个改名卡道具插件、调整标题页面菜单的插件、在标题页面之前显示大段文字的插件、标题页面显示版本号的插件
物品得失自动提示自动上色自动换行插件
我的Q群 663889472
另外,我的插件、范例、游戏都在这里
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
69
在线时间
0 小时
注册时间
2018-11-30
帖子
32
5
发表于 2018-11-30 05:08:20 | 只看该作者
感谢楼主分享
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-23 20:05

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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