菜鸡shader:L13 渐隐渐显的UV动画

news2024/11/27 19:48:16

文章目录

  • SD部分
  • Shader代码部分

呃呃,这是目前我学习庄懂AP01课程的最后一节了,我看了一下21集之后的内容是关于LightingMap,目前感觉还用不到,加上之前参与过一个项目里面也有用到LightingMap,也算了解过,就暂时先放到待办列表里。

下面也是简单记录一下课上的东西,其实整节课似懂非懂,感觉难度很大,也很能体会到老师的清晰逻辑,感叹一下,以后能成为这样的大神吗。这节课内容更多是简单记录,有些地方我也不是很懂,下面就直接开始吧。

SD部分

SD部分我就没有跟,因为打算后面再找门网课系统地学习一下。
在这里插入图片描述

  • 模型需要顶点色,因为底座不需要变化,所以顶点色全为黑,变化的是底座上面地部分,所以全为白。
  • 还需要两张UV,第一张UV用来普通地采样主纹理、法线、高光和自发光等的贴图。而第二章UV则是为后续的特效做准备。
    在这里插入图片描述
    在这里插入图片描述
  • 制作UV网格图,这部分就是将模型导入sd里,然后进行烘培,获得UV网格图。
    在这里插入图片描述

并且要在SD里获得两张图:

  • _EffMap01。这张用来存储网格、面随机灰度以及面上坡度(面上的灰度渐变)。
    在这里插入图片描述

  • _EffMap02。这张用来存储噪声,后面的特效需要用到。
    在这里插入图片描述

  • 为什么不把这个灰度塞到上面红绿图的A通道里呢?
    涉及到优化问题,RGB与RGBA的图片,这两种图在Unity里压缩的尺寸不是多1/4,而是多了一倍。所以一张图能不加alpha就不加alpha,看起来多了一个通道,其实内存占用多了很多。

Shader代码部分

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

