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

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

相关文章:

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

文章目录 目的核心代码PBR - Filament - Normal mappingShader效果BlendNormal_Hill12BlendNormal_UDNBlendNormals_Unity_Native - 效果目前最好 ProjectReferences 目的 备份、拾遗 核心代码 half3 blended_normal normalize(half3(n1.xy n2.xy, n1.z*n2.z));PBR - Filam…...

CSS 常用样式background背景属性

一、背景颜色 background-color CSS中的background-color是用来设置HTML元素的背景颜色的一个属性。它可以接受各种颜色值,包括具有名称的颜色和十六进制颜色值。 以下是一些示例代码: 设置元素的背景颜色为红色: background-color: red…...

Java开发利器,让你事半功倍!

Java是一种广泛使用的编程语言,它具有跨平台、面向对象、安全性高等特点,因此在企业级应用开发中得到了广泛的应用。在Java开发过程中,选择合适的开发工具可以大大提高工作效率,本文将为大家介绍几款Java开发利器,帮助…...

Redis面临的挑战

Redis的数据结构丰富,一般不会在功能性上造成困扰。但随着请求量的增加,SLA要求的提高,我们势必会对Redis进行一些改造和定制性开发。 高可用挑战 Redis提供了主从、哨兵、cluster等三种集群模式,其中cluster模式为目前大多数公…...

10月12日

3个按键中断 key_it.h #ifndef __KEY_IT_H__ #define __KEY_IT_H__ #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_exti.h" #include "stm32mp1xx_gic.h" void key_it_config(); void led_init()…...

Windows 下 Qt 可执行程序添加默认管理员权限启动(QMAKE、MinGW MSVC)

记录 Qt/QMAKE 为可执行程序添加管理员权限 MSVC Windows下 MSVC 套件地位超然,只需要在 .pro 文件中加入: QMAKE_LFLAGS /MANIFESTUAC:\"level\requireAdministrator\ uiAccess\false\\"重新构建 MinGW 与MSVC相比,MinGW所需…...

深度思考面试常考sql题

1 推荐工具 在线运行SQL 2 阿里一面 3 百度一面 sql题 学生表student(id,name) 课程表course(id,name) 学生课程表student_course(sid,cid,score) CREATE TABLE student (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL ); CREATE TABLE course (id INT AU…...

使用springboot服务端远程调试? 试试HTTP实现服务监听

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《初阶数据结构》《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 wi…...

CSS图文悬停翻转效果完整源码附注释

实现效果截图 HTML页面源码 <!DOCTYPE html> <html><head><meta http-equiv="content-type...

MQTT C库下载

方法一、从Eclipse paho下载 https://eclipse.dev/paho/index.php?pagedownloads.php 方法二&#xff0c;从MQTT官网下载 https://mqtt.org/software/ https://os.mbed.com/teams/mqtt/code/MQTTPacket/ MQTTPacket源码和paho下载的差不多 方法三、从Keil5 包管理工具…...

android U广播详解(一)

概念介绍 进程队列 BroadcastQueueModernImpl 的设计围绕着为设备上的每个潜在进程维护一个单独的 BroadcastProcessQueue 实例。表明用于传送到特定进程的Pending {link BroadcastRecord} 条目队列。整个类都标记为 {code NotThreadSafe}&#xff0c;因为调用者有责任始终与…...

input标签的23种type类型

一、概述 随着html5的出现&#xff0c;input标签新增了多种类型&#xff0c;用以接收各种类型的用户输入。其中传统输入控件有10种&#xff0c;新增输入控件有13种。 二、传统类型 传统输入控件有10种&#xff0c;如下所示。 text 定义单行文本输入框 password 定…...

分类预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入分类预测

分类预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输…...

解决echarts配置滚动(dataZoom)后导出图片数据不全问题

先展现一个echarts&#xff0c;并配置dataZoom&#xff0c;每页最多10条数据&#xff0c;超出滚动 <div class"echartsBox" id"echartsBox"></div>onMounted(() > {nextTick(() > {var chartDom document.getElementById(echartsBox);…...

【vue3+ts】项目初始化

1、winr呼出cmd&#xff0c;输入构建命令 //用vite构建 npm init vitelatest//用cli脚手架构建 npm init vurlatest2、设置vscode插件 搜索volar&#xff0c;安装前面两个 如果安装了vue2的插件vetur&#xff0c;要禁用掉&#xff0c;否则插件会冲突...

c++视觉图像----扩充边界

图像扩充边界 #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp>int main() {// 读取图像cv::Mat image cv::imread("1.jpg", cv::IMREAD_COLOR);if (image.empty()) {std::cerr << "Could not open or find the imag…...

邮政编码,格式校验:@ZipCode(自定义注解)

目标 自定义一个用于校验邮政编码格式的注解ZipCode&#xff0c;能够和现有的 Validation 兼容&#xff0c;使用方式和其他校验注解保持一致&#xff08;使用 Valid 注解接口参数&#xff09;。 校验逻辑 有效格式 不能包含空格&#xff1b;应为6位数字&#xff1b; 不校验…...

Appium自动化测试框架:关键字驱动+数据驱动

1. 关键字驱动框架简介 原理及特点 关键字驱动测试是数据驱动测试的一种改进类型&#xff0c;它也被称为表格驱动测试或者基于动作字的测试。主要关键字包括三类&#xff1a;被操作对象&#xff08;Item&#xff09;、操作行为&#xff08;Operation&#xff09;和操作值&…...

简单多状态dp【动态规划】

目录 一、按摩师 二、打家劫舍 三、删除并获得点数 四、粉刷房子 五、买卖股票的最佳时机 六、买卖股票的最佳时机&#xff08;含手续费&#xff09; 七、买卖股票的最佳时机III 八、买卖股票的最佳时机IV 一、按摩师 class Solution { public:int massage(vector<int>…...

OpenCV中initUndistortRectifyMap ()函数与十四讲中去畸变公式的区别探究

文章目录 1.十四讲中的去畸变公式2. OpenCV中的去畸变公式3. 4个参数和8个参数之间的区别4.initUndistortRectifyMap()函数源码 最近在使用OpenCV对鱼眼相机图像去畸变时发现一个问题&#xff0c;基于针孔模型去畸变时所使用的参数和之前十四讲以及视觉SLAM中的畸变系数有一点不…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...