从0开始的技美实战(十一)

本篇主要用于记录自己的实战操作,以及一些碎碎念(观后感),如果有什么好想法或者本篇出现什么错误,请多指教~

本篇的内容参考视频:庄懂的技术美术入门课(美术向)
使用软件:Unity 2019 3.6f1 ,ShaderForge

本篇内容主要包括:特效shader特点简述,透切,透混,透叠以及更多混合模式


一.特效特点

1.透

特效大部分都是透明或边缘不规则的,特效是需要一定通透性的,为了表现透常见的有下图的几种处理方法,在后面细说;
在这里插入图片描述

2.动

特效不是静止的插画,要表现一定的动感或者ACT中的打击感,为了表现特效的动感,常见操作如下图

在这里插入图片描述

3.映

坐标映射
在这里插入图片描述


二.透切

1.透切(ALphaCutout,也称为AlphaTest);

在这里插入图片描述

2.用途

  • 常用于复杂轮廓,明确边缘的物体表现,如:镂空金属,裙摆边缘,特定风格下的头发,树叶,等;
  • 卡通渲染特效表现,一般会配上后处理抗锯齿以及Bloom(辉光);

3.优点

无排序问题,不会看过去错位

4.缺点

  • 边缘效果太实
  • 移动端性能较差

5.代码

AC的代码与剩下两个非同一体系

