从0开始的技美实战(六)

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

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

本篇主要内容包含:环境光的连连看与编程,阴影的连连看与编程,案例的连连看与编程以及创意题;


一.环境光

1.单环境光
假设从四面八方照来的单一的均色的光,则效果和连连看如下图,颜色*AO贴图(对环境光的阻挡)即可;

在这里插入图片描述

2.三色环境光

上面基于的假设显然简单粗暴,天蓝土黄,对于不同处的光,色彩不一,起码应该有一定差别应有顶底关系,所以引申出三色环境光;

在之前的视频里有讲过,法线取绿通道遮罩时它是朝上的区域,那么我们分别与1和-1相乘即可分别得到上下的区域遮罩,从而将其分隔开,然后我们给定对应的三个有明暗变化的颜色与AO贴图再相乘,最后得到三色光;

  • 如下图,进行三个区域遮罩的处理

在这里插入图片描述

  • 接下来我们给三个颜色分别对应上中下三区域,最后将三者相加结果与AO图相乘得到最后效果,为了线条稍微梳理些,我将上面用1减两个的操作换成了1减两个的和;

在这里插入图片描述
在这里插入图片描述

黄色的是单色的,绿色的是三色的;

3.三色环境光代码

在这里插入图片描述
中间注意的是AO贴图要先用tex2D函数采样才能乘;

Shader "Unlit/co7-3colamb"
{
    Properties
    {
        _AOTex ("AO贴图", 2D) = "white" {}
		_EnvtopCol("上区域颜色",color) = (1.0,1.0,1.0,1.0)
		_EnvmidCol("中区域颜色",color) = (1.0,1.0,1.0,1.0)
		_EnvdowCol("下区域颜色",color) = (1.0,1.0,1.0,1.0)
	}
		SubShader
		{
			Tags { "RenderType" = "Opaque" }
			Pass
			{
				Tags{"RenderType" = "ForwardBase"}
				CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag
				#include "UnityCG.cginc"

			uniform	float3 _EnvtopCol;
		    uniform	float3 _EnvmidCol;
		    uniform	float3 _EnvdowCol;
			uniform sampler2D  _AOTex;

            struct VertexInput
            {
                float4 vertex : POSITION;
                float4 normal : NORMAL;
				float2 uv0:TEXCOORD0;
            };

            struct VertexOutput
            {
                float2 uv : TEXCOORD1;
                float4 vertex : SV_POSITION;
				float3 nDirWS:TEXCOORD0;
            };

			VertexOutput vert (VertexInput v)
            {
				VertexOutput o;
                o.vertex = UnityObjectToClipPos(v.vertex);
				o.nDirWS = UnityObjectToWorldNormal(v.normal);
				o.uv = v.uv0;
                return o;
            }

			float4 frag(VertexOutput i) : SV_Target
			{
				float3 nDir = i.nDirWS;

				float upmask = max(nDir.g,0);
				float dowmask = max(-nDir.g,0);
				float midmask = 1 - upmask - dowmask;

				float3 Envcolor = _EnvtopCol * upmask + _EnvmidCol * midmask + _EnvdowCol * dowmask;

				//采样纹理
				float occlusion = tex2D(_AOTex, i.uv);

				float3 final = occlusion * Envcolor;

                return float4(final,1.0);
            }
            ENDCG
        }
    }

二.投影

1.ShaderForge中节点
在这里插入图片描述

2.代码中投影

在这里插入图片描述

Shader "Unlit/co7-shadow"
{
    Properties
    {
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

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

            #include "UnityCG.cginc"
			#include "AutoLight.cginc"//使用Unity投影必须包含这俩库文件
		    #include "Lighting.cginc"//同上
            #pragma multi_compile_fwdbase_fullshadows//同上

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
				LIGHTING_COORDS(0,1)//投影用坐标信息
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                TRANSFER_VERTEX_TO_FRAGMENT(o)//unity封装
                return o;
            }

			float4 frag(v2f i) : COLOR
			{
				float shadow = LIGHT_ATTENUATION(i);//同封装,取出投影
                return float4(shadow, shadow, shadow,1.0);
            }
            ENDCG
        }
    }
		FallBack "Diffuse"//一定要加!!!!不然没有阴影,unity自己也不报错
}

注意有些东西必须要写,Fallback也是,它不是单纯的备胎。

Fallback是相当于将fallback里的那个shader全部录入该shader中,然后diffuse里有写了那个关于阴影的pass所以加上Fallback阴影就可以使用了。


三.OldschoolPlus案例

1.光照的构成

在这里插入图片描述
2.模型案例
在这里插入图片描述
案例分析:
在这里插入图片描述
小细节:
在这里插入图片描述

该案例本质上就是将三个学过的光模型组合,并加上阴影效果;

最终效果图与节点图如下:

在这里插入图片描述
在这里插入图片描述

3.代码

Shader "Unlit/co7-oldplus"
{
    Properties
    {
        _AO ("AO贴图", 2D) = "white" {}
		_MainColor("主颜色",color) = (1.0,1.0,1.0,1.0)
		_LightColor("灯光颜色",color) = (1.0,1.0,1.0,1.0)
		_SpecularPow("高光次幂",range(1,90)) = 30
		_SpecularIns("高光强度",range(0,1)) = 1
		_EnvtopColor("环境上颜色",color) = (1.0,1.0,1.0,1.0)
		_EnvmidColor("环境中颜色",color) = (1.0,1.0,1.0,1.0)
		_EnvdowColor("环境下颜色",color) = (1.0,1.0,1.0,1.0)
		_Envcontrol("环境影响",range(0,1)) = 1
	}
		SubShader
		{
			Tags { "RenderType" = "Opaque" }

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

				#include "UnityCG.cginc"
				#include "AutoLight.cginc"
				#include "Lighting.cginc"
				#pragma multi_compile_fwdbase_fullshadows

				uniform sampler2D _AO;
		        uniform float3 _MainColor;
				uniform float3 _LightColor;
				uniform float3 _EnvtopColor;
				uniform float3 _EnvmidColor;
				uniform float3 _EnvdowColor;
				uniform float _SpecularPow;
				uniform float _SpecularIns;
				uniform float _Envcontrol;

            struct a2v
            {
                float4 vertex : POSITION;
				float4 normal : NORMAL;
                float2 uv0 : TEXCOORD0;
            };

            struct v2f
            {
				float3 nDirWS:TEXCOORD0;
                float2 uv : TEXCOORD1;
				float4 posWS : TEXCOORD02;
                float4 pos : SV_POSITION;
				LIGHTING_COORDS(3, 4)
            };


            v2f vert (a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
				TRANSFER_VERTEX_TO_FRAGMENT(o)
				o.nDirWS= UnityObjectToWorldNormal(v.normal);
				o.posWS = mul(unity_ObjectToWorld, v.vertex);
				o.uv = v.uv0;
				
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
				float3 nDir = normalize(i.nDirWS);
				float3 lDir = normalize(_WorldSpaceLightPos0.xyz);
				float3 vDir = normalize(_WorldSpaceCameraPos.xyz - i.posWS);

				float topmask = max(nDir.g,0);
				float dowmask = max(-nDir.g, 0);
				float midmsk = 1 - topmask - dowmask;
				float occlusion = tex2D(_AO,i.uv);
				float shadow = LIGHT_ATTENUATION(i);

				float3 lambert = max(dot(nDir, lDir), 0)* _MainColor;
				float Phong = pow(max(dot(reflect(-lDir, nDir), vDir),0), _SpecularPow)* _SpecularIns;
				float3 ambient = (_EnvtopColor * topmask + _EnvmidColor * midmsk + _EnvdowColor * dowmask)*_Envcontrol* _MainColor* occlusion;
				
				float3 final = ((lambert + Phong) * _LightColor * shadow) + ambient;

				return float4(final, 1.0);

            }
            ENDCG
        }
    }
			FallBack "Diffuse"
}


四.创意题

1.OldSchoolPlus不同场景再利用

  • 先从zb里利用怪物笔刷随意拉个怪物模型,然后利用Z插件减面,导入到MAYA里展UV后,再进SP里画贴图和烘焙AO图,并将其导入unity中;
    在这里插入图片描述
  • 改进下OldSchoolPlus,将BaseColor换成MainTex,获得以下效果;
    在这里插入图片描述

2.创新连连看

我这里思路是将上次学到的掉漆模型改进加上阴影和环境光效果,直接放节点图和效果图;

在这里插入图片描述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值