本文为学习笔记,不排除有谬误,但确保都是亲测。另外,傻狗百度收不收录的无所谓,我来博客园就是为了记记笔记。

对于新人,首先明确一点:shader需要通过材质的方式作用于模型上

所以有个很关键的步骤,cocos官网文档他就是不讲(摸索了好几天):

创建一个材质,并将Effect属性值选择为自己写的shader的文件名,然后选择模型在材质cc.MeshRenderer组件的Materials里添加上这个材质才能看到效果。

Cocos里的shader分为2个部分:

  1. CCEffect -->渲染过程属性配置(yml语法),可以properties定义变量方便我们在creator中调参
  2. CCProgram  --> 片段着色器是核心部分(由 GLSL 语法 声明的 Shader 片段)

我们通过Cocos creator新建Effect时这两部会自动创建,下面分别介绍

CCEffect:渲染过程属性

下面是一个CCEffect模板和说明:

CCEffect %{
techniques: # 渲染技术
- name: opaque # 定义一个不透明的渲染技术,改字段有opaque和transparent两个可选值
passes: # 每个技术包含一个或多个Pass,定义了具体的渲染步骤
- vert: vs: entry # 可以是CCProgram声明的顶点着色器,也可以是内置着色器,此处为CCProgram声明的顶点着色器‘vs’,入口函数是‘entry’
frag: fs: entry # 可以是CCProgram声明的片元着色器,也可以是内置着色器,此处为CCProgram声明的片段着色器 ‘fs’,入口函数是‘entry’
properties:
mainTexture: { value: grey } # 着色器中需要同步定义一个 ‘uniform mainTexture’,该属性可在编辑器的属性检查器中进行配置
colorScale: { value: [1, 1, 1], target: colorScaleAndCutoff.xyz } # 基于 ‘target’ 属性配置机制,着色器中需要同步定义一个 ‘uniform colorScaleAndCutoff’,并选取它的 x、y、z 分量填充 ‘colorScale’ 设置的数据
depthStencilState: # 配置深度测试、模板测试和写入状态
depthTest: true
depthWrite: true
...
...
}%

CCProGram:着色器是核心部分

一个CCProGram模板:

CCProgram shader-name %{
<required: precision settings> # 精度声明: precision highp float; (高精度浮点数)、precision mediump float; (中精度浮点数)、precision lowp float; (低精度浮点数)
<optional: include> # #include通常用于引入内置的宏定义或功能模块。
<optional: ubo>
<optional: custom attribute>
<optional: >
vec4 entry(){
// 需要返回一个 vec4 类型数据
}
}%

关于这个模板的其他介绍详见:cocos的CCProgram模板详解

第一个shader

这个着色器实现了模型的上下颜色渐变,效果见下图。我对每行代码都写了详细注释,通过这个demo应该可以入门着色器编写了:

CCEffect %{
techniques: # 渲染技术集合
- name: opaque # 定义一个不透明的渲染技术,改字段有opaque和transparent两个可选值
passes: # 每个技术包含一个或多个Pass,定义了具体的渲染步骤
- vert: general-vs:vert # 可以是CCProgram声明的顶点着色器,也可以是内置着色器,此处为内置顶点着色器‘general-vs’
frag: unlit-fs:frag # 可以是CCProgram声明的片段着色器,也可以是内置着色器,此处为CCProgram定义的名为‘unlit-fs’的做色器
properties: &props # 定义了一个属性集合,方便在cocos creator中进行调参
mainTexture: { value: white }
mainColor: { value: [1, 1, 0, 1], editor: { type: color } }
endColor: { value: [1, 0, 0, 1], editor: { type: color } } # 新增的 endColor 属性
- name: transparent
passes:
- vert: general-vs:vert
frag: unlit-fs:frag
blendState:
targets:
- blend: true
blendSrc: src_alpha
blendDst: one_minus_src_alpha
blendSrcAlpha: src_alpha
blendDstAlpha: one_minus_src_alpha
properties: *props
}% CCProgram unlit-fs %{
precision highp float; // 精度声明
#include <legacy/output> // 引入内置的输出宏,CCFragOutput(col)是一个宏,用于输出片段颜色
#include <legacy/fog-fs> // 引入内置的雾效宏,CC_APPLY_FOG(col, v_position)是一个宏,用于应用雾效 in vec2 v_uv; // 输入变量 v_uv 一个二维纹理坐标
in vec3 v_position; // 输入变量 v_position 一个三维坐标,代表模型表面每个点的世界坐标位置
in vec3 v_normal; // 输入变量 v_normal 一个三维法线向量 uniform sampler2D mainTexture; // 纹理采样器,mainTexture uniform Constant { // 常量块,包含了 shader 中的常量变量
// 这里定义了2个颜色变量,和上面的properties对应
vec4 mainColor;
vec4 endColor;
}; vec4 frag () {
vec4 col = mainColor * texture(mainTexture, v_uv); // 计算颜色,使用主颜色和纹理颜色的乘积 // 根据 v_uv.y 的值进行渐变
float t = v_uv.y;
if (v_normal.y >= 0.9) { // 假设顶部的阈值为 0.9
col = mainColor;
} else {
col = mix(mainColor, endColor, t); // mix是GLSL中的一个内置函数,用于在两个值之间进行线性插值。
} CC_APPLY_FOG(col, v_position); // 是Cocos Creator中用于在片段着色器中应用雾效的宏,雾效可以模拟远近深度感。
return CCFragOutput(col); // CCFragOutput 是Cocos Creator中用于在片段着色器中输出最终颜色的宏,它简化了将计算得到的颜色输出到渲染管线的过程。
}
}%