Shader "Unlit/co11-AC"
{
    Properties
    {
        _MainTex ("RGB:颜色 A:透贴", 2D)  = "white" {}
		_Cutoff  ("透切阈值",range(0.0,1.0))= 0.5//AC特有
    }
    SubShader
    {
        Tags { 
		"RenderType"          ="TransparentCutout"//对应改为Cutout(虽然不改在此处无用,但是为了规范以及其他情况可能使用,加上)
		"ForceNoShadowCasting"="True"  //特效里默认关闭阴影投影
		"IgnoreProjector"     ="True"  //特效里默认不响应投射器
		}

        Pass
        {
		    Tags{"LightMode" = "ForwardBase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

			uniform sampler2D _MainTex;
            uniform float4    _MainTex_ST;
			uniform half      _Cutoff;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv0 : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv0 : TEXCOORD0;
                float4 pos : SV_POSITION;
            };

           

            v2f vert (appdata v)
            {
                v2f o;
                o.pos= UnityObjectToClipPos(v.vertex);
                o.uv0 = TRANSFORM_TEX(v.uv0, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : COLOR
            {
                half4 var_MainTex = tex2D(_MainTex, i.uv0);
				half  opacity     = var_MainTex.a;
				clip(opacity-_Cutoff);
                return half4(var_MainTex);
            }
            ENDCG
        }
    }FallBack "Diffuse"
}

效果如下:

在这里插入图片描述


三.透混

1.全称透明度混合(ALphaBlend);
在这里插入图片描述

2.用途

  • 常用于复杂轮廓,无明确边缘的物体表现,不适合空间关系复杂的效果;
  • 常用于半透明的物体表现;
  • 一般的特效表现,打底用;

3.优点

  • 移动端性能较好;
  • 边缘效果较好;

4.缺点

有排序问题,看起来会觉得错位;

5.代码

Shader "Unlit/co11-AB"
{
    Properties
    {
        _MainTex ("RGB:颜色 A:透贴", 2D)  = "white" {}
		
    }
    SubShader
    {
        Tags { 
		"Queue"               = "Transparent" //加个渲染序列,调整渲染顺序
		"RenderType"          = "Transparent"
		"ForceNoShadowCasting"= "True"  //特效里默认关闭阴影投影
		"IgnoreProjector"     = "True"  //特效里默认不响应投射器
		}

        Pass
        {
		    Tags{"LightMode" = "ForwardBase"}
			Blend One OneMinusSrcAlpha  //修改混合方式,有两种写法,One可以替代为SrcAlpha 
            
			CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

			uniform sampler2D _MainTex;
            uniform float4    _MainTex_ST;
			uniform half      _Cutoff;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv0 : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv0 : TEXCOORD0;
                float4 pos : SV_POSITION;
            };

           

            v2f vert (appdata v)
            {
                v2f o;
                o.pos= UnityObjectToClipPos(v.vertex);
                o.uv0 = TRANSFORM_TEX(v.uv0, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : COLOR
            {
                half4 var_MainTex = tex2D(_MainTex, i.uv0);
			
                return half4(var_MainTex);
            }
            ENDCG
        }
    }FallBack "Diffuse"
}

One效果(官方:传统)如下:
在这里插入图片描述
SrcAlpha效果(官方:预乘)如下:

在这里插入图片描述


四.透叠

1.透明度叠加(Additive,简称AD),特效的灵魂;
在这里插入图片描述

2.用途

  • 常用于发光体,辉光表现;
  • 一般特效表现,提高亮度使用;

3.问题

  • 排序问题;
  • 多层叠加容易性能爆炸(OverDraw)
  • 作为辉光效果可以用后处理Bloom来替代;

4.代码

比起AB主要改了下混合模式

Shader "Unlit/co11-AD"
{
    Properties
    {
        _MainTex ("RGB:颜色 A:透贴", 2D)  = "white" {}
		
    }
    SubShader
    {
        Tags { 
		"Queue"               = "Transparent" //加个渲染序列,调整渲染顺序
		"RenderType"          = "Transparent"
		"ForceNoShadowCasting"= "True"  //特效里默认关闭阴影投影
		"IgnoreProjector"     = "True"  //特效里默认不响应投射器
		}

        Pass
        {
		    Tags{"LightMode" = "ForwardBase"}
			Blend One One  //AD版修改混合方式
            
			CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

			uniform sampler2D _MainTex;
            uniform float4    _MainTex_ST;
			uniform half      _Cutoff;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv0 : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv0 : TEXCOORD0;
                float4 pos : SV_POSITION;
            };

           

            v2f vert (appdata v)
            {
                v2f o;
                o.pos= UnityObjectToClipPos(v.vertex);
                o.uv0 = TRANSFORM_TEX(v.uv0, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : COLOR
            {
               half3 var_MainTex = tex2D(_MainTex, i.uv0).rgb; // 采样贴图 RGB颜色 A透贴不必须
               return half4(var_MainTex, 1.0); // 返回值
            }
            ENDCG
        }
    }FallBack "Diffuse"
}

效果如下:

在这里插入图片描述
三者对比,从左往右依次AC,AB(SrcAlpha),AD

在这里插入图片描述


五.更多混合模式

1.模式
在这里插入图片描述
2.原理
在这里插入图片描述
3.美术自定义混合面板
在这里插入图片描述
4.完全暴露的代码实现

  • 思路
    在这里插入图片描述
  • 代码
    相对于AB加了三个关于混合运算的参数以及用[Enum(UnityEngine.Rendering.BlendMode)]去做下拉菜单,并且在Blend混合模式那里处理了一下;
Shader "Unlit/co11-BlendMode"{
    Properties
    {
        _MainTex ("RGB:颜色 A:透贴", 2D)  = "white" {}
		
		[Enum(UnityEngine.Rendering.BlendMode)]
		_BlendSrc("混合源乘子" ,int)        = 0
		[Enum(UnityEngine.Rendering.BlendMode)]
		_BlendDst ("混合目标乘子", int)     = 0
		[Enum(UnityEngine.Rendering.BlendMode)]
		_BlendOp ("混合算符", int)          = 0
    }
    SubShader
    {
        Tags { 
		"Queue"               = "Transparent" //加个渲染序列,调整渲染顺序
		"RenderType"          = "Transparent"
		"ForceNoShadowCasting"= "True"  //特效里默认关闭阴影投影
		"IgnoreProjector"     = "True"  //特效里默认不响应投射器
		}

        Pass
        {
		    Tags{"LightMode" = "ForwardBase"}
			
			BlendOp [BlendOp]           //修改混合方式混合模式用,自定义混合算符
			Blend [_BlendSrc] [_BlendDst] // 可自定义混合模式
            

			CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

			uniform sampler2D _MainTex;
            uniform float4    _MainTex_ST;
			uniform half      _Cutoff;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv0 : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv0 : TEXCOORD0;
                float4 pos : SV_POSITION;
            };

           

            v2f vert (appdata v)
            {
                v2f o;
                o.pos= UnityObjectToClipPos(v.vertex);
                o.uv0 = TRANSFORM_TEX(v.uv0, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : COLOR
            {
                half4 var_MainTex = tex2D(_MainTex, i.uv0);
                return half4(var_MainTex);
            }
            ENDCG
        }
    }FallBack "Diffuse"
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值