庄懂-BoyanTata的个人空间_哔哩哔哩_Bilibili


案例_赛博小人
模型准备
平常所说的1U,2U对应Unity的是0U,1U
3Dsmax的顺序是从1开始的;Unity_UV的顺序是从0开始的
特效贴图制作
再需要一张模型的Position纹理
低频信息就是在整个纹理上,它的过渡比较平缓,它没有很高的相邻的对比,所以这张纹理不需要太大
烘焙了一张位置的模型信息,用这个位置信息去算它这个3D_Noise_噪声强度,并这个噪声强度转化到模型的UV空间,又把它拍平到它的UV空间的一个2D的Noise上(这张图是256*256,也是低频信号 )
Edge_Detect 边缘检测节点
Flood Fill连接Flood Fill To Random GrayScale是SD常用的作图套路
代码部分
Shader "AP01/L21/CyberPunk"
{Properties{[Header(Texture)]_MainTex    ("RGB:基础颜色 A:环境遮罩", 2D) = "white" {}[Normal] _NormTex   ("RGB:法线贴图", 2D)                = "bump" {}_SpecTex    ("RGB:高光颜色 A:高光次幂", 2D)     = "gray" {}_EmitTex    ("RGB:环境贴图", 2d)                = "black" {}_Cubemap    ("RGB:环境贴图", cube)              = "_Skybox" {}[Header(Diffuse)]_MainCol    ("基本色",      Color)              = (0.5, 0.5, 0.5, 1.0)_EnvDiffInt ("环境漫反射强度",  Range(0, 1))    = 0.2_EnvUpCol   ("环境天顶颜色", Color)             = (1.0, 1.0, 1.0, 1.0)_EnvSideCol ("环境水平颜色", Color)             = (0.5, 0.5, 0.5, 1.0)_EnvDownCol ("环境地表颜色", Color)             = (0.0, 0.0, 0.0, 0.0)[Header(Specular)][PowerSlider(2)] _SpecPow    ("高光次幂",    Range(1, 90))       = 30_EnvSpecInt ("环境镜面反射强度", Range(0, 5))   = 0.2_FresnelPow ("菲涅尔次幂", Range(0, 5))         = 1_CubemapMip ("环境球Mip", Range(0, 7))          = 0[Header(Emission)][HideInInspect] _EmitInt    ("自发光强度", range(1, 10))         = 1[Header(Effect)]_EffMap01   ("特效纹理1", 2D)                   = "gray" {}_EffMap02   ("特效纹理2", 2D)                   = "gray" {}[HDR]_EffCol     ("光效颜色", color)                 = (0.0, 0.0, 0.0, 0.0)_EffParams  ("X:波密度 Y:波速度 Z:混乱度 W:消散强度", vector) = (0.03, 3.0, 0.3, 2.5)}SubShader{Tags { "Queue"="Transparent" "RenderType"="Transparent" }Pass{Name "FORWARD"Tags { "LightMode"="ForwardBase" }Blend One OneMinusSrcAlpha          // 修改混合方式One/SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"// 追加投影相关包含文件#include "AutoLight.cginc"#include "Lighting.cginc"#include "../../Lesson11/cginc/MyCginc.cginc"   // 修改Cginc引用路径#pragma multi_compile_fwdbase_fullshadows#pragma target 3.0// 输入参数// Textureuniform sampler2D _MainTex; uniform float4 _MainTex_ST;uniform sampler2D _NormTex;uniform sampler2D _SpecTex;uniform sampler2D _EmitTex;uniform samplerCUBE _Cubemap;// Diffuseuniform float3 _MainCol;uniform float _EnvDiffInt;uniform float3 _EnvUpCol;uniform float3 _EnvSideCol;uniform float3 _EnvDownCol;// Specularuniform float _SpecPow;uniform float _FresnelPow;uniform float _EnvSpecInt;uniform float _CubemapMip;// Emissionuniform float _EmitInt;// Effectuniform sampler2D _EffMap01;uniform sampler2D _EffMap02;uniform float3 _EffCol;uniform float4 _EffParams;// 输入结构struct VertexInput{float4 vertex   : POSITION;   // 顶点信息 Get✔float2 uv0      : TEXCOORD0;  // UV信息 Get✔float2 uv1      : TEXCOORD1;  // UV信息 Get✔float4 normal   : NORMAL;     // 法线信息 Get✔float4 tangent  : TANGENT;    // 切线信息 Get✔float4 color    : COLOR;      // 追加顶点色信息};// 输出结构struct VertexOutput{float4 pos    : SV_POSITION;  // 屏幕顶点位置float2 uv0      : TEXCOORD0;  // UV0float2 uv1      : TEXCOORD1;  // UV0float4 posWS    : TEXCOORD2;  // 世界空间顶点位置float3 nDirWS   : TEXCOORD3;  // 世界空间法线方向float3 tDirWS   : TEXCOORD4;  // 世界空间切线方向float3 bDirWS   : TEXCOORD5;  // 世界空间副切线方向float4 effectMask : TEXCOORD6;  // 追加effectMask输出LIGHTING_COORDS(7, 8)          // 投影相关};// 动画方法 inout顶点信息 返回effct相关遮罩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;baseMask = min(1.0, baseMask * 2.0);// 用Noise偏移锯齿波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.y) * _EffParams.w * mask;// 返回EffectMaskreturn effectMask;}// 输入结构>>>顶点Shader>>>输出结构VertexOutput vert (VertexInput v){// 采样纹理float noise = tex2Dlod(_EffMap02, float4(v.uv1, 0.0, 0.0)).r;// 输出结构VertexOutput o = (VertexOutput)0;// 计算顶点动画 同时获取EffectMasko.effectMask = CyberpunkAnim(noise, v.color.r, v.normal.xyz, v.vertex.xyz);o.pos = UnityObjectToClipPos(v.vertex);         // 顶点位置 OS>CSo.uv0 = v.uv0 * _MainTex_ST.xy + _MainTex_ST.zw;// 传递UVo.uv1 = v.uv1;o.posWS = mul(unity_ObjectToWorld, v.vertex);   // 顶点位置 OS>WSo.nDirWS = UnityObjectToWorldNormal(v.normal);  // 法线方向 OS>WSo.tDirWS = normalize(mul(unity_ObjectToWorld, float4(v.tangent.xyz, 0.0)).xyz); // 切线方向 OS>WSo.bDirWS = normalize(cross(o.nDirWS, o.tDirWS) * v.tangent.w);  // 副切线方向TRANSFER_VERTEX_TO_FRAGMENT(o)                  // 投影相关return o;                                           // 返回输出结构}// 输出结构>>>像素float4 frag(VertexOutput i) : COLOR{// 准备向量float3 nDirTS = UnpackNormal(tex2D(_NormTex, i.uv0)).rgb;float3x3 TBN = float3x3(i.tDirWS, i.bDirWS, i.nDirWS);float3 nDirWS = normalize(mul(nDirTS, TBN));float3 vDirWS = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);float3 vrDirWS = reflect(-vDirWS, nDirWS);float3 lDirWS = _WorldSpaceLightPos0.xyz;float3 lrDirWS = reflect(-lDirWS, nDirWS);// 准备点积结果float ndotl = dot(nDirWS, lDirWS);float vdotr = dot(vDirWS, lrDirWS);float vdotn = dot(vDirWS, nDirWS);// 采样纹理float4 var_MainTex = tex2D(_MainTex, i.uv0);float4 var_SpecTex = tex2D(_SpecTex, i.uv0);float3 var_EmitTex = tex2D(_EmitTex, i.uv0).rgb;float3 var_Cubemap = texCUBElod(_Cubemap, float4(vrDirWS, lerp(_CubemapMip, 0.0, var_SpecTex.a))).rgb;// 光照模型(直接光照部分)float3 baseCol = var_MainTex.rgb * _MainCol;float lambert = max(0.0, ndotl);float specCol = var_SpecTex.rgb;float specPow = lerp(1, _SpecPow, var_SpecTex.a);float phong = pow(max(0.0, vdotr), specPow);float shadow = LIGHT_ATTENUATION(i);float3 dirLighting = (baseCol * lambert + specCol * phong) * _LightColor0 * shadow;// 光照模型(环境光照部分) 3Col环境色方法float3 envCol = TriColAmbient(nDirWS, _EnvUpCol, _EnvSideCol, _EnvDownCol);float fresnel = pow(max(0.0, 1.0 - vdotn), _FresnelPow);    // 菲涅尔float occlusion = var_MainTex.a;float3 envLighting = (baseCol * envCol * _EnvDiffInt + var_Cubemap * fresnel * _EnvSpecInt * var_SpecTex.a) * occlusion;// 光照模型(自发光部分)float3 emission = var_EmitTex * _EmitInt * (sin(_Time.z) * 0.5 + 0.5);// 特效部分// 采样EffMap02float3 _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 bigOpacity = saturate(floor(min(faceRandomMask, 0.999999) + midMask));float midOpacity = saturate(floor(min(faceSlopeMask, 0.999999) + bigMask));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);}ENDCG}}FallBack "Diffuse"
}
知识点

庄懂着色器_L21_CyberPunk相关推荐

  1. 庄懂着色器_L05_镜面反射

    庄懂-BoyanTata的个人空间_哔哩哔哩_Bilibili 漫反射-Diffuse  镜面反射-Specular 常用向量 漫反射 跟Camera或者人眼的观察视角无关 镜面反射  跟Camera ...

  2. 庄懂着色器_L09_Fresnel/Matcap/Cubemap

    庄懂-BoyanTata的个人空间_哔哩哔哩_Bilibili 环境反射的做法有Matcap和Cubemap 菲涅尔现象 菲涅尔连连看部分 Fresnel = pow(1-ndotv,powVal)下 ...

  3. 庄懂着色器_L18_序列帧与极坐标

    庄懂-BoyanTata的个人空间_哔哩哔哩_Bilibili 序列帧_Sequence 小人是一个AB的模型,外面鬼火是AD模式,是一个双Pass的Shader 代码部分 Pass可以都是有一个名字 ...

  4. 庄懂的技术美术入门课(美术向)——01~02学习笔记

    目录 Lecture 01 1) 工程搭建示范 a) 准备工作 b) 创建Shader 2) 理论介绍 a) 结构(Struct) b) 简单的渲染管线 c) 模型->输入结构 d) 输入结构- ...

  5. 个人学习笔记——庄懂的技术美术入门课(美术向)01

    个人学习笔记--庄懂的技术美术入门课(美术向)01 0 前言 1 工程搭建示范 2 理论 2.1 结构(struct) 2.2 渲染管线 3 操作 3.1-2 向量/标量/点积等若干线代基础 3.3 ...

  6. 庄懂的技术美术入门课(美术向) Lesson1

    庄懂的技术美术入门课(美术向) Lesson1 一.关于结构和渲染管 1.1 结构 1.2 渲染管线 模型到输入结构的过程是选取.采集模型文件中的信息,可以提供给后续渲染用的相关信息 顶点Shader ...

  7. 个人学习笔记——庄懂的技术美术入门课(美术向)03

    个人学习笔记--庄懂的技术美术入门课(美术向)03 1 回顾渲染流程 2 尝试shader代码 3 Lambert试试 4 节点组 5 作业 1 回顾渲染流程 老师以美术绘画的角度理解渲染管线,比较形 ...

  8. OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13

    OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13 文章目录 OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13 1 帧缓存运算 1.1 裁剪测 ...

  9. 使用着色器模拟雾效果

    上一篇关于天空盒的blog谈到了雾效果,那么这次来讨论一下用着色器实现雾效果的具体实现方法. 雾在大自然中是一种常见的天气现象,比如清晨时分在山上就能看到这种效果.我们可以使用OpenGL轻松地模拟出 ...

