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.mzph.cn/news/105167.shtml

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

相关文章

iOS 内存管理和优化

对内存管理和拓展有独特的描述 iOS学习-内存管理 比较详细说明内存的关系 iOS 内存管理机制与原理 iOS 内存泄漏排查方法及原因分析 对weak的实现原理描写详细 【iOS】—— weak的基本原理 iOS copy & mutableCopy iOS 深拷贝与浅拷贝 对iOS的浅复制和深复制的深入解释…

算法|每日一题|只出现一次的数字|位运算

136.只出现一次的数字 力扣每日一题:136.只出现一次的数字 之前整理过本题及其扩展,详细说明了思路和做法,链接如下: 只出现一次的数字I,II,III 给你一个 非空 整数数组 nums ,除了某个元素只出…

python爬虫练手项目之获取某地企业名录

因为很多网站都增加了登录验证,所以需要添加一段利用cookies跳过登陆验证码的操作 import pandas as pd import requests from lxml import etree # 通过Chrome浏览器F12来获取cookies,agent,headers cookies {ssxmod_itna2:eqfx0DgQGQ0QGDC…

AQS面试题

更多面试资料请添加wx:suns45 ———Java的AQS——— 1、AQS的理解 AQS是一个锁框架,提供了扩展地方 当多个线程抢锁时,获取不到锁的线程,AQS会自动管理 AQS是同步队列条件队列 AQS分为4个时机,获取锁&#xff0c…

文心一言Plugin实战来了,测试开发旅游攻略助手

刚刚过去的8月,百度WAVE SUMMIT 深度学习开发者大会上,重磅发布文心一言的五个原生插件:百度搜索、览卷文档(基于文档的交互)、E 言易图(数据洞察图表生成)、说图解画(基于图片的交互…

代码随想录算法训练营第二十二天 | LeetCode 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树

代码随想录算法训练营第二十二天 | LeetCode 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树 文章链接:修剪二叉搜索树 将有序数组转换为二叉搜索树 把二叉搜索树转换为累加树 视频链接:修剪二叉搜…

启动Spring Boot项目

介绍启动运行Spring Boot项目打包的jar 1、使用java -jar命令启动项目 java -jar project.jar 执行效果: 使用java -jar 文件名.jar启动项目,项目在前台运行,项目运行的日志将打印在当前控制台上,若退出当前控制台&#xff0c…

函数调用:为什么会发生stack overflow?

在开发软件的过程中我们经常会遇到错误,如果你用 Google 搜过出错信息,那你多少应该都访问过Stack Overflow这个网站。作为全球最大的程序员问答网站,Stack Overflow 的名字来自于一个常见的报错,就是栈溢出(stack ove…

微信小程序生成海报

效果: js1: const cloudHelper = require(../../../helper/cloud_helper.js);async function config1({cover,title,desc,qr,bg = }) {var qr1 ="images/qr.png"var qr2 ="https://636c-cloud1-0gu29f2j63906b7e-1319556650.tcb.qcloud.la/activitycomm/setu…

web入门---tomcat请求响应

Tomcat 介绍 Web 服务器是一个软件程序,对 HTTP协议的操作进行封装,使得不必直接对协议进行操作,让 web 开发更加便捷。主要功能是“提供网上信息浏览服务”。 下载 tomcat 演示说明 这里有一个示例直接双击打开 index.html但是这个“打开…

OK3568 UBUNTU 安装使用I2C-TOOLS

1. 安装 sudo apt-get update sudo apt-get install i2c-tools 使用I2Ctools 参考:https://blog.csdn.net/anyuliuxing/article/details/106382827 i2c-tools 是一组用于在Linux系统中进行I2C(Inter-Integrated Circuit)总线设备操作和调试…

3.7 Android eBpf Hello World调试(一)

写在前面 tracepoint是Linux内核中预定义的静态探测点,分布于内核各个子系统中。每个tracepoint通常包含开关-enable,过滤器-filter等。如下是/sys/kernel/tracing/events/sched子系统中支持的各种tracepoint事件: coral:/sys/kernel/tracing/events/sched $ ls core_ctl_…

RabbitMQ部署指南

大家好我是苏麟今天安装RabbitMQ. 单机部署 我们在Centos7虚拟机中使用Docker来安装。 下载镜像 在线拉取: 最新版本 docker pull rabbitmq 3-managenment版本 docker pull rabbitmq:3-management这两个下载一个就可以 安装MQ docker run -e RABBITMQ_DEFAULT_USERroo…

Cadence 设计实践笔记-小哥allegro 2层板笔记

本章节主要跟着B站PCB入门首选视频-小哥Cadence Allegro 2层板视频,结合自己的实践一步步完成一个完整的PCB板的设计。 视频链接地址: PCB入门首选视频-小哥Cadence Allegro 2层板视频_哔哩哔哩_bilibili 规范建立文件夹 建立八个文件夹 DATASHEET 主要存放设计项目…

第十二章 磁盘管理

1. 磁盘简介 1.1. 概念 硬盘是由一片或多篇带有磁性的铝合金制的盘片构成,是 一种大容量、永久性的外部存储设备 组成:盘片、马达驱动、缓存、控制电路、接口 图: 1.2. 逻辑结构 磁道:由内到外的同心圆 扇区:半径组成…

JVM基础:初识JVM

IDE:IntelliJ IDEA 2022.1.3 x64 操作系统:win10 x64 位 家庭版 文章目录 一、JVM是什么?二、JVM有哪些功能?2.1 解释和运行2.2 内存管理2.3 即时编译 三、有哪些常见的JVM?3.1 常见JVM3.2 Java虚拟机规范3.3 HotSpot的…

力扣每日一题136:只出现一次的数字

题目描述: 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 &#…

C++入门 第一篇(C++关键字, 命名空间,C++输入输出)

目录 1. C关键字 2. 命名空间 2.1 命名空间定义 2.2命名空间的使用 命名空间的使用有三种方式: 1.加命名空间名称及作用域限定符 2.使用using将命名空间中某个成员引入 3.使用using namespace 命名空间名称 引入 3. C输入&输出 4.缺省函数 4.1 缺省参…

记一次Hbase2.1.x历史数据数据迁移方案

查看待迁移的表 list_namespace_tables vaas_dwm2. 制作待迁移表“DWM_TRIP_PART”的快照 snapshot vaas_dwm:DWM_TRIP_PART,dwm_trip_part_snapshot3. 统计待迁移表数据总数 hbase org.apache.hadoop.hbase.mapreduce.RowCounter vaas_dwm:DWM_TRIP_PART

使用postMan调试接口出现 Content type ‘multipart/form-data;charset=UTF-8‘ not supported“

使用postMan调试接口出现 Content type multipart/form-data;charsetUTF-8 not supported" 问题原因解决方案 最近好久没写springboot项目了,然后写了一个添加用户的接口,使用postman测试时出现了问题。如下图: org.springfr…