庄懂着色器_L09_Fresnel/Matcap/Cubemap
Shader "AP01/L09/Matcap"
{Properties{_NormalMap ("法线贴图", 2D) = "bump" {}_Matcap ("Matcap", 2D) = "gray" {}_FresnelPow ("菲涅尔次幂", Range(0, 10)) = 1_EnvSpecInt ("环境镜面反射强度", Range(0, 5)) = 1}SubShader{Tags { "RenderType"="Opaque" }Pass{Name "FORWARD"Tags { "LightMode"="ForwardBase" }CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#pragma multi_compile_fwdbase_fullshadows#pragma target 3.0// 输入参数uniform sampler2D _NormalMap;uniform sampler2D _Matcap;uniform float _FresnelPow;uniform float _EnvSpecInt;// 输入结构struct VertexInput{float4 vertex : POSITION; // 顶点信息float2 uv0 : TEXCOORD0; // uv信息float3 normal : NORMAL; // 法线信息float4 tangent : TANGENT; // 切线信息};// 输出结构struct VertexOutput{float4 pos : SV_POSITION; // 屏幕顶点位置float2 uv0 : TEXCOORD0; // uv信息float4 posWS : TEXCOORD1; // 世界顶点位置float3 nDirWS : TEXCOORD2; // 世界法线方向float3 tDirWS : TEXCOORD3; // 世界切线方向float3 bDirWS : TEXCOORD4; // 世界副切线方向};// 输入结构>>>顶点Shader>>>输出结构VertexOutput vert (VertexInput v){VertexOutput o = (VertexOutput)0; // 新建一个输出结构o.pos = UnityObjectToClipPos( v.vertex );o.uv0 = v.uv0; // 传递uv信息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); // 根据nDir tDir求bDirreturn o; // 将输出结构 输出}// 输出结构>>>像素float4 frag(VertexOutput i) : COLOR{// 准备向量float3 nDirTS = UnpackNormal(tex2D(_NormalMap, i.uv0)).rgb;float3x3 TBN = float3x3(i.tDirWS, i.bDirWS, i.nDirWS);float3 nDirWS = normalize(mul(nDirTS, TBN)); // 计算nDirVS 计算Fresnelfloat3 nDirVS = mul(UNITY_MATRIX_V, nDirWS); // 计算MatcapUVfloat3 vDirWS = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz); // 计算Fresnel// 准备中间变量float vdotn = dot(vDirWS, nDirWS);float2 matcapUV = nDirVS.rg * 0.5 + 0.5;// 光照模型float3 matcap = tex2D(_Matcap, matcapUV);float fresnel = pow(max(0.0, 1.0 - vdotn), _FresnelPow);float3 envSpecLighting = matcap * fresnel * _EnvSpecInt;// 返回值return float4(envSpecLighting, 1.0);}ENDCG}}FallBack "Diffuse"
}
Shader "AP01/L09/Cubemap"
{Properties{_Cubemap ("环境球", Cube) = "_Skybox" {}_NormalMap ("法线贴图", 2D) = "bump" {}_CubemapMip ("环境球Mip", Range(0, 7)) = 0_FresnelPow ("菲涅尔次幂", Range(0, 5)) = 1_EnvSpecInt ("环境镜面反射强度", Range(0, 5)) = 0.2}SubShader{Tags { "RenderType"="Opaque" }Pass{Name "FORWARD"Tags { "LightMode"="ForwardBase" }CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#pragma multi_compile_fwdbase_fullshadows#pragma target 3.0// 输入参数uniform samplerCUBE _Cubemap;uniform sampler2D _NormalMap;uniform float _CubemapMip;uniform float _FresnelPow;uniform float _EnvSpecInt;// 输入结构struct VertexInput{float4 vertex : POSITION; // 顶点信息float2 uv0 : TEXCOORD0; // uv信息float3 normal : NORMAL; // 法线信息float4 tangent : TANGENT; // 切线信息};// 输出结构struct VertexOutput{float4 pos : SV_POSITION; // 屏幕顶点位置float2 uv0 : TEXCOORD0; // uv信息float4 posWS : TEXCOORD1; // 世界顶点位置float3 nDirWS : TEXCOORD2; // 世界法线方向float3 tDirWS : TEXCOORD3; // 世界切线方向float3 bDirWS : TEXCOORD4; // 世界副切线方向};// 输入结构>>>顶点Shader>>>输出结构VertexOutput vert (VertexInput v){VertexOutput o = (VertexOutput)0; // 新建一个输出结构o.pos = UnityObjectToClipPos( v.vertex );o.uv0 = v.uv0; // 传递uv信息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); // 根据nDir tDir求bDirreturn o; // 将输出结构 输出}// 输出结构>>>像素float4 frag(VertexOutput i) : COLOR{// 准备向量float3 nDirTS = UnpackNormal(tex2D(_NormalMap, i.uv0)).rgb;float3x3 TBN = float3x3(i.tDirWS, i.bDirWS, i.nDirWS);float3 nDirWS = normalize(mul(nDirTS, TBN)); // 计算Fresnel 计算vrDirWSfloat3 vDirWS = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz); // 计算Fresnelfloat3 vrDirWS = reflect(-vDirWS, nDirWS);// 采样Cubemap// 准备中间变量float vdotn = dot(vDirWS, nDirWS);// 光照模型float3 var_Cubemap = texCUBElod(_Cubemap, float4(vrDirWS, _CubemapMip)).rgb;float fresnel = pow(max(0.0, 1.0 - vdotn), _FresnelPow);float3 envSpecLighting = var_Cubemap * fresnel * _EnvSpecInt;// 返回值return float4(envSpecLighting, 1.0);}ENDCG}}FallBack "Diffuse"
}
庄懂着色器_L09_Fresnel/Matcap/Cubemap相关推荐
- 庄懂着色器_L21_CyberPunk
庄懂-BoyanTata的个人空间_哔哩哔哩_Bilibili 案例_赛博小人 模型准备 平常所说的1U,2U对应Unity的是0U,1U 3Dsmax的顺序是从1开始的;Unity_UV的顺序是从0 ...
- 庄懂着色器_L05_镜面反射
庄懂-BoyanTata的个人空间_哔哩哔哩_Bilibili 漫反射-Diffuse 镜面反射-Specular 常用向量 漫反射 跟Camera或者人眼的观察视角无关 镜面反射 跟Camera ...
- 庄懂着色器_L18_序列帧与极坐标
庄懂-BoyanTata的个人空间_哔哩哔哩_Bilibili 序列帧_Sequence 小人是一个AB的模型,外面鬼火是AD模式,是一个双Pass的Shader 代码部分 Pass可以都是有一个名字 ...
- 庄懂的TA笔记(九)<菲涅尔 + MatCap + CubeMap>
庄懂的TA笔记(九)<菲涅尔 + MatCap + CubeMap> 课程内容: 1.菲涅尔 0.效果展示.公式: 菲涅尔现象: Fresnel(菲涅尔) 用到的两个向量 NdirWS ...
- 庄懂的技术美术入门课(美术向)——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 ...
- 个人学习笔记——庄懂的技术美术入门课(美术向)09
个人学习笔记--庄懂的技术美术入门课(美术向)09 1 菲涅尔 2 连连看-MatCap 3 连连看-CubeMap 4 代码 MatCap 5 代码 CubeMap 1 菲涅尔 更具体的PBR可以参 ...
- 庄懂的技术美术入门课(美术向) Lesson1
庄懂的技术美术入门课(美术向) Lesson1 一.关于结构和渲染管 1.1 结构 1.2 渲染管线 模型到输入结构的过程是选取.采集模型文件中的信息,可以提供给后续渲染用的相关信息 顶点Shader ...
- 个人学习笔记——庄懂的技术美术入门课(美术向)03
个人学习笔记--庄懂的技术美术入门课(美术向)03 1 回顾渲染流程 2 尝试shader代码 3 Lambert试试 4 节点组 5 作业 1 回顾渲染流程 老师以美术绘画的角度理解渲染管线,比较形 ...
最新文章
- UIApplicaton详情
- NUC120 SPI 模拟I2S
- 深入理解Java:注解(Annotation)基本概念
- html5制作语音交互功能,语音交互设计(1):设计流程
- 2016 Top 10 Android Library
- python计算长方体体积最简单代码_python处理DICOM并计算三维模型体积
- Python之Pymysql模块操作MySQL增删改查
- 31 CO配置-控制-产品成本控制-成本对象控制-期末结算-定义结算在产品的记帐规则
- Java学习关于集合框架的基础接口--Collection接口
- 计算机基础854哈工大,854计算机基础大纲
- [目标跟踪] 论文笔记:Parallel Tracking and Verifying(PTAV-Update)
- VUE实现一个Flappy Bird~~~
- JSD-2204-MVC-微博项目-Day15
- 蓝牙核心技术概述(一):蓝牙概述
- 教务管理系统(免费源码获取)
- 系统关键文件丢失或损坏
- 懒人原则(Kepp it Semple Stupis)
- 蓝桥ROS机器人之古月居ROS入门21讲
- Revit标注问题:尺寸界线长度和“快速尺寸定位标注”
- 联想t450进入bios设置按哪个键_联想pad T450用U盘做系统,读取不到硬盘该如何处理,如何进BIOS设置,...