Shader "shader forge/L21_OldSchoolPlusWithMeshAnim"
{
    Properties
    {
        [Header(Texture)]
        _MainTex ("Main Tex   RGB:Base Color  A:EnvMask", 2D) = "white" {}        
        _normal ("normal", 2D) = "bump" {}
        _SpecTex ("Spec Tex   RGB:Spec Color  A:Spec Pow", 2D) = "white" {}
        _EmittTex ("Emitt Tex   RGB:Env Tex", 2D) = "black" {}
        _cubemap ("cubemap", Cube) = "_Skybox" {}
       
        [Header(Diffuse)]
        _MainCol ("Main Color", Color) = (0.5,0.5,0.5,1.0)
        _EnvDiffInt ("Env Diff Int", Range(0, 1)) = 0.2
        _E_Lambert_UpColor ("E_Lambert_UpColor", Color) = (0.8679245,0.5444998,0.5444998,1)
        _E_Lambert_DownColor ("E_Lambert_DownColor", Color) = (0.4400143,0.6626909,0.9056604,1)
        _E_Lambert_MidColor ("E_Lambert_MidColor", Color) = (0.4800081,0.8962264,0.4016109,1)

        [Header(Specular)]
[PowerSlider(2)]        _SpecPow ("Spec Pow", Range(1, 90)) = 30        
        _EnvSpecInt ("Env_SpecInt", Range(0, 5)) = 0.7826087
        _fresnel_exp ("fresnel_exp", Range(0, 90)) = 0.6956522
        _mipmap_level ("Env Mipmap", Range(0, 7)) = 0

        [Header(Emission)]
        _EmittInt ("Emitt Int", Range(1,10)) = 1

        [Header(Clock)]
        _EffMap01 ("Effect Tex1", 2D) = "gray" {}
        _EffMap02 ("Effect Tex2", 2D) = "gray" {}
        _EffCol ("Effect Color", color) = (0.0,0.0,0.0,0.0)
        _EffParams ("Wave Prop  X:Int  Y:Speed  Z:ChaosInt  W:FadeInt", vector) = (0.03,3.0,0.3,2.5)
    }
    SubShader
    {
        Tags {
            "Queue" = "Transparent"
            "RenderType"="Transparent" 
        }
        LOD 100

        Pass
        {
            Name "FORWARD"
            Tags{
                "LightMode" = "ForwardBase"
            }
            Blend One OneMinusSrcAlpha      //AB

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

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

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv0 : TEXCOORD0;
                float2 uv1 : TEXCOORD1;         //特效网格UV信息
                float3 normal : NORMAL;
                float4 tangent : TANGENT;
                float4 color : COLOR;               //顶点色信息
            };

            struct v2f
            {
                float2 uv0 : TEXCOORD0;
                float2 uv1 : TEXCOORD1;
                float4 pos : SV_POSITION;
                float4 posWorld : TEXCOORD2;
                float3 nDirWS : TEXCOORD3;
                float3 tDirWS : TEXCOORD4;
                float3 biDirWS : TEXCOORD5;
                float4 effectMask : TEXCOORD6;
                LIGHTING_COORDS(7,8)            //投影相关
            };

            //Texture
            uniform sampler2D _MainTex;            
            uniform sampler2D _normal;
            uniform sampler2D _SpecTex;
            uniform sampler2D _EmittTex;
            uniform samplerCUBE _cubemap;           
            //Diffuse
            uniform float3 _MainCol;
            uniform float _EnvDiffInt;
            uniform float3 _E_Lambert_UpColor;
            uniform float3 _E_Lambert_DownColor;
            uniform float3 _E_Lambert_MidColor;
            //Specular
            uniform float _SpecPow;            
            uniform float _EnvSpecInt;            
            uniform float _fresnel_exp;
            uniform float _mipmap_level;
            //Emitt
            uniform float _EmittInt;
            //Effect
            uniform sampler2D _EffMap01;
            uniform sampler2D _EffMap02;
            uniform float3 _EffCol;
            uniform float4 _EffParams;

            #define TWO_PI 3.1415926*2
            //动画方法 inout顶点信息 返回effect相关遮罩
            float4 CyberpunkAnim(float noise, float mask, float3 normal, inout float3 vertex){
            //生成锯齿波Mask
                float baseMask = abs(frac(vertex.y * _EffParams.x - _Time.x * _EffParams.y) - 0.5) *2.0; 
                //float baseMask1 = abs(frac(vertex.y) - 0.5) * 2.0;
                //让白色的时间更多,黑色的时间更少
                baseMask = min(1.0, baseMask * 2.0);
                //用Noise偏移锯齿波,noise的取值范围为0到1,减去0.5使其有正有负
                baseMask += (noise - 0.5) * _EffParams.z;
                //smoothstep算出各级Mask
                float4 effectMask = float4(0.0,0.0,0.0,0.0);
                effectMask.x = smoothstep(0.0,0.9,baseMask);
                effectMask.y = smoothstep(0.2,0.7,baseMask);
                effectMask.z = smoothstep(0.4,0.5,baseMask);
                //将顶点色遮罩存入effectMask
                effectMask.w = mask;
                //计算顶点动画
                vertex.xz += normal.xz * (1.0 - effectMask.x) * _EffParams.w * mask;
                //返回effectMask
                return effectMask;
                //return float4(baseMask1,baseMask1,baseMask1,1.0);
            }

            v2f vert (appdata v)
            {
                //采样纹理
                float noise = tex2Dlod(_EffMap02, float4(v.uv1, 0.0, 0.0)).r;
                //float noise = tex2Dlod(_EffMap02,v.uv1).r;
                v2f o;
                o.effectMask = CyberpunkAnim(noise, v.color.r, v.normal.xyz, v.vertex.xyz);
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv0 = v.uv0;
                o.uv1 = v.uv1;
                o.posWorld = mul(unity_ObjectToWorld, v.vertex);
                o.nDirWS = UnityObjectToWorldNormal(v.normal);
                o.tDirWS = normalize(mul(unity_ObjectToWorld,float4(v.tangent.xyz,0.0)).xyz);
                o.biDirWS = normalize(cross(o.nDirWS,o.tDirWS) * v.tangent.w);
                TRANSFER_VERTEX_TO_FRAGMENT(o)
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                //贴图采样
                float3 nDirTS = UnpackNormal(tex2D(_normal,i.uv0)).rgb;

                //向量准备
                float3x3 TBN_Matrix = float3x3(i.tDirWS,i.biDirWS,i.nDirWS);
                float3 nDirWS_FT = normalize(mul(nDirTS, TBN_Matrix));
                float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
                float3 lrDirWS = normalize(reflect(-lightDir, nDirWS_FT));
                float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
                float3 halfDir = normalize(lightDir + viewDir);
                float3 vrDir = normalize(reflect(-viewDir,nDirWS_FT));

                //准备点积结果
                float NoL = max(0.0,dot(lightDir,nDirWS_FT));
                float NoH = max(0.0,dot(nDirWS_FT,halfDir));
                float NoV = max(0.0,dot(nDirWS_FT,viewDir));
                float VoR = max(0.0,dot(viewDir, lrDirWS));

                //采样纹理
                float4 var_MainTex = tex2D(_MainTex,i.uv0);
                float4 var_SpecTex = tex2D(_SpecTex,i.uv0);
                float3 var_EmitTex = tex2D(_EmittTex,i.uv0);

                //光照模型(直接光照部分)
                float3 baseCol = var_MainTex.rgb * _MainCol;
                float lambert = max(0.0,NoL);
                float specCol = var_SpecTex.rgb;
                float specPow = lerp(1, _SpecPow,var_SpecTex.a);
                float phong = pow(max(0.0, lrDirWS), specPow);
                float shadow = LIGHT_ATTENUATION(i);
                float3 dirLighting = (baseCol * lambert + specCol * phong) * _LightColor0 * shadow;

                //光照模型(环境光照部分)

                //使用3Col环境色方法
                /*下面是环境光的漫反射部分,也就是三色环境光*/
                //上层光
                float upNor = clamp(nDirWS_FT.g,0.0,1.0);
                float3 upColor = upNor * _E_Lambert_UpColor;
                //下层光
                float downNor = clamp(nDirWS_FT.g * -1,0.0,1.0);
                float3 downColor = downNor * _E_Lambert_DownColor;
                //中层光
                float midNor = clamp(1 - upNor - downNor,0.0,1.0);
                float3 midColor = midNor * _E_Lambert_MidColor;
                /*环境光的漫反射部分  三色环境光*/
                float3 env_diff_all = clamp(upColor + downColor + midColor,0.0,1.0);

                /*下面是环境镜面反射光部分*/
                //cubemap
                float3 cubemap_Dir = vrDir;
                float3 cubemap_color = texCUBElod(_cubemap,float4(cubemap_Dir,_mipmap_level));

                //fresnel
                float OneMinusNoV = 1 - NoV;
                float fresnel = pow(OneMinusNoV,_fresnel_exp);

                float occlusion = var_MainTex.a;
                float3 envLighting = (baseCol * env_diff_all * _EnvDiffInt + cubemap_color * fresnel * _EnvSpecInt * var_SpecTex.a) * occlusion;

                //光照模型(自发光部分)
                float3 emission = var_EmitTex * _EmittInt * (sin(_Time.z) * 0.5 + 0.5);

                //特效部分
                //采样EffMap01
                float3 _EffMap01_var = tex2D(_EffMap01,i.uv1).xyz;
                float meshMask = _EffMap01_var.x;               //网格遮罩
                float faceRandomMask = _EffMap01_var.y;   //面上的随即灰度遮罩
                float faceSlopeMask = _EffMap01_var.z;        //面上的坡度(灰度渐变)遮罩
                //获取EffectMask
                float smallMask = i.effectMask.x;
                float midMask = i.effectMask.y;
                float bigMask = i.effectMask.z;
                float baseMask = i.effectMask.w;
                //计算Opacity
                float midOpacity = saturate(floor(min(faceRandomMask, 0.999999) + midMask));
                float bigOpacity = saturate(floor(min(faceSlopeMask, 0.999999) + midMask));
                float opacity = lerp(1.0, min(bigOpacity, midOpacity), baseMask);
                //叠加自发光
                float meshEmitInt = (bigMask - smallMask) * meshMask;
                meshEmitInt = meshEmitInt * meshEmitInt;
                emission += _EffCol * meshEmitInt * baseMask;

                ///返回结果
                float3 finalRGB = dirLighting + envLighting + emission;
                return float4(finalRGB * opacity, opacity);              
                //return bigOpacity;
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/793661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多模态自监督学习 + 下游任务介绍

自监督学习 意义 经过海量无标签数据的学习后可以习得一个强大的特征提取器,在面对新的任务,尤其是医疗影像等小样本任务时,也能提取到较好的特征。 常见用途 相对位置预测:预测一张图像中随机选择的两个图像块之间的相对位置 图像修复:预测一张图像…

项目管理的最佳选择:最简单的项目管理系统

作为一名项目经理,你是否曾经或正面临过这些麻烦:你一上班就开始了解项目计划的完成情况和工作进展情况。在检查和填补工作空白的同时,你必须面对各种报告和清单。仅仅找到各种材料和文件就需要很多时间。不仅如此,我们还需要出身…

git拉取项目报错:fatal: remote error: Service not enabled

一般是git地址错误,如果是原本就有的项目,看看是不是代码库移动到其他地方了,这个库已经被删除了

辐射定标高精度积分球均匀光源

近一二十年,在环境科学、太阳物理、大气物理、气候学及气象学等研究的推动下,高精度太阳/大气定量光谱遥感技术发展十分迅速。空间定量光谱遥感数据的获取精度很大程度上取决于遥感仪器的定标精度。所谓遥感仪器定标,即指建立仪器输出电信号与…

ADS仿真低噪声放大器学习笔记

ADS仿真低噪声放大器 设计要求&#xff1a; 工作频率&#xff1a;2.4~2.5GHz ISM频段 噪声系数&#xff1a;NF < 0.7 增益&#xff1a;Gain > 15 输入驻波输出驻波&#xff1a;&#xff1c;1.5 这里重点是ADS操作流程 1. 安装晶体管的库文件 1、 下载ATF54143晶体管的…

mybatisPlus基础篇

文章目录 通用Mapper接口简单插入数据-insert简单删除数据-deleteById简单修改数据-updateById简单查询数据-selectById 通用service接口Service接口-插入数据Service接口-删除数据Service接口-修改数据Service接口-查询数据自定义接口方法自定义Mapper接口方法 通用Mapper接口…

milvus: 专为向量查询与检索设计的向量数据库

1. 什么是milvus&#xff1f; milvus docs milvus release Milvus的目标是&#xff1a;store, index, and manage massive embedding vectors generated by deep neural networks and other machine learning (ML) models. Milvus 向量数据库专为向量查询与检索设计&#xf…

vue项目开发环境和生产环境代理的配置问题

1.跨域 跨域解决方案&#xff1a; 1.JSONP 通过动态 script标签跨域 2.document.domain iframe跨域 3.location.hash iframe 4.window.name iframe跨域 5.postMessage 跨 window 通信 6.跨域资源共享&#xff08;CORS&#xff09; 7.nginx代理跨域 8.nodejs中间件代理跨域 9…

基于光子实验的指数级加速的量子同态加密理论

前言 量子计算机不仅有望在某些重要任务上超越经典计算机&#xff0c;而且还能保护计算的隐私。例如&#xff0c;盲量子计算协议支持安全委托量子计算&#xff0c;其中客户端可以保护其数据和算法的隐私&#xff0c;不受分配来运行计算的量子服务器的影响。然而&#xff0c;这…

NOI Linux 2.0 CSP奥赛复赛环境安装使用指南

新人旧人区别 以下是可能导致你在老版 NOI Linux 系统下形成的习惯在新版下翻车的改动。 移除了 GUIDE从 32bit 变为了 64bit 系统&#xff0c;需要注意指针现在占 8 字节而不是 4 字节更新了编译器版本默认情况下右键没了【新建文件】的选项桌面目录改为中文&#xff0c;可能…

【3519AV200】AI算法承载硬件平台_双目IMX334视频通道接入硬件方案开发

Hi3519AV200内置四核A55&#xff0c;提供高效且丰富和灵活的CPU资源&#xff0c;以满足客户计算和控制需求。集成单核MCU&#xff0c;以满足某些低延时要求较高场景。 Hi3519AV200集成了高效的神经网络推理单元&#xff0c;支持2.5Tops INT8 &#xff0c;并支持业界主流的神经网…

【监控系统】可视化工具Grafana简介及容器化部署实战

1.什么是Grafana 官网地址&#xff1a;https://grafana.com/ Grafana用Go语言开发的开源数据可视化工具&#xff0c;可以做数据监控和数据统计&#xff0c;带有告警功能。支持快速灵活的客户端图表&#xff0c;面板插件有许多不同方式的可视化指标和日志&#xff0c;官方库中…

【MySQL】索引与B+树

【MySQL】索引与B树 索引概念前导硬件软件方面 索引的理解单个page多个page引入B树B树的特征为什么B树做索引优于其他数据结构&#xff1f;聚簇索引与非聚簇索引辅助索引 索引的创建主键索引的创建和查看唯一键索引的创建和查看普通索引的创建和查看复合索引全文索引索引的其他…

2.java语法

文章目录 2.1. 字符型常量和字符串常量的区别?2.2. 关于注释&#xff1f;2.3. 标识符和关键字的区别是什么&#xff1f;2.4. Java 中有哪些常见的关键字&#xff1f; 2.5. 自增自减运算符2.6. continue、break、和 return 的区别是什么&#xff1f; 2.1. 字符型常量和字符串常…

Java编译器中的优化技术

一、JIT技术 Java中的热点代码主要有两类&#xff0c;包括&#xff1a;1、被多次调用的方法。 2、被多次执行的循环体。 前者很好理解&#xff0c;一个方法被调用得多了&#xff0c;方法体内代码执行的次数自然就多&#xff0c;它成为 “ 热点代 码 ” 是理所当然的。而后者则…

《零基础入门学习Python》第068讲:GUI的终极选择:Tkinter5

这节课的主要内容为 Listbox 组件、Scrollbar 组件 和 Scale 组件 在之前的学习中&#xff0c;我们已经知道了&#xff0c;如果说提供选项给客户选择&#xff0c;那么有两种情况&#xff0c;单选的话&#xff0c;我们用 Radiobutton&#xff0c;多选的话&#xff0c;用Checkb…

笔记本电源适配器使用时发烫会有安全隐患吗?

笔记本电源适配器&#xff08;充电器&#xff09; 笔记本充电器内部是一个很大的电感结构&#xff0c;因其工作原理会产生一部分热能&#xff0c;所以部分发热是正常的&#xff0c;即使发热也会一直保持一定的温度。同时&#xff0c;充电器外壳都是耐高温的不会烧坏&#xff…

【MySQL】索引是什么东东?

书中的目录&#xff0c;就是充当索引的角色&#xff0c;方便我们快速查找书中的内容&#xff0c;所以索引是以空间换时间的设计思想。 索引和数据位于存储引擎中&#xff0c;MySQL默认的存储引擎是InnoDB。 1 为什么MySQL采用B树作为索引&#xff1f; 1.1 其他数据结构为什么…

C语言每日一题:6.移除元素+合并两个有序数组。

第一题&#xff1a;移除元素 思路一&#xff1a; 一&#xff1a;暴力查找的方法&#xff1a; 1.找到对应val值的下标&#xff0c;返回数组的下标。 2.删除对应的下标&#xff0c;从前向后用后面覆盖前面。当后一个是数组最后一个数值是就赋值结束了&#xff08;注意数组越界的问…

【C++】开源:grpc远程过程调用(RPC)配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍grpc远程过程调用&#xff08;RPC&#xff09;配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜…