庄懂着色器_L21_CyberPunk
庄懂-BoyanTata的个人空间_哔哩哔哩_Bilibili
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相关推荐
- 庄懂着色器_L05_镜面反射
庄懂-BoyanTata的个人空间_哔哩哔哩_Bilibili 漫反射-Diffuse 镜面反射-Specular 常用向量 漫反射 跟Camera或者人眼的观察视角无关 镜面反射 跟Camera ...
- 庄懂着色器_L09_Fresnel/Matcap/Cubemap
庄懂-BoyanTata的个人空间_哔哩哔哩_Bilibili 环境反射的做法有Matcap和Cubemap 菲涅尔现象 菲涅尔连连看部分 Fresnel = pow(1-ndotv,powVal)下 ...
- 庄懂着色器_L18_序列帧与极坐标
庄懂-BoyanTata的个人空间_哔哩哔哩_Bilibili 序列帧_Sequence 小人是一个AB的模型,外面鬼火是AD模式,是一个双Pass的Shader 代码部分 Pass可以都是有一个名字 ...
- 庄懂的技术美术入门课(美术向)——01~02学习笔记
目录 Lecture 01 1) 工程搭建示范 a) 准备工作 b) 创建Shader 2) 理论介绍 a) 结构(Struct) b) 简单的渲染管线 c) 模型->输入结构 d) 输入结构- ...
- 个人学习笔记——庄懂的技术美术入门课(美术向)01
个人学习笔记--庄懂的技术美术入门课(美术向)01 0 前言 1 工程搭建示范 2 理论 2.1 结构(struct) 2.2 渲染管线 3 操作 3.1-2 向量/标量/点积等若干线代基础 3.3 ...
- 庄懂的技术美术入门课(美术向) Lesson1
庄懂的技术美术入门课(美术向) Lesson1 一.关于结构和渲染管 1.1 结构 1.2 渲染管线 模型到输入结构的过程是选取.采集模型文件中的信息,可以提供给后续渲染用的相关信息 顶点Shader ...
- 个人学习笔记——庄懂的技术美术入门课(美术向)03
个人学习笔记--庄懂的技术美术入门课(美术向)03 1 回顾渲染流程 2 尝试shader代码 3 Lambert试试 4 节点组 5 作业 1 回顾渲染流程 老师以美术绘画的角度理解渲染管线,比较形 ...
- OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13
OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13 文章目录 OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13 1 帧缓存运算 1.1 裁剪测 ...
- 使用着色器模拟雾效果
上一篇关于天空盒的blog谈到了雾效果,那么这次来讨论一下用着色器实现雾效果的具体实现方法. 雾在大自然中是一种常见的天气现象,比如清晨时分在山上就能看到这种效果.我们可以使用OpenGL轻松地模拟出 ...
最新文章
- 2019全球AI人才分布图:美国占44%,中国人才净流入
- 浏览器兼容性 问题收集
- C# 学习笔记(8) 控件的跨线程访问
- ubuntu安装配置samba共享
- Linux 面试最高频的 5 个基本问题!
- 3DSlicer33:Adding MRML
- 使用selector改变按钮状态
- ML.NET Cookbook:(16)什么是规范化?为什么我需要关心?
- [转]【JAVA各版本特性】JAVA 1.0
- leetcode 137. 只出现一次的数字 II(位运算)
- C++ 获取类型信息
- 什么是Vim,Vim及其安装
- 只要沾上婚恋焦虑,她们就王者变青铜
- java改变人物动作_Java创建对象的动作分析
- Java 代码块:静态代码块、构造代码块、构造函数块
- ArcGIS拓扑关系建立概述
- Python给gif图片加文字水印
- envi精度评定_envi分类精度评价操作步骤
- 考研不歧视双非的院校计算机专业,21考研,保护一志愿不歧视“双非”的30所学校,值得收藏!...
- Java获取三个月的时间
热门文章
- Explain的解读
- 网站为什么会被降权?如何恢复网站被降权,没有流量呢?
- groovy+grails+gradle开发
- 未来计算机代替人脑吗,计算机不可能替代人脑写作
- 史克鲁克唱诗班-我最爱的!
- python输入一个数字n、计算1到n的和_python用户输入一个整数N,计算并输出1到N相加的和,请问这个程序错在哪里了?...
- Win7 共享打印机脱机解决
- springboot项目jar包发布的,如何线上修改jar包。
- 《鸟哥的Linux私房菜》chapter9 20180818~20180826
- 强化学习入坑之路04