最新文章

  1. 2019全球AI人才分布图:美国占44%,中国人才净流入
  2. 浏览器兼容性 问题收集
  3. C# 学习笔记(8) 控件的跨线程访问
  4. ubuntu安装配置samba共享
  5. Linux 面试最高频的 5 个基本问题!
  6. 3DSlicer33:Adding MRML
  7. 使用selector改变按钮状态
  8. ML.NET Cookbook:(16)什么是规范化?为什么我需要关心?
  9. [转]【JAVA各版本特性】JAVA 1.0
  10. leetcode 137. 只出现一次的数字 II(位运算)
  11. C++ 获取类型信息
  12. 什么是Vim,Vim及其安装
  13. 只要沾上婚恋焦虑,她们就王者变青铜
  14. java改变人物动作_Java创建对象的动作分析
  15. Java 代码块:静态代码块、构造代码块、构造函数块
  16. ArcGIS拓扑关系建立概述
  17. Python给gif图片加文字水印
  18. envi精度评定_envi分类精度评价操作步骤
  19. 考研不歧视双非的院校计算机专业,21考研,保护一志愿不歧视“双非”的30所学校,值得收藏!...
  20. Java获取三个月的时间

热门文章

  1. Explain的解读
  2. 网站为什么会被降权?如何恢复网站被降权,没有流量呢?
  3. groovy+grails+gradle开发
  4. 未来计算机代替人脑吗,计算机不可能替代人脑写作
  5. 史克鲁克唱诗班-我最爱的!
  6. python输入一个数字n、计算1到n的和_python用户输入一个整数N,计算并输出1到N相加的和,请问这个程序错在哪里了?...
  7. Win7 共享打印机脱机解决
  8. springboot项目jar包发布的,如何线上修改jar包。
  9. 《鸟哥的Linux私房菜》chapter9 20180818~20180826
  10. 强化学习入坑之路04