当我们创建一个材质,并将Effect属性值选择为上述shader的文件名,然后选择模型在材质cc.MeshRenderer组件的Materials里添加上这个材质后将看到如下效果:

舒服了,我们终于写出了自己的第一个shader,开始你的着色器奇幻之旅吧。。。

游戏开发之Cocos3着色器/shader快速入门的更多相关文章

  1. Unity3D着色器Shader编程入门(一)

    自学Unity3D也有大半年了,对Shader一直不敢入坑,最近看了些资料,以及通过自己的实践,对Shader还是有一点了解了,分享下仅作入门参考. 因Shader是对图像图像渲染的,学习前可以去了解 ...

  2. 游戏开发之UI管理器(跨引擎)

    使用UI管理器的目的 使用单场景与zindex结合的方式管理UI. 能够隐藏底层UI达到优化效果. 很好的组织和管理UI. 跨引擎使用. 管理器分类 根据以往经验我开发了三种类型的管理器,队列管理器, ...

  3. Cocos2d-x 3.x游戏开发之旅

    Cocos2d-x 3.x游戏开发之旅 钟迪龙 著   ISBN 978-7-121-24276-2 2014年10月出版 定价:79.00元 516页 16开 内容提要 <Cocos2d-x ...

  4. [整理]Unity3D游戏开发之Lua

    原文1:[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我地博客地址是blog.csdn.net/qinyuanpei.如果 ...

  5. 【转载】浅谈游戏开发之2D手游工具

    浅谈游戏开发之2D手游工具 来源:http://www.gameres.com/459713.html 游戏程序 平台类型: iOS Android  程序设计: 其它  编程语言:   引擎/SDK ...

  6. 着色器(Shader)

    着色器(Shader) 顶点着色器(Vertex shader) 片段着色器(Fragment shader) 几何着色器(Geometry Shader) 提供通用计算能力的着色器(Compute ...

  7. Cocos2d—X游戏开发之CCToggle(菜单标签切换)CCControlSwitch(开关切换)

    Cocos2d—X游戏开发之CCToggle(菜单标签切换) 首先继承子CCMenu,是菜单标签中的一种.‘ class CC_DLL CCMenuItemToggle : public CCMenu ...

  8. [Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新全然解读

    ---------------------------------------------------------------------------------------------------- ...

  9. iOS游戏开发之UIDynamic

    iOS游戏开发之UIDynamic 简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 ...

  10. [Unity3D]Unity3D游戏开发之从Unity3D到Eclipse

    ---------------------------------------------------------------------------------------------------- ...

随机推荐

  1. Nmap 语法及示例

    Nmap 语法及示例 基本语法 Nmap的基本语法结构如下: nmap [scan types] [options] [target] [scan types]: 标识扫描类型,如:TCP.UDP等. ...

  2. IDEA debug时候直接报ClassNotFoundException,代码正常,也可以正常运行

    原因,是因为在某些类误点了断点,需要取消

  3. Atcoder ABC383E Sum of Max Matching 题解 [ 绿 ] [ 最小瓶颈路 ] [ 并查集 ] [ Kruskal 重构树 ]

    Sum of Max Matching:简单贪心,但我场上没切,唐完了. 思路 显然,对于最大边权最小问题,首先想到最小瓶颈路的 trick:按边的大小排序,对原图进行加边. 同时可以发现,这个匹配有 ...

  4. 多项式算法再探:FMT 和 FWT

    我们知道,FFT 和 NTT 可以用来解决下面这种问题: \[c_k=\sum_{i+j=k}a_ib_j \] 不过,这并不是卷积的全部形态,比如下面这种: \[c_k=\sum_{i*j=k}a_ ...

  5. Linux编写一个自己的命令

    Linux编写一个自己的命令 编译一个.c文件,生成可执行文件out.out只有在当前目录下可以执行. 而命令可在任何路径执行 想让out可以在任意路径执行,有以下两种办法 1.将执行文件添加到 /b ...

  6. 天线驻波比&回波损耗

    天线驻波比(VSWR)‌,全称为电压驻波比,是衡量天线系统匹配程度的重要参数.它定义为驻波波腹处的电压幅值与波谷处的电压幅值之比.理想情况下,当馈线和天线的阻抗完全匹配时,驻波比为1,表示高频能量全部 ...

  7. Thymeleaf判断集合是否为空

    Thymeleaf判断集合是否为空最近项目使用的是thymeleaf.项目架构是Springboot+Thymeleaf. 在判断集合是否为空的时候踩了坑与大家分享. 以下代码是判断集合是否为空的,m ...

  8. Docker 安装详细步骤

    一.安装前的准备 确认系统要求 不同的操作系统对 Docker 的支持有所不同,常见的如 Windows.MacOS 和各种 Linux 发行版. 启用虚拟化(如果需要) 对于某些系统,可能需要在 B ...

  9. Ansible - [01] 入门&安装部署

    自动化运维工具,可以批量远程其他主机并进行管理操作 一.什么是 Ansible Ansible首次发布于2012年,作者:Michael DeHaan,同时也是Cobbler的作者,Ansible于2 ...

  10. 探秘Transformer系列之(9)--- 位置编码分类

    探秘Transformer系列之(9)--- 位置编码分类 目录 探秘Transformer系列之(9)--- 位置编码分类 0x00 概述 0x01 区别 1.1 从直观角度来看 1.2 从模型处理 ...