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

文章目录

  • 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 100Pass{Name "FORWARD"Tags{"LightMode" = "ForwardBase"}Blend One OneMinusSrcAlpha      //ABCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "AutoLight.cginc"#include "Lighting.cginc"#pragma multi_compile_fwdbase_fullshadows#pragma target 3.0struct 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)            //投影相关};//Textureuniform sampler2D _MainTex;            uniform sampler2D _normal;uniform sampler2D _SpecTex;uniform sampler2D _EmittTex;uniform samplerCUBE _cubemap;           //Diffuseuniform float3 _MainCol;uniform float _EnvDiffInt;uniform float3 _E_Lambert_UpColor;uniform float3 _E_Lambert_DownColor;uniform float3 _E_Lambert_MidColor;//Specularuniform float _SpecPow;            uniform float _EnvSpecInt;            uniform float _fresnel_exp;uniform float _mipmap_level;//Emittuniform float _EmittInt;//Effectuniform 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){//生成锯齿波Maskfloat 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算出各级Maskfloat4 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);//将顶点色遮罩存入effectMaskeffectMask.w = mask;//计算顶点动画vertex.xz += normal.xz * (1.0 - effectMask.x) * _EffParams.w * mask;//返回effectMaskreturn 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);/*下面是环境镜面反射光部分*///cubemapfloat3 cubemap_Dir = vrDir;float3 cubemap_color = texCUBElod(_cubemap,float4(cubemap_Dir,_mipmap_level));//fresnelfloat 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);//特效部分//采样EffMap01float3 _EffMap01_var = tex2D(_EffMap01,i.uv1).xyz;float meshMask = _EffMap01_var.x;               //网格遮罩float faceRandomMask = _EffMap01_var.y;   //面上的随即灰度遮罩float faceSlopeMask = _EffMap01_var.z;        //面上的坡度(灰度渐变)遮罩//获取EffectMaskfloat smallMask = i.effectMask.x;float midMask = i.effectMask.y;float bigMask = i.effectMask.z;float baseMask = i.effectMask.w;//计算Opacityfloat 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.mzph.cn/news/9549.shtml

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

相关文章

拦截Bean使用之前各个时机的Spring组件

拦截Bean使用之前各个时机的Spring组件 之前使用过的BeanPostProcessor就是在Bean实例化之后,注入属性值之前的时机。 Spring Bean的生命周期本次演示的是在Bean实例化之前的时机,使用BeanFactoryPostProcessor进行验证,以及在加载Bean之前进…

NISP含金量?NISP真的有必要考么?NISP好考吗?NISP二级为什么那么贵?

NISP证书简述 NISP证书三个级别,分别是:一级、二级、三级(专项) 证书。其每一项资格证书都有不同的优点,但是优点各有 相同,而且拥有NISP二级证书可以免考更换CISP资格证书,那么证书含金量如何下…

rcu链表综合实践

基础知识 rcu-read copy update的缩写。和读写锁起到相同的效果。据说牛逼一点。对于我们普通程序员,要先学会使用,再探究其内部原理。 链表的数据结构: struct list_head {struct list_head *next, *prev; };还有一种:struct h…

STM32(HAL库)驱动st7789LCD屏幕(7引脚240*240)

目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 屏幕引脚配置 2.3 项目生成 3、KEIL端程序整合 3.1 LCD驱动添加 3.2 函数修改 3.2.1 lcd.h修改 3.2.2 lcd_innit.h 修改 3.2.3 lcd.c修改 3.2.4 lcd_inut.c修改 3.3 主函数代码 3.3…

Django学习笔记-表单(forms)的使用

在Django中提供了了form表单,可以更为简单的创建表单模板信息,简化html的表单。 一、网页应用程序中表单的应用 表单通常用来作为提交数据时候使用。 1.1 创建表单模板文件夹 在项目文件夹下创建一个template文件夹,用于存储所有的html模…

使用百度地图SDK计算距离

说明:通过百度地图提供的SDK,可以计算出两个地点之间的距离,另外还有行驶路线等等。本文介绍如果使用百度地图SDK,并用java代码实现。 申请 首先需要登录百度地图的官网,申请开发者认证,个人认证一般都很…

GPT一键化身「AI助理」——自定义指令功能

最近GPT又更新了一个超实用的功能——自定义指令,启用后,你可以给GPT设置一些固定指令,让它记住或扮演某个角色,比如客服、律师、投资管理师、老师、营养师...... 这样,我们就不再需要每次都要打开新的聊天&#xff0c…

ChatGPT的工作原理:从输入到输出

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

华为eNSP:isis配置跨区域路由

一、拓扑图 二、路由器的配置 1、配置接口IP AR1: <Huawei>system-view [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei-GigabitEthernet0/0/0]q AR2: [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.2 24 [Huawe…

【React Native】学习记录(一)——环境搭建

Expo是一套工具&#xff0c;库和服务&#xff0c;可让您通过编写JavaScript来构建原生iOS和Android应用程序。 一开始学习的时候直接使用的是expo。 npx create-expo-app my-appcd my-appnpm run start接下来需要搭建安卓和IOS端&#xff08;为此特意换成了苹果电脑&#xff09…

云曦暑期学习第二周——文件上传漏洞

1.文件上传 1.1原理 一些web应用程序中允许上传图片、视频、头像和许多其他类型的文件到服务器中。 文件上传漏洞就是利用服务端代码对文件上传路径变量过滤不严格将可执行的文件上传到一个到服务器中 &#xff0c;再通过URL去访问以执行恶意代码。 1.2为什么存在文件上传漏…

Angular:动态依赖注入和静态依赖注入

问题描述&#xff1a; 自己写的服务依赖注入到组件时候是直接在构造器内初始化的。 直到看见代码中某大哥写的 private injector: Injector 动态依赖注入和静态依赖注入 在 Angular 中&#xff0c;使用构造函数注入的方式将服务注入到组件中是一种静态依赖注入的方式。这种方…

ThinkPHP8知识详解:给PHP8和MySQL8添加到环境变量

在PHPenv安装的时候&#xff0c;环境变量默认的PHP版本是7.4的&#xff0c;MySQL的版本是5.7的&#xff0c;要想使用ThinkPHP8来开发&#xff0c;就必须修改环境变量&#xff0c;本文就详细讲解了如果修改PHP和MySQL的环境变量。 1、添加网站 启动phpenv&#xff0c;网站&…

LiveGBS流媒体平台GB/T28181功能-设备树自定义分组自定义组织机构选择通道共享给上级国标平台配置权限给指定用户

LiveGBS流媒体平设备树自定义分组自定义组织机构选择通道共享给上级国标平台权限给指定用户 1、背景2、分组2.1、新建分组2.2、选择通道2.3、导入设备2.4、编辑名称2.5、删除分组2.6、移除分组 3、国标级联3.1、分组共享节点3.1.1、共享给上级平台3.1.2、分配权限给用户 3.2、级…

Android 帧率分析

卡顿&#xff1a; 界面呈现是指从应用生成帧并将其显示在屏幕上的动作。如需确保用户能够流畅地与您的应用互动&#xff0c;您的应用呈现每帧的时间不应超过 16ms&#xff0c;以达到每秒 60 帧的呈现速度&#xff08;为什么是 60fps&#xff1f;&#xff09;。如果您的应用存在…

PV操作解决经典进程同步问题

一.经典同步问题 在学习《操作系统》时&#xff0c;会接触到进程的概念&#xff0c;其中不可避免的接触到进程同步问题&#xff0c;今天我们用熟悉的PV操作解决一些经典的进程同步问题。 二.生产者-消费者问题 1.问题描述 问题描述&#xff1a;一组生产者进程和一组消费者进…

汽车交流充电桩控制主板的电路设计

汽车充电桩控制主板的电路设计 你是否曾经遇到过汽车没油的问题?但是&#xff0c;随着电动汽车的普及&#xff0c;充电问题也变得越来越重要。而汽车充电桩控制板电路设计则是解决这一问题的关键。 汽车充电桩控制板电路设计包括硬件电路设计、软件电路设计和安全性设计。硬件…

[vulnhub]DC2

文章目录 [vulnhub]DC2信息收集flag1flag2cewlwpscan flag3什么是rbash&#xff1f; flag4flag5git提权 总结 [vulnhub]DC2 信息收集 扫ip&#xff0c;有两种方式&#xff1a;arp、nmap nmap -sP 192.168.56.0/24 -T4arp-scan -l192.168.56.137 扫端口&#xff1a; nmap -…

TEE GP(Global Platform)认证方案

TEE之GP(Global Platform)认证汇总 一、GP认证方案 二、GP认证方案分类 参考&#xff1a; GlobalPlatform Certification - GlobalPlatform

微服务系列(1)-who i am?

微服务系列&#xff08;1&#xff09;-我是谁 应用架构的演化 简单来说系统架构可以分为以下几个阶段&#xff1a;复杂的臃肿的单体架构-SOA架构-微服务 单体架构及其所面临的问题 在互联网发展初期&#xff0c;用户数量少&#xff0c;流量小&#xff0c;硬件成本高。因此…