Unity - Normal mapping - Reoriented normal mapping - 重定向法线、混合法线

文章目录

  • 目的
  • 核心代码
  • PBR - Filament - Normal mapping
  • Shader
  • 效果
    • BlendNormal_Hill12
    • BlendNormal_UDN
    • BlendNormals_Unity_Native - 效果目前最好
  • Project
  • References


目的

备份、拾遗


核心代码

half3 blended_normal = normalize(half3(n1.xy + n2.xy, n1.z*n2.z));

PBR - Filament - Normal mapping

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


Shader

// jave.lin : 测试 法线重定向 (混合)Shader "Test/TestingNormalmapBlending"
{Properties{_MainTex ("Texture", 2D) = "white" {}_BumpMap ("Normal Map", 2D) = "bump" {}_BumpDetailMap ("Normal Detail Map", 2D) = "bump" {}_BumpBlending ("Bump Blending", Range(0.0, 1.0)) = 1.0}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;half3 normal :  NORMAL;half4 tangent : TANGENT; // xyz : dir, w : sign};struct v2f{float4 vertex : SV_POSITION;float2 uv : TEXCOORD0;half3 tangentWS :   TEXCOORD1;  // xyz : dir, w : view dir.yhalf3 normalWS :    TEXCOORD2;  // xyz : dir, w : view dir.xhalf3 binormalWS :  TEXCOORD3;  // xyz : dir, w : view dir.zfloat3 posWS : TEXCOORD4;       // xyz : world position};sampler2D _MainTex;sampler2D _BumpMap;sampler2D _BumpDetailMap;float4 _MainTex_ST;fixed _BumpBlending;fixed4 _LightColor0;half3 CustomUnpackScaleNormal(half4 packednormal, half bumpScale){#if defined(UNITY_NO_DXT5nm)half3 normal = packednormal.xyz * 2 - 1;#if (SHADER_TARGET >= 30)// SM2.0: instruction count limitation// SM2.0: normal scaler is not supportednormal.xy *= bumpScale;#endifreturn normal;#elif defined(UNITY_ASTC_NORMALMAP_ENCODING)half3 normal;normal.xy = (packednormal.wy * 2 - 1);normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));normal.xy *= bumpScale;return normal;#else// This do the trickpackednormal.x *= packednormal.w;half3 normal;normal.xy = (packednormal.xy * 2 - 1);#if (SHADER_TARGET >= 30)// SM2.0: instruction count limitation// SM2.0: normal scaler is not supportednormal.xy *= bumpScale;#endifnormal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));return normal;#endif} // end custom unpack scale normalv2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);float4 posWS = mul(unity_ObjectToWorld, v.vertex);half3 normalWS = UnityObjectToWorldNormal(v.normal);half4 tangentWS = half4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);half sign = tangentWS.w * unity_WorldTransformParams.w;half3 binormalWS = cross(normalWS, tangentWS) * sign;o.tangentWS     = tangentWS.xyz;o.normalWS      = normalWS.xyz;o.binormalWS    = binormalWS.xyz;o.posWS.xyz = posWS.xyz;return o;}half3 BlendNormal_Hill12(half3 N1, half3 N2){return normalize(N1 * dot(N1, N2) - N2 * N1.z);}half3 BlendNormal_UDN(half3 N1, half3 N2){return normalize(half3(N1.xy + N2.xy, N1.z));}half3 BlendNormals_Unity_Native(half3 n1, half3 n2){return normalize(half3(n1.xy + n2.xy, n1.z*n2.z));}fixed4 frag (v2f i, fixed isFrontFace : VFACE) : SV_Target{half3 N = normalize(i.normalWS);N = isFrontFace >= 0 ? N : -N;half3 V = normalize(_WorldSpaceCameraPos - i.posWS.xyz);half3 T = normalize(i.tangentWS);half3 B = normalize(i.binormalWS);half3x3 TBN = half3x3(T, B, N);half3 N1_ts = CustomUnpackScaleNormal(tex2D(_BumpMap, i.uv.xy), 1.0);half3 N1 = mul(N1_ts, TBN);// return half4(N1.xyz, 1.0);half3 N2_ts = CustomUnpackScaleNormal(tex2D(_BumpDetailMap, i.uv.xy), 1.0);half3 N2 = mul(N2_ts, TBN);// return half4(N2.xyz, 1.0);// N = BlendNormal_Hill12(N1, N2);// N = BlendNormal_UDN(N1, N2);N = BlendNormals_Unity_Native(N1, N2); // jave.lin : 目前看着是: unity native 的效果是最好的N = lerp(N1, N, _BumpBlending);// return half4(N.xyz, 1.0);half3 L = _WorldSpaceLightPos0.xyz;half3 H = normalize(L + V);half NdotL = saturate(dot(N, L));half NdotH = saturate(dot(N, H));half diffuse = (NdotL);// return diffuse;half specular = pow((NdotH), 32) * 4.0;// return specular;fixed4 baseCol = tex2D(_MainTex, i.uv.xy);// half kd = 1 - specular;// diffuse *= kd;// return diffuse + specular;half3 finalCol = (diffuse + specular) * baseCol.rgb * _LightColor0.rgb + UNITY_LIGHTMODEL_AMBIENT.rgb * baseCol.rgb;return half4(finalCol.xyz, 1.0);}ENDCG}}
}

