庄懂技术美术入门课笔记_L13_特效类shader(AlphaBlend&AlphaCutout&Additice)

  • 特效类shader
    • 概述
    • 各类混合方式(透切、透混、透叠)的比较
      • 透切: AlphaCutout(AC)
      • 透混:AlphaBlend (AB)
      • 透叠:Additive(AD)
    • 代码
      • 透切: AlphaCutout
      • 透混:AlphaBlend
      • 透叠:Additive
    • 实验截图
    • 更多混合模式
      • 更多混合模式
      • 混合原理
      • 美术自定义混合面板
      • (不封装面板)代码实现
      • 常用模式

特效类shader

概述

特效特点:透、动、映射

  • 序列帧动画:画成一格格,在同一张tex上
  • 顶点颜色动画通常和粒子相关,粒子发射的片的显现和消失通过顶点色做变化。Shader去响应顶点色的变化。

  • 应用:法阵
  • 屏幕坐标加上扰动可以实现透明扭曲的效果。

各类混合方式(透切、透混、透叠)的比较

透切: AlphaCutout(AC)

  • AlphaBlend前后关系容易错乱,故复杂轮廓、明确边缘的物体常用AlphaCutout。如右图。

  • 一般卡通项目会配上后处理(抗锯齿)、Bloom。Bloom会使辉光溢出来,使画面不会那么呆板。

透混:AlphaBlend (AB)

  • 特效常用AlphaBlend打底,然后再用Additive提亮

透叠:Additive(AD)

  • 辉光可用后处理Bloom做替代,不要过度依赖AD片

代码

透切: AlphaCutout

  • RenderType可改可不改,万一用得上,最好改一下
  • RenderType有很多种,默认为Opaque,为AlphaCutout准备了专门的RenderType为TransparentCutout
  • 一个shader里可有多个Subshader,每个subshader声明不同的RenderType,摄像机覆盖一个Subshader。如果想要骚操作使摄像机照到的东西变成另外的样子,可以用RenderType切到另一个Subshader。
  • 也可以自己写RenderType
  • ForceNoShadowCasting强制关闭投影。特效一般不开投影。
    特效一般会开TillingAndOffset,所以要声明_Tex_ST
  • 重点:Clip()函数,把参数小于0的像素丢弃,不渲染,控制透切阈值用。
Shader "AP01/L13/AC" {Properties {_MainTex ("RGB:颜色 A:透贴", 2d) = "gray"{}_Cutoff ("透切阈值", range(0.0, 1.0)) = 0.5}SubShader {Tags {"RenderType"="TransparentCutout"    // 对应改为Cutout"ForceNoShadowCasting"="True"       // 关闭阴影投射"IgnoreProjector"="True"            // 不响应投射器}Pass {Name "FORWARD"Tags {"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#pragma multi_compile_fwdbase_fullshadows#pragma target 3.0// 输入参数uniform sampler2D _MainTex; uniform float4 _MainTex_ST;uniform half _Cutoff;// 输入结构struct VertexInput {float4 vertex : POSITION;       // 顶点位置 总是必要float2 uv : TEXCOORD0;          // UV信息 采样贴图用};// 输出结构struct VertexOutput {float4 pos : SV_POSITION;       // 顶点位置 总是必要float2 uv : TEXCOORD0;          // UV信息 采样贴图用};// 输入结构>>>顶点Shader>>>输出结构VertexOutput vert (VertexInput v) {VertexOutput o = (VertexOutput)0;o.pos = UnityObjectToClipPos( v.vertex);    // 顶点位置 OS>CSo.uv = TRANSFORM_TEX(v.uv, _MainTex);       // UV信息 支持TilingOffsetreturn o;}// 输出结构>>>像素half4 frag(VertexOutput i) : COLOR {half4 var_MainTex = tex2D(_MainTex, i.uv);      // 采样贴图 RGB颜色 A透贴clip(var_MainTex.a - _Cutoff);                  // 透明剪切return var_MainTex;                             // 返回值}ENDCG}}
}

透混:AlphaBlend

  • 以AC为模版,AB与AC不同的是AlphaBlend不需要_Cutoff(透切阈值),并且Subshader的Tags中需要将"RenderType"=“TransparentCutout” 改为"RenderType"="Transparent”,还要加一条“Queue”=“Transparent”
  • Unity渲染不透明物体:从前往后;渲染透明物体:从后往前
  • 所以要在不透明的物体渲染之后渲染透明物体,AB比AC多一条“Queue”=“Transparent”
  • 在Pass中声明混合方式:Blend One OneMinusSrcAlpha/Blend SrcAlpha OneMinusSrcAlpha
  • Src为当前需要渲染的像素,Dst为背景像素
  • Blend One OneMinusSrcAlpha边缘干净,Blend SrcAlpha OneMinusSrcAlpha边缘发黑
  • 重点:别忘了在Pass中声明混合方式
  • half3 finalRGB = var_MainTex.rgb;
    half opacity = var_MainTex.a * _Opacity;//这两步是将var_MainTex的RGB通道和Alpha通道分离的关键步骤

    Blend One OneMinusSrcAlpha与Blend SrcAlpha OneMinusSrcAlpha效果比较
Shader "AP01/L13/AB" {Properties {_MainTex ("RGB:颜色 A:透贴", 2d) = "gray"{}_Opacity ("透明度", range(0, 1)) = 0.5}SubShader {Tags {"Queue"="Transparent"               // 调整渲染顺序"RenderType"="Transparent"          // 对应改为Cutout"ForceNoShadowCasting"="True"       // 关闭阴影投射"IgnoreProjector"="True"            // 不响应投射器}Pass {Name "FORWARD"Tags {"LightMode"="ForwardBase"}Blend One OneMinusSrcAlpha          // 修改混合方式One/SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#pragma multi_compile_fwdbase_fullshadows#pragma target 3.0// 输入参数uniform sampler2D _MainTex; uniform float4 _MainTex_ST;uniform half _Opacity;// 输入结构struct VertexInput {float4 vertex : POSITION;       // 顶点位置 总是必要float2 uv : TEXCOORD0;          // UV信息 采样贴图用};// 输出结构struct VertexOutput {float4 pos : SV_POSITION;       // 顶点位置 总是必要float2 uv : TEXCOORD0;          // UV信息 采样贴图用};// 输入结构>>>顶点Shader>>>输出结构VertexOutput vert (VertexInput v) {VertexOutput o = (VertexOutput)0;o.pos = UnityObjectToClipPos( v.vertex);    // 顶点位置 OS>CSo.uv = TRANSFORM_TEX(v.uv, _MainTex);       // UV信息 支持TilingOffsetreturn o;}// 输出结构>>>像素half4 frag(VertexOutput i) : COLOR {half4 var_MainTex = tex2D(_MainTex, i.uv);      // 采样贴图 RGB颜色 A透贴half3 finalRGB = var_MainTex.rgb;half opacity = var_MainTex.a * _Opacity;return half4(finalRGB * opacity, opacity);                // 返回值}ENDCG}}
}

透叠:Additive

  • 以AB为模版,混合模式修改为Blend OneOne即可
  • 像素shader只采样RGB,Alpha就用1。Alpha通道看项目需求要不要用RT(RenderTexture)
  • 商城,要把角色渲染到卡牌上(以动态出现在UI上)。先渲染角色动画RenderTexture,再把RT贴到UI上。要关心特效是否正确写入Alpha,RT要用Alpha做透贴。需要就写。

实验截图

更多混合模式

更多混合模式

混合原理

美术自定义混合面板

  • 右边的面板需要用C#写

(不封装面板)代码实现

  • 核心内容1:Properties中声明混合乘子和混合算符,[Enum(枚举类型)]为下面的值追加了枚举类型,枚举值是小括号里的东西枚举类型
  • 核心内容2:Pass中Blend的乘子和混合算符(op)用[ ]括起来

常用模式

庄懂技术美术入门课笔记_L13_特效类shader(AlphaBlendAlphaCutoutAdditice)相关推荐

  1. 庄懂技术美术入门课笔记_L15_特效动态实现方式(UV流动UV扰动)

    庄懂技术美术入门课笔记_L15_特效动态实现方式(UV流动&UV扰动) 概述 1.排序问题 2.Alpha通道预乘问题 UV流动 1.演示:GhostFlow 2.代码 UV扰动 1.演示:G ...

  2. 庄懂的技术美术入门课系列——学习笔记

    关AO的知识之前涉及到就# 庄懂的技术美术入门课系列--学习笔记 本系列旨记录看视频学习时的一些看个人的理解和思考 1.三色混合的环境光 基本思路: 物体的环境光可以想象成是在物体四周全方位向物体射出 ...

  3. 个人学习笔记——庄懂的技术美术入门课(美术向)19

    个人学习笔记--庄懂的技术美术入门课(美术向)19 1 顶点平移 2 顶点缩放 3 顶点旋转 4 综合应用 1 顶点平移 2 顶点缩放 方法类似 避免产生负值 3 顶点旋转 方法类似 以下是涉及到的一 ...

  4. 个人学习笔记——庄懂的技术美术入门课(美术向)01

    个人学习笔记--庄懂的技术美术入门课(美术向)01 0 前言 1 工程搭建示范 2 理论 2.1 结构(struct) 2.2 渲染管线 3 操作 3.1-2 向量/标量/点积等若干线代基础 3.3 ...

  5. 个人学习笔记——庄懂的技术美术入门课(美术向)07

    个人学习笔记--庄懂的技术美术入门课(美术向)07 1 单色环境光 2 三色环境光 3 投影 4 光照模型组合 有关AO的知识之前涉及到就是 SSAO的实现了,可以回顾下 1 单色环境光 环境光加上环 ...

  6. 个人学习笔记——庄懂的技术美术入门课(美术向)02

    个人学习笔记--庄懂的技术美术入门课(美术向)02 1 作业点评 2 作业批改 2.1 作业1 2.1.1 模拟高光 2.1.2 菲涅尔 2.1.3 叠加模式 2.2 作业2 2.2.1 关于屏幕UV ...

  7. 个人学习笔记——庄懂的技术美术入门课(美术向)12

    个人学习笔记--庄懂的技术美术入门课(美术向)12 1 作业示范 2 答疑 3 作业示范思路 4 作业实现·准备 5 作业实现·光照模型 6 作业实现·细节 7 开源Shader 该课是在13课之后上 ...

  8. 个人学习笔记——庄懂的技术美术入门课(美术向)04

    个人学习笔记--庄懂的技术美术入门课(美术向)04 1 作业点评 2 作业答案 2.1 半Lambert 2.2 SSSLut 2.3 批改 2.3.1 批改1 2.3.1.1 分层 2.3.1.2 ...

  9. 个人学习笔记——庄懂的技术美术入门课(美术向)08

    个人学习笔记--庄懂的技术美术入门课(美术向)08 1 作业点评 2 作业批改 3 法线贴图 1 作业点评 没啥问题,注意调节AO强度需要从白色去调 看起来透明的猴子有风格化,会讲例子 右下角的蓝色小 ...

  10. 个人学习笔记——庄懂的技术美术入门课(美术向)09

    个人学习笔记--庄懂的技术美术入门课(美术向)09 1 菲涅尔 2 连连看-MatCap 3 连连看-CubeMap 4 代码 MatCap 5 代码 CubeMap 1 菲涅尔 更具体的PBR可以参 ...

最新文章

  1. 1070 Mooncake
  2. 页面重新跳转到父类url
  3. 深入理解分布式技术 - BASE 理论
  4. UILabel简单高效实现圆角的方式
  5. Object类中的两个方法——wait和notify使用总结
  6. 变换上三角矩阵_关于马尔可夫矩阵的一些个人研究成果、思考过程及相关解释...
  7. Chrome 调试技巧 1
  8. Jmeter JDBC请求-----数据库读取数据进行参数化 通过SSH跳板机连接数据库
  9. php解密 eval( base64_decode,PHP之eval(gzinflate(base64_decode加密解密
  10. SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论...
  11. [目标检测]YOLO原理
  12. 敏捷开发一千零一问系列之十四:敏捷开发加班吗?
  13. vue 大概流程(未完)
  14. java jxls导出excel
  15. linux md5 大文件慢,【我的Linux,我做主!】浅谈MD5校验文件完整一致性
  16. Verilog 参数化位宽转换设计实例
  17. Linux环境:可变剪切分析软件rMATS安装、使用与解读
  18. [luogu3505][bzoj2088][POI2010]TEL-Teleportation【分层图】
  19. 小鲲Python嘎嘎炫~day2.3
  20. PlatoFarm几大创新经济模型,给予当下元宇宙市场的启发

热门文章

  1. asp.net 与donet(.net)的区别
  2. 博途仿真PLC与第三方客户端通信
  3. drawio中添加数学公式
  4. HOST 文件网页屏蔽广告
  5. 多源信息融合与多视角学习
  6. apache 支持apk下载安装
  7. android edge 去广告,edge浏览器怎么去广告? edge浏览器去广告插件adsafe的使用方法...
  8. 大学生搜题软件哪个好?2020搜题软件排行榜
  9. 某知名大学学生毕业设计, Java学好了就是厉害
  10. 第115页的gtk+编程例子——最简单的进度条2附带使用Anjuta写gtk程序的步骤