zoukankan      html  css  js  c++  java
  • cocos2d 3.X Shader 变暗和变灰

    转自http://www.waitingfy.com/archives/1741

    1.为了节约一张图引发的Shader使用 

    我们注意到这个游戏当中经常使用一些按钮,美术会给两张图,一张稍微暗点,表示按下的状态。但是这样的图一多起来,就比较占用资源。Sprite更改颜色无法表现出这样的效果。想起来Shader可以。

    2.变灰是比较常见

    Cocos2d-x中有一个变灰的例子,这里就列出shader代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifdef GL_ES
    precision mediump float;
    #endif
      
    varying vec4 v_fragmentColor;
    varying vec2 v_texCoord;
      
    void main(void)
    {
        vec4 c = texture2D(CC_Texture0, v_texCoord);
        gl_FragColor.xyz = vec3(0.2126*c.r + 0.7152*c.g + 0.0722*c.b);
        gl_FragColor.w = c.w;
    }

    那几个系数相加会等于1,不同的调整会有不同的效果。效果图:

    20150717165840290.jpg

    第一张就是变灰的效果图,但是离第3张的效果还有距离啊。

    3.变暗的原理

    搞过图形学的应该会比较容易知道,我也是搜索了才知道,我们知道白色是1或者255,黑色是0. 当一个颜色越接近0表示越接近黑色。也就是说,只要把每个像素的颜色乘以一个比1小的数,就会有变暗的效果了!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #ifdef GL_ES
    precision mediump float;
    #endif
      
    varying vec4 v_fragmentColor;
    varying vec2 v_texCoord;
      
    void main(void)
    {
        vec4 c = texture2D(CC_Texture0, v_texCoord);
        float greyNum = 0.75;
        vec4 final = c;
        final.r = c.r * greyNum;
        final.g = c.g * greyNum;
        final.b = c.b * greyNum;
      
        gl_FragColor = final;
    }

    我这里设置的是0.75

    最终效果图:

    20150717170259938.jpg

    已经非常接近第3张我们需要的目标图了。这样就可以省下一半的图片了。不知道渲染速度会不会慢。

    来源网址:http://www.waitingfy.com/archives/1741

  • 相关阅读:
    cs硕士妹子找工作经历【阿里人搜等互联网】
    EJB到底是什么,真的那么神秘吗??
    到底EJB是什么
    安全性测试:
    掌握 Promise 的逻辑方法
    VS2019 不能下载的解决办法
    Java8基础系列-Stream
    周期模型(典型的几种):
    软件生存周期及其模型是什么?
    试述软件的概念和特点?软件复用的含义?构件包括哪些?
  • 原文地址:https://www.cnblogs.com/cocox/p/4660713.html
Copyright © 2011-2022 走看看