效果

                half3 N1_ts = CustomUnpackScaleNormal(tex2D(_BumpMap, i.uv.xy), 1.0);half3 N1 = mul(N1_ts, TBN);// return half4(N1.xyz, 1.0);half3 N2_ts = CustomUnpackScaleNormal(tex2D(_BumpDetailMap, i.uv.xy), 1.0);half3 N2 = mul(N2_ts, TBN);// return half4(N2.xyz, 1.0);N = BlendNormal_Hill12(N1, N2);// N = BlendNormal_UDN(N1, N2);// N = BlendNormals_Unity_Native(N1, N2); // jave.lin : 目前看着是: unity native 的效果是最好的N = lerp(N1, N, _BumpBlending);return half4(N.xyz, 1.0);

BlendNormal_Hill12

            half3 BlendNormal_Hill12(half3 N1, half3 N2){return normalize(N1 * dot(N1, N2) - N2 * N1.z);}

在这里插入图片描述


BlendNormal_UDN

            half3 BlendNormal_UDN(half3 N1, half3 N2){return normalize(half3(N1.xy + N2.xy, N1.z));}

在这里插入图片描述


BlendNormals_Unity_Native - 效果目前最好

            half3 BlendNormals_Unity_Native(half3 n1, half3 n2){return normalize(half3(n1.xy + n2.xy, n1.z*n2.z));}

在这里插入图片描述


Project

Testing_NormalMap_Blending_2023.3.37f1_BRP.rar
提取码:ozgt


References

  • PBR filament normal mapping

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/132752.html

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

相关文章

Observability:使用 OpenTelemetry 对 Node.js 应用程序进行自动检测

作者:Bahubali Shetti DevOps 和 SRE 团队正在改变软件开发的流程。 DevOps 工程师专注于高效的软件应用程序和服务交付,而 SRE 团队是确保可靠性、可扩展性和性能的关键。 这些团队必须依赖全栈可观察性解决方案,使他们能够管理和监控系统&a…

Linux进程间通信

文章目录 一、Linux 进程间通信二、Linux 进程间同步 一、Linux 进程间通信 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、…

Activity页面不显示toolbar

页面显示如下,显示toolbar, 想实现不显示toolbar, 1、在manifest里设置 android:theme"style/AppThemeNoTitle",可以隐藏,但是整个页面显示为透明的了,activity整体类型发生改变 2、或者设置这个&#xf…

Win11磁盘分区后在恢复之前分区的方法介绍

电脑磁盘分区对于新购买的电脑来说,是整理电脑第一步要做的事情,大家一般都会根据自己的需要把磁盘划分为C盘、D盘、E盘等等方面文件的管理,今天小编给大家介绍一下Win11操作系统下,如何进行分区,如何恢复之前的分区&a…

yolov5加关键点回归

文章目录 一、数据1)数据准备2)标注文件说明 二、基于yolov5-face 修改自己的yolov5加关键点回归1、dataloader,py2、augmentations.py3、loss.py4、yolo.py 一、数据 1)数据准备 1、手动创建文件夹: yolov5-face-master/data/widerface/tr…

机器学习-概述与贝叶斯算法

机器学习的一般步骤:数据搜集、数据清洗、特征工程、数学建模。数据划分:训练集、验证集、测试集。K折交叉验证:解决数据量不够大问题,解决参数调优问题。深度学习不用做特征工程,传统机器学习要。损失函数&#xff0c…

ROS IMU 数据发布---rviz_imu_plugin的安装

ROS中发布IMU传感器消息 - 润新知 按照上述链接的方法执行 catkin_make install -DCMAKE_INSTALL_PREFIX/opt/ros/noetic 后报错 这个错误是因为在安装过程中,CMake无法将文件复制到目标路径。这可能是由于权限不足导致的。可以尝试使用以下命令更改目标文件夹的…

在线免费AI绘画工具

体验地址 点我进行AI绘画 使用 选择以文搜图进行绘画 提问 介绍 首先,我们来了解一下ChatGPT。作为一个人工智能语言模型,它可以自动回答你的问题、提供信息,并与你进行流畅的对话。它通过大量的训练数据和机器学习算法,学…

IP真人识别方法与代理IP检测技术

随着互联网的发展,IP地址在网络安全和数据分析中扮演着重要的角色。为了维护网络的安全性和识别真实用户,IP地址的真实性和来源成为了一个关键问题。 什么是IP真人识别? IP真人识别是一种技术,旨在确定IP地址背后的用户是否为真实…

GNOME 45 动态三层缓存补丁更新

导读GNOME 45 "Rīga" 上周已正式发布,此版本虽然有许多针对桌面环境的改进,但上游缺少的一个功能是 Canonical 主导的 Mutter 动态三层缓存。 动态三层缓存用于在需要时提升性能,并且已被证明有助于提高桌面渲染性能,…

移动应用-Android开发基础\核心知识点

Android开发基础 知识点 1 介绍了解2 系统体系架构3 四大应用组件4 移动操作系统优缺点5 开发工具6 配置工具7 下载相关资源8JDK下载安装流程9配置好SDK和JDK环境10 第一个Hello word11 AS开发前常用设置12模拟器使用运行13 真机调试14 AndroidUI基础布局15 加载展示XML布局16…

浏览器插件开发爬虫记录

常用爬虫有各种各样的反爬限制,而如果是小数据量并且该网站反爬手段非常厉害的前提下,可以考虑使用浏览器插件作为爬虫手段 基本代码来源于这位博主分享的插件代码, 主要在他的基础上加了 请求代理、管理面板、脚本注入拦截到的请求数据和管…