扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 110|回复: 0

[转载发布] 抛砖引玉 mv中使用shader

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    2025-2-4 02:05
  • 签到天数: 110 天

    连续签到: 2 天

    [LV.6]常住居民II

    2327

    主题

    395

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    10475
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    13225

    灌水之王

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




    至于用法 我随便找了个地方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);


                 本帖来自P1论坛作者yagami,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=403202  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2025-3-10 22:03 , Processed in 0.135660 second(s), 53 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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