当前位置: 首页 > news >正文

【Unity Shader】切线空间下计算凹凸映射

在这里插入图片描述

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Unlit/NormalTangent"
{Properties{_Color("Color Tint", Color) = (1, 1, 1, 1)_MainTex("Main Tex", 2D) = "While"{}//法线纹理_BumpMap("Normal Map", 2D) = "bump"{}//控制凹凸程度,为0时意味该法线纹理不会对光照产生任何影响_BumpScale("Bump Scale", Float) = 1.0_Specular("Specular", Color) = (1,1,1,1)_Gloss("Gloss", Range(8.0, 256)) = 20}SubShader{Pass{Tags{"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"fixed4 _Color;sampler2D _MainTex;float4 _MainTex_ST;sampler2D _BumpMap;float4 _BumpMap_ST;float _BumpScale;fixed4 _Specular;float _Gloss;struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;float4 tangent : TANGENT;float4 texcoord : TEXCOORD0;};struct v2f{float4 pos : SV_POSITION;float4 uv : TEXCOORD0;float3 lightDir : TEXCOORD1;float3 viewDir : TEXCOORD2;};v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv.xy = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;o.uv.zw = v.texcoord.xy * _BumpMap_ST.xy + _BumpMap_ST.zw;TANGENT_SPACE_ROTATION;//将光照方向从模型空间转换到切线空间中,ObjSpaceLightDir是内置函数,得到模型空间中的光照o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex)).xyz;//将视角方向从模型空间转换到切线空间中,ObjSpaceViewDir是内置函数,得到模型空间中的视角方向o.viewDir = mul(rotation, ObjSpaceViewDir(v.vertex)).xyz;return o;}fixed4 frag(v2f i) : SV_Target{fixed3 tangentLightDir = normalize(i.lightDir);fixed3 tangentViewDir = normalize(i.viewDir);fixed4 packedNormal = tex2D(_BumpMap, i.uv.zw);fixed3 tangentNormal;//如果没有在Unity中把该法线纹理类型设置成Normal map//tangentNormal.xy = (packedNormal.xy * 2 - 1) * _BumpScale;//tangentNormal.z = sqrt(1.0 - saturate(dot(tangentNormal.xy, tangentNormal.xy)));//如果设置了Normal maptangentNormal = UnpackNormal(packedNormal);tangentNormal.xy *= _BumpScale;tangentNormal.z = sqrt(1.0 - saturate(dot(tangentNormal.xy, tangentNormal.xy)));fixed3 albedo = tex2D(_MainTex, i.uv).rgb * _Color.rgb;fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(tangentNormal, tangentLightDir));fixed3 halfDir = normalize(tangentLightDir + tangentViewDir);fixed3 specular = _LightColor0.rgb * _Specular * pow(max(0, dot(tangentNormal, halfDir)), _Gloss);return fixed4(ambient + diffuse +specular, 1.0);}ENDCG}}Fallback "Specular"
}
http://www.lryc.cn/news/414641.html

相关文章:

  • 解决Ubuntu/Kali手动创建的启动器在dock上没有图标,且不能“添加到dock中“的问题
  • 【Android】数据持久化——数据存储
  • 如何通过谷歌外链快速增加网站流量?
  • vLLMcuda安装笔记
  • C++入门基本语法(2)
  • Internet Download Manager(IDM)2024中文版本有哪些新功能?6.42版本功能介绍
  • 深入理解 C 语言中的联合体
  • OpenCV||超详细的几何变换
  • 网络程序设计基础概述
  • MySQL:数据库用户
  • 用TensorFlow训练自己的第一个模型
  • MySQL数据库入门基础知识 【1】推荐
  • Anaconda下的 jupyter notebook安装及使用
  • C语言初阶(11)
  • Unity获取Animator动画播放完成事件
  • git submodule 使用
  • 【Jenkins未授权访问漏洞 】
  • 前端处理 Excel 文件
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • Redis进阶(四):哨兵
  • 蓝屏事件:网络安全的启示
  • 技术方案评审原则
  • 117页PPT埃森哲-物流行业信息化整体规划方案
  • 百度网盘不下载怎么直接打印文件?
  • 设置了 robots.txt 禁止爬虫抓取,为什么还是能被百度搜索出来
  • DedeCMS-V5.7.82-UTF8织梦管理系统漏洞
  • 【Python】字符串练习题及代码示例
  • fluent动网格profile udf 注意事项
  • 【doghead】mac构建 2: player 端 clion构建
  • 论网络流(最大流篇)--新手入门超详解--包教包会