首先先创建一个Effect,将其命名为FirstShaders。再创建一个Material,将其命名为FirstShaderMat。

选中FirstEffectMat,在属性检查器中,设置Effect为FirstShaders。

双击FirstShaders,打开.effect文件,其中的内容应该如下:

对于绝大多数情况来说,在2D的shader中,顶点着色器中(vs)的代码是不需要改动的,保持原样即可。在3D中,顶点着色器是一个可以进行许多操作从而实现很多效果的部分。

目前仅需知道,其中计算了顶点的坐标,并向片元着色器传递了大量必要的参数。

下面来看片元着色器,这个地方是进行主要操作的地方:

从上向下看,代码块中的第一行:

precision highp float;

此行指定了float数的精度。精度限定符分为

1.lowp 低精度

2.mediump 中精度

3.highp 高精度

精度和数据所需要的空间有关,精度越高,需要的空间也就越大。

继续向下看:

 #include <alpha-test>#include <texture>

这两行表示引入了两个头文件,类似于C/C++中的include。当需要使用其他文件中的内容时,就需要加入对应的头文件,或者是路径。在Cocos3D中,可以使用自定义的Chunk文件,在其中定义一些函数,或者是宏定义。当其他的Effect引入Chunk时,可与直接使用已经写好的函数、宏定义等,使得Effect的编写更加方便。

  in vec4 v_color;

在这一行出现了一个新的修饰符 in。这个可以理解为从顶点着色器中传来的自定义数据。在顶点着色器中,有一行这样的代码:

out vec4 v_color;

并且在main中,对v_color进行了赋值:

v_color = a_color;

关于a_color,也有一行类似的代码:

in vec4 a_color;

可以发现a_color也是传入的。其代表了顶点颜色,在游戏中,就是此材质所在节点上的颜色:

接下来的代码为:

  #if USE_TEXTUREin vec2 v_uv0;uniform sampler2D texture;#endif

这个USE_TEXTURE,在顶点着色器中也可以看到。属性检查器中的位置为:

其代表了一个预处理宏开关,以 #if ...... 开始,#endif 结束。当条件成立时,才会进入其中的逻辑。

v_uv0也是一个从顶点着色器中传入的值。其代表了当前正在处理像素的坐标,左上角为原点,向右为x正方向,向下为y正方向。x和y的范围均为[0, 1]。

这里需要提到一点。从顶点着色器传入片元着色器的值,未必是确切在顶点着色器中计算的值。试想一下,如果对于不同的像素位置,都有一个顶点与其对应,那么该有多少顶点。实际的顶点数量一定是远远小于像素数量的。实际上,不只是v_uv0,在片元着色器中获取的许多值的获取,是通过顶点着色器中的值进行插值计算之后得到的。

texture为需要进行显示的纹理。如果没有进行手动的赋值的话,Cocos会自动地把此材质依附地渲染组件上的纹理赋值给texture属性。

继续向下,就到了主函数的内容:

void main () {vec4 o = vec4(1, 1, 1, 1);#if USE_TEXTURECCTexture(texture, v_uv0, o);#endifo *= v_color;ALPHA_TEST(o);gl_FragColor = o;
}

片元着色器会自动寻找main函数,执行其中的内容。在main函数中,通常包含了对此位置像素的赋值操作。

变量o代表了此坐标上的rgba值。首先会先赋给o一个默认的值vec4(1, 1, 1, 1)。

vec4在不同的情况下,可以解释成不同的涵义。如果是坐标,那就代表了x、y、z、w;如果作为颜色,那就代表了r、g、b、a。vec4(1, 1, 1, 1),就代表了rgba值均为1,为白色。

之后会进入一个预处理宏,如果条件成立的话,会执行:

CCTexture(texture, v_uv0, o);

CCTexture的作用就是对纹理上的某一个坐标进行采样,输出采样获得的颜色值。这个方法会在很多时候用到。这个函数在不勾选INPUT_IS_GAMMA和USE_ALPHA_TEST的时候,和glsl中的函数 texture(sampler2D texture, vec2 uv) 的效果一致。不同的是,CCTexture会将颜色值通过第三个参数返回,texture则会作为函数返回值返回。在默认情况下,纹理上的位置和v_uv0的位置是一致的,是“理所应当”的位置。所以,直接通过v_uv0采样,会将纹理原本的样子显示出来。

而如果对采样的位置进行操作,就会将其他位置的图像显示到此位置上来,从而产生一些特殊的效果。比如说将采样的x坐标加上0.2,那么展示的结果,图像会向左边偏移20%。

如果直接对o,即采样出的颜色进行操作,那么也可以做出奇妙的效果。比如,执行 o.a *= 0.5,那么就会使最终的显示变为原本透明度的50%。如果 o.rgb *= 2.0,则颜色会变亮;如果 o.rgb *= 0.5,则颜色就会变暗。

当再次加入坐标这一参数之后,就可以描绘出特定的图案出来,比如,执行 o.a = v_uv0.x, 就会形成左边透明,右边不透明的过渡效果。通过不同的计算方式,就能够显示出各种有趣的效果。

继续向下:

o *= v_color;

这行代码就是将采样得出的颜色,和节点设置的颜色进行了叠加操作。

ALPHA_TEST(o);

这一行执行的是alpha测试,当勾选了USE_ALPHA_TEST时,这行代码就会发挥作用。

alpha测试的内容非常简单,当o.a,即参数的alpha值小于阈值,即alphaThreshold时,就会被直接discard,也就是被抛弃掉,不会显示。

终于到了最后一行:

gl_FragColor = o;

这一行做的事非常简单,输出颜色值。gl_FragColor是一个glsl的内置变量,用于表示此像素的颜色值。当通过一系列辛苦的计算,终于得到rgba值后,就要将这个值赋给gl_FragColor,使其输出出来。

在Cocos3D中,最终结果的输出方式略有不同。由于Cocos3D中片元着色器使用的是有返回值的函数,而不是无返回值的main函数。因此只需要return结果颜色值即可。对于gl_FragColor的赋值,Cocos3D会在其他地方帮忙做好。

Cocos Creator 2D Effect 入门 (1)相关推荐

  1. Cocos Creator 3.0 入门 ! 2D 素材 3D 效果!

    用 2D 素材实现 3D 效果! 前言 好久没写教程笔记了,不知大伙是否想念教程干货了? 温馨提示:所有内容纯属个人瞎玩研究,如要上线项目,请自行评估~ oh 最近逛论坛,看到有一位小伙伴想实现下面这 ...

  2. Cocos Creator 2D摄像机 [Lv.1] 小视图

    目录 摘要 环境 资源 准备工作 正式开始 对工程做一些修改 如何互动 上摄像机 缩放(看清黑头和脂肪粒) 动起来 辅助的边框 得有边界 用分组解决个bug 划重点 摘要 本系列文章主要实操2D摄像机 ...

  3. Cocos Creator | 通过 effect 实现卷轴展开和收拢效果

    源码获取请关注公众号: // 号外 // 本公众号由我和 honmono 共同维护,honmono 目前主要分享一些神奇的 shader 效果,各位大佬敬请期待 // 开发工具 // creator ...

  4. cocos Creator | 2D光影效果及手电筒效果

    更多笔记请关注公众号: 群内大佬贡献的2D光影效果及手电筒效果,小编厚着脸皮要来的转发权 大佬QQ:1099263878 欢迎加入QQ交流群:521643513 大佬比较忙,所以由小编来代笔阐述一下大 ...

  5. cocos creator 获取当前时间_前端开发者入门 Creator 必读吧

    写在前面 因为公司的业务需求,近期学习了Cocos Creator这款游戏引擎的开发,也基于此上线了一款游戏,因此写这系列文章记录一下我从入门到项目发布的学习过程. 相对于 web 开发,像Cocos ...

  6. Effect Exporter:一款 2D3D 特效编辑器插件,专为 Cocos Creator 深度定制

    随着 Cocos Creator 3.x 版本的发布,Cocos Creator 的 3D 功能更加完善.开发者 Oreo大魔王 着手制作了一款支持 Shader 2D&3D 的特效编辑器插件 ...

  7. 麒麟子Cocos Creator 3D研究笔记零:从零开始入门并发布微信小游戏

    编辑器状态截图 不要在意名字,我临时借用的小游戏APPID 一.前言 Cocos Creator,我回来了. 2016年6月,大家都觉得Cocos Creator 2D不够成熟的时候,我就开始商用了. ...

  8. Cocos Creator 3D 麒麟子回来了!(入门心法)

    1 前言 Cocos Creator,我回来了. 2016年6月,大家都觉得Cocos Creator 2D不够成熟的时候,我就开始商用了.因为我感受到了市场对Cocos Creator商业游戏源码框 ...

  9. Cocos Creator Effect 高斯模糊 (带算法)

    通常,图像处理软件会提供"模糊"(blur)滤镜,使图片产生模糊的效果. "模糊"的算法有很多种,其中有一种叫做"高斯模糊"(Gaussia ...

最新文章

  1. python创建类的实例方法-Python中动态创建类实例的方法
  2. 深度解析ASP.NET2.0中的Callback机制
  3. [异常特工]android常见bug跟踪
  4. Raspberry 4B 串口通信
  5. java与c++的区别-转
  6. php鼠标悬停显示图片,鼠标滑过出现预览的大图提示效果
  7. css设置文字上下居中,一行文字居中,两行或多行文字同样居中。
  8. [转载] Java8-Stream API 详解
  9. makefile文件管理
  10. angular蚂蚁_angular4 调用api
  11. C# 正则表达式 匹配IP地址
  12. [转载] opencv-python:13_图像噪声(噪声的概念、椒盐噪声、高斯噪声、使用python给图像添加噪声)
  13. Delphi2010中向TRxRichEdit控件中插入OLE对象。
  14. 求和函数java_java函数求和要怎么写?java求和代码实现
  15. Windows下本地安装SVN客户端
  16. 双偶幻方的c语言算法,任意阶幻方的c++实现----奇阶幻方、双偶幻方、单偶幻方。...
  17. 万字详解车路协同、C-V2X通信协议
  18. Office快捷键大全之二(Excel快捷键)
  19. 还在肝阴阳师?别错过千年一遇的高冷妹纸
  20. AI得贤招聘官上线ChatGPT,免费为企业提供AI智能助手Molly

热门文章

  1. 幼儿园教师怎么教计算机知识,幼儿园教师的专业知识到底包含哪些,家长必知!...
  2. 计算机网络(六):链路层
  3. Beta冲刺-星期五
  4. math: 坐标系旋转变换公式图解
  5. 保姆级AS400 CL介绍与应用(硬核)
  6. 前端使用sm2、sm3加密解密 案例
  7. 震惊!某程序员吐槽零基础自学编程很难,真的是这样吗?
  8. 项目使用Spring Cloud做配置管理
  9. 小程序动态图片加载失败替换本地图片
  10. 原生php开发多管理员留言板系统源码