UnityShader——MaterialCapture材质捕捉效果 (翡翠斧头)

声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改。


UnityShader学习目录



前言

Unity2019.3.6
AmplifyShaderEditor


一、实现原理

贴图跟随摄像机移动

二、效果及源码展示

1.光球效果

效果描述:
通过相机空间,把贴图uv跟随相机移动.
效果图如下:

AmplifyShaderEditor节点图如下:
==请插入图片==

2.翡翠斧头效果

效果描述
在效果一的基础上叠加了渐变贴图,又叠加了一次matcap贴图
效果图如下:
AmplifyShaderEditor节点图如下:
在这里插入图片描述

参数设置如下图:
==请插入图片==
代码如下:

Shader "Unlit/MatCap_Code"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _MatcapTex("MatcapTex",2D)="white"{}//渐变贴图
        _RampTex("RampTex",2D)="white"{}
        _MatcapAddTex("MatcapAddTex",2D)="white"{}
        _MatcapIntensity("Matcap Intensity",Float) = 1.0
        _MatcapAddIntensity("MatcapAdd Intensity",Float)=1.0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata//模型数据
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float3 normal:NORMAL;
            };

            struct v2f//自定义数据 顶点的输出,片元的输入
            {
                float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;               
                float3 worldNormal : TEXCOORD1;
                float3 worldPos:TEXCOORD2;
            };

            sampler2D _MainTex;
            sampler2D _MatcapTex;
            sampler2D _RampTex;
            sampler2D _MatcapAddTex;
            float4 _MainTex_ST;
            float _MatcapIntensity;
            float _MatcapAddIntensity;


            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                float3 worldNormal=mul(float4(v.normal,0.0),unity_WorldToObject);//可适用非等比缩放而不出错.
                //float3 worldNormal=UnityObjectToWorldNormal(v.normal);//通用,多数时候可替换上行代码
                o.worldNormal=worldNormal;
                o.worldPos=mul(unity_ObjectToWorld,v.vertex).xyz;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {                    

                half3 worldNormal= i.worldNormal;
                //material capture MainTex
                half3 viewSpaceNormal=mul(UNITY_MATRIX_V,float4(worldNormal,0.0)).xyz; //相机空间下法相向量
                half2 matcapUV=(viewSpaceNormal.xy+float2(1.0,1.0))*0.5;
                half4 matcapColor=tex2D(_MatcapTex,matcapUV) *_MatcapIntensity;
                half4 diffuseColor = tex2D(_MainTex, i.uv); 
              
                //fresnel   渐变映射
                // 计算世界空间视图方向
                half3 worldViewDir=normalize(UnityWorldSpaceViewDir(i.worldPos));
                half ndotv=saturate(dot(i.worldNormal,worldViewDir));
                half fresnel=1.0-ndotv;
                half2 rampUV=half2(fresnel,0.5);
                half4 rampColor=tex2D(_RampTex,rampUV);
                half4 matcapAddColor=tex2D(_MatcapAddTex,matcapUV)*_MatcapAddIntensity;

                half4 combined_color= diffuseColor*matcapColor * rampColor+matcapAddColor;
                

                return combined_color;
            }
            ENDCG
        }
    }
}

后处理:

相机上添加色调映射,让颜色更鲜艳一些.
在这里插入图片描述
注意:相机上也要添加上对应层级,不然不显示

总结

保持饥饿,保持愚蠢.

这世界唯一能够相信的就是你付出的努力和你走过的路.

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ۓ明哲ڪ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值