Unity Shader 切线空间数据是如何计算出来的

告别塑料感!在Unity内置管线里用Standard Shader实现丝绸般光泽(附Anisotropy源码) 本文详细介绍了如何在Unity内置管线中使用Standard Shader实现丝绸般的光泽效果,通过改造各向异性光照模型和优化材质参数,解决了传统PBR材质塑料感过强的问题。文章包含完整的Anisotropy源码和实战步骤,帮助开发者轻松实现艺术级丝绸材质表现。 阅读详情

从建模软件的计算、到Unity的导入,再到最终的Shader构建,切线空间的计算是一套贯穿整个美术-技术流程的完整逻辑。不过这里需要先澄清一个关键点:切线空间的核心数据(切线 Tangent、手性标志 w),是在导入Unity时就已经计算好的,而不是在Shader运行时动态生成的。Shader的任务只是使用这些数据。

下面,我们就按数据从生成到应用的完整生命周期来梳理。

✍️ 第一步:在建模软件中“种下种子”

在3D建模软件里,艺术家们虽然很少手动计算切线,但他们的工作——UV展开,是整个计算过程的基石。

  • 核心原理:切线空间的定义(X轴为切线T,Y轴为副法线B)与模型的 UV 坐标系直接挂钩。切线T的方向被设计为与UV的U方向在模型表面上对齐。

  • 数学推导:给定一个三角形,其三个顶点的位置和UV坐标,存在一个3x3的线性变换,能将UV坐标的增量(ΔU, ΔV)映射到世界空间的位置增量上。解这个方程组,就能得到切线T和副法线B的初始方向。

  • 实际问题:镜像UV的陷阱:为了最大化利用贴图空间,模型会镜像另一半的UV,但这会破坏UV的连续性,导致镜像部分的T/B方向无法与法线贴图正确匹配,产生光影错误。

🤖 第二步:Unity导入时的“智能修复” (MikkTSpace)

为了解决镜像UV导致的切向量方向错乱问题,Unity在模型导入阶段使用业界标准算法——MikkTSpace来完成计算。它的核心目标,就是为每个顶点计算出能保证法线贴图在所有情况下(包括镜像)都正确显示的切线数据。

MikkTSpace 工作流程:

  1. 分析网格与UV:读取模型的顶点位置、法线(Normal)和UV信息。

  2. 计算和平均化:为每个三角形面计算切线T和副法线B,并对共享顶点的面进行平均化处理。

  3. 正交化处理:强制调整切线T,使其与顶点法线N垂直,确保TBN坐标系的精确性和稳定性。

  4. 计算关键信号——tangent.w:通过检查T/B/N向量构成的手性(右手/左手系)计算出 tangent.w。w的值是+1或-1,代表了UV是否发生了镜像。

  5. 存储结果:将最终的正交化切线T(xyz分量)和手性标志w存储在 Vector4 类型的 tangent 变量中。

正如官方文档,此算法已成为业界标准,被广泛用于各大3D建模软件包、法线贴图工具和图形引擎中。

🎮 第三步:在Shader中“激活”数据

当模型进入游戏后,Shader扮演“执行者”的角色。标准写法如下:

// 从模型数据中获取法线(normalOS)和切线(tangentOS)
v2f vert (appdata v) {
    // ... 将法线和切线从模型空间转换到世界空间
    float3 normalWS = TransformObjectToWorldNormal(v.normalOS);
    float4 tangentOS = v.tangent; // Unity提供的切线是float4类型
    float3 tangentWS = TransformObjectToWorldDir(tangentOS.xyz);
    
    // 根据tangent.w构建正确的副法线(Bitangent/Binormal)
    float3 bitangentWS = cross(normalWS, tangentWS) * tangentOS.w;

    // 构建并传递TBN矩阵
    o.tspace0 = half3(tangentWS.x, bitangentWS.x, normalWS.x);
    o.tspace1 = half3(tangentWS.y, bitangentWS.y, normalWS.y);
    o.tspace2 = half3(tangentWS.z, bitangentWS.z, normalWS.z);
    // ...
}

需要注意的是,Unity旧版内置管线和基于UnityCG.cginc的代码,可能使用TANGENT_SPACE_ROTATION宏来构建TBN矩阵,但其核心原理是完全一致的。

🏗️ 重建TBN矩阵与转换法线

在片元着色器中,需要重建TBN矩阵,用法线贴图的数据替换原本的法线。

// 从法线贴图采样并解码,得到切线空间下的法线数据(tangentNormal)
float3 tangentNormal = UnpackNormal(tex2D(_BumpMap, i.uv));

// 构建TBN矩阵,将切线空间法线转换到世界空间
float3x3 TBN = float3x3(i.tspace0, i.tspace1, i.tspace2);
float3 worldNormal = normalize(mul(tangentNormal, TBN));

💡 核心提示:理解 tangent.w

理解 tangent.w 的作用对于正确实现法线贴图至关重要,它能确保在镜像区域的光照方向始终正确。这个流程在Unity中通常是全自动的。但当我们需要手动构建TBN矩阵或在运行时动态调整模型时,对这些细节的理解就变得至关重要了。

Unity ShaderGraph材质球显示异常:7步系统排查指南 在实时渲染与游戏开发中,着色器(Shader)是决定材质视觉表现的核心技术组件,它定义了光线与物体表面交互的数学计算模型。其工作原理是通过顶点着色器和片段着色器处理网格数据与纹理采样,最终输出屏幕像素颜色。掌握着色器调试对于提升渲染效果一致性与开发效率至关重要,尤其在Unity URP/HDRP等现代可编程渲染管线中。当面对材质球显示异常(如紫色错误、透明失真或光照错误)时,开发者常需从渲染管线兼容性、资产状态、网格数据等外部环境入手,逐步深入到ShaderGraph内部节点逻辑进行系统性诊断。本文聚焦于解 阅读详情

相关推荐

3ds Max与Unity3D坐标系转换全解析:解决模型导入错位与动画扭曲

在三维图形学与游戏开发中,坐标系是定义物体在虚拟空间中位置、旋转和缩放的数学基础。不同的三维软件(如3ds Max、Maya)与游戏引擎(如Unity3D、Unreal Engine)常采用不同的坐标系标准,这导致了模型资产在跨平台协作时的核心挑战——坐标数据的不匹配。其技术原理在于变换矩阵的运算规则因坐标系手性(左手/右手)和向上轴(Y-up/Z-up)的差异而发生改变,若未经正确转换,直接导入的模型会出现朝向错误、尺寸缩放异常乃至动画数据彻底失真等问题。这一问题的解决,对于保障游戏资产管线顺畅、提升团队

weixin_30861459的博客 698

Unity3D 法线转换&切线空间

Unity3D 法线转换&切线空间

YF云飞的博客 1万+

Unity中实现丝绸质感:PBR各向异性高光Shader全解析

在计算机图形学中,基于物理的渲染(PBR)技术通过模拟光线与材质表面的物理交互,实现真实感渲染效果。其核心原理基于微表面理论,通过法线分布函数(NDF)、几何遮蔽函数和菲涅尔方程等数学模型,精确计算光线反射与折射行为。这项技术的价值在于能够跨平台、跨光照环境保持材质外观的一致性,极大提升了数字内容的视觉真实感。在游戏开发、影视特效和产品可视化等应用场景中,PBR已成为行业标准工作流。然而,标准PBR模型假设表面微观结构各向同性,难以表现丝绸、拉丝金属等具有方向性光泽的特殊材质。本文聚焦各向异性高光这一技术难

weixin_31896061的博客 356

three.js自定义材质 切线空间及阴影

three.js自定义材质 切线空间及阴影

Zz10566的博客 1145

Unity与PICO空间网格开发指南:从环境理解到物理交互与遮挡渲染

空间网格是混合现实(MR)与增强现实(AR)应用中的核心技术,它通过设备传感器实时重建物理环境的三维几何模型。其原理在于将扫描获取的点云数据转换为三角网格,为虚拟内容提供真实世界的空间参考系。这项技术的核心价值在于实现了虚拟物体与物理环境之间的精准对齐、碰撞检测和视觉遮挡,从而构建出沉浸式的交互体验。在应用场景上,它广泛用于环境理解、物理模拟、空间锚定和虚实融合渲染。本文聚焦于Unity引擎与PICO设备,深入探讨如何获取、处理并应用空间网格数据,涵盖静态与动态网格的选型、物理碰撞体的生成优化以及基于深度提

weixin_33721344的博客 490

mikktspace-Mikkelsen切线空间算法-Rust开发

mikktspace Mikkelsen切线空间算法参考实现的端口。 至少需要Rust 1.31.0。 示例生成了Mikkelsen切线空间算法参考实现的mikktspace端口的演示。 至少需要Rust 1.31.0。 示例生成演示为每边具有4个三角形面的立方体生成切线。 货物运行-示例生成许可证协议,该协议根据Apache许可证2.0版(LICENSE-APACHE或http://www.apache.org/licenses/LICENSE-2.0)许可获得MIT许可证(LICENSE-MIT或http:// opensource .org / licenses / MIT)供您选择。 除非您明确声明其他

Unity切线空间转换

切线空间是一个非常重要的空间。这体现在两个点,首先它的xy方向是UV方向,所以将纹理坐标和空间坐标建立了关联。其次它的z方向是法线,这很方便基于切线空间定义法线贴图。所以它的用途一个是用来处理法线贴图,这非常常用。另外就是可以利用它和贴图UV对应,比如视差贴图可以用来确纹理坐标定偏移。它是Unity坐标系中唯二使用右手坐标系的空间,另外一个是观察空间。这很容易看出来,Unity中纹理坐标是从左下角开始的,往右侧是U方向,往上是V方向,按照右手定则Z轴是正方向。本文主要分析切线空间与其他空间的转换。

paserity的博客 1732

ext-mikktspace:Morten S. Mikkelsen切线空间代码的副本

mikktspace 这是在其硕士论文中编写的切线空间代码的副本。 有关更多信息。

Unity3d Shader篇(八)— 切线空间法线纹理映射

法线纹理映射(Normal Mapping)是一种在计算机图形学中常用的技术,它可以在不增加几何体细节的情况下,为物体表面增加凹凸的视觉效果。法线纹理映射的原理是,通过使用一张法线贴图(Normal Map),来修改物体表面的法线方向,从而影响光照计算,产生高低起伏的光影变化。

脚踏实地,实事求是。 2658

mikktspace-wasm:使用Web AssemblyJavaScriptTypeScriptNode.js的MikkTSpace顶点切线计算

mikktspace-wasm Web程序顶点切线计算。 关于切线法线贴图的一个常见误解是,这种表示某种程度上与资产无关。 但是,从高分辨率表面采样/捕获然后转换为切线空间的法线更像是编码。 因此,为了反转法线的原始捕获场,用于解码的变换必须与用于编码的变换完全相反。 —莫滕·S·米克森 当法线贴图渲染不正确,变形或意外倒置的插入和拉伸时,可能是造成这种误解的原因。 大多数法线贴图贝克使用MikkTSpace标准在创建法线贴图时生成顶点切线,而glTF 2.0规范建议使用该技术。 当未提供原始切线时,在运行时重建切线空间的引擎通常会使用其他方法(例如,像素着色器中的导数)来提高效率。 这对于大多数资产而言效果很好,但对其他资产可能效果不佳。 如果你有... 需要在许多引擎中可预测地呈现的资产 需要生产具有可预测的法线图行为的资产的资产管道 需要完美支持任意资产的引擎(并且可以承受

WiFi信道状态信息 基于Intel 5300的CSI Tool 安装及使用(一)

经过半个月的坎坷安装过程,连Windows系统都没装过的本人终于颤颤巍巍把CSI TOOL装好了,下面记录一下适于我所使用设备的安装过程。设备:一台THINKPAD X201,一台师兄借的华硕主板的台式机首先,如果你和我一样对linux其实一窍不通的话,建议先反复看教程里的安装代码,照猫画虎很难一步实现的,中途一定会有这或那的问题需要解决,所以该了解的基础linux指令还是要了解,起码安装过程中的那些指令可以去查一查。.........

Silver_777的博客 2万+

Unity Standard Shader BasePass源码深度解析:从PBR原理到性能优化

基于物理的渲染(PBR)是现代实时图形渲染的核心技术,它通过模拟光线与材质的物理交互,实现更真实的光照效果。其原理基于能量守恒定律,结合微表面理论,通过金属度、粗糙度等参数精确控制材质的漫反射与镜面反射行为。这项技术的核心价值在于为美术提供了一套标准化、可预测的材质工作流,显著提升了跨项目、跨平台的内容制作效率。在游戏开发、影视动画、数字孪生等应用场景中,PBR已成为高质量实时渲染的基石。Unity引擎内置的Standard Shader正是PBR理论的一次经典工程实践,其BasePass作为渲染流程的核心

anjueci1221的博客 403

人类肠道微生物群落代谢建模

MICOMWeb 是款用户友好型网站,专为人类肠道微生物群落代谢建模设计。该网站旨在解决基因组尺度代谢模型(in silico)构建过程中的3大限制:① 使用 MICOM Python 包进行通量平衡分析时对用户 Python 编程知识的要求;② 支持预定义和用户自定义饮食,以生成专属代谢模型;③ 处理宏基因组鸟枪法测序或 16S 扩增子测序获得的真实丰度数据时,所需的高通量计算基础设施。本文展示了 MICOMWeb 的核心功能,用户可轻松开展虚拟实验,为3个已发表数据集的实验验证生成功能性假设。

多组・学・多组学 1169

Shader 法线纹理

参考 《unity shader 入门精要》 这里说的法线纹理是储存切线空间数据 的法线纹理 根据光照的计算分为切线空间下的实现和世界空间下的实现 切线空间下的实现:指的是光照在切线空间下计算。(性能优先) 世界空间下的实现:指的是光照在世界空间下计算。(通用性优先,Cubemap环境映射需要这种方式实现) 切线空间的构建 x轴:tangent切线方向;y轴:副切线方向(或者副法线);z轴:...

codingriver的博客 504

PLC模拟量输入电路设计:±10V与±20mA信号调理全解析

在工业自动化和数据采集系统中,模拟量输入是连接物理世界与数字控制的核心桥梁。无论是变送器输出的4-20mA电流环,还是伺服驱动与信号发生器提供的±10V电压信号,PLC和采集模块都需要在复杂现场环境下稳定、精准地完成信号采集。理解信号体制的原理——电流环抗长线干扰、电压环响应快——是设计模拟输入前端的基础。通过精密电阻网络实现分压与采样,利用运放完成双极性到单极性的电平搬移,配合TVS与滤波电路保障可靠性,并经过ADC量化与校准流程,最终构建出兼顾精度、成本和工业级鲁棒性的完整信号链路。本文面向硬件工程师与

weixin_29163797的博客 297

智能优化算法-北方苍鹰优化算法(NGO)(附源码)

北方苍鹰优化算法 (Northern Goshawk Optimizer, NGO) 是一种基于群体智能的元启发式优化算法,它模拟了北方苍鹰(Northern Goshawk)的捕食行为、领地行为以及社交互动,用于解决复杂的优化问题。总之,NGO作为一种新颖的优化算法,在处理复杂优化问题方面展现出了潜力。随着进一步的研究和应用,NGO有望成为解决实际问题的有效工具。

w971656545的博客 1361

Unity球谐光照原理与实现:从数学基础到Shader实战

球谐函数是图形学中用于近似球面低频信号的核心数学工具,其原理类似于傅里叶级数在球面上的扩展。通过将复杂的光照信息投影到一组正交基函数上,可以实现高效的数据压缩与重建。这项技术的核心价值在于能以极低的存储和计算成本,实现动态物体与预计算全局光照的自然融合,特别适用于移动端和大量动态对象的实时渲染场景。在Unity引擎中,球谐光照通过光照探头系统实现,为动态角色提供柔和的漫反射环境光。本文深入解析球谐函数的数学原理,并演示如何在Shader中从零实现球谐光照重建,涵盖三阶球谐的基函数计算、系数投影与重建流程,以

weixin_33805992的博客 529

动力学约束下的运动规划算法——Hybrid A*算法(附程序实现及详细解释)

本文主要介绍动力学约束下的运动规划算法中非常经典的Hybrid A*算法,大致分为三部分,第一部分是在传统A * 算法的基础上,对Hybrid A * 算法的原理、流程进行理论介绍。第二部分是详细分析 MotionPlanning运动规划库中Hybrid A * 算法的源码,进一步深入对Hybrid A * 算法的具体细节 进行理解。 第三部分是结合前面第一部分的理论和第二部分的详细源码,对Hybrid A * 算法的流程进行综合的概括总结。

慕羽★的博客 1万+

Maya到Unity模型法线反转问题:诊断与五步标准化解决流程

在3D图形渲染管线中,法线是定义模型表面朝向、决定光照如何反射的关键向量数据。其原理基于顶点或面的方向信息,告知渲染引擎光线入射与反射的计算基准。正确的法线数据对于保障材质与光照系统的物理正确性具有核心价值,直接影响场景的真实感与角色质感。在跨平台工作流中,尤其是在从Maya到Unity的FBX模型导入场景下,坐标系差异(Y-up转Z-up)与数据转换逻辑的微妙不同,极易引发法线方向反转或数据丢失,导致模型出现黑面、破面或光照异常。本文聚焦于这一经典问题,通过剖析平滑组、切线空间等核心概念,提供一套从预处理

weixin_33713503的博客 401

Pytorch实用教程:super(MLP,self).__init__()和super().__init__()有什么区别?

在 Python 中,super()函数用于调用父类(超类)的方法。它的使用在继承关系中非常常见,特别是在初始化继承自父类的属性时。在 PyTorch 中,这通常见于初始化nn.Module类的子类。super()的两种调用方式有微妙的差别,但在 Python 3 中常常用来达到同样的目的。这种写法在 Python 2 中非常常见。这里,super()被调用时需要指定当前类名(MLP)和当前实例(self。

若北辰 1025

Python爬虫实战:逆向解析天猫商品详情API,精准捕获规格、SKU与促销活动

及浏览器开发者工具),绕过前端渲染的复杂性,直接逆向分析并调用其内部数据接口,从而高效、稳定地抓取商品的关键信息,包括商品规格、多维度SKU信息以及复杂的促销活动。print(f"SKU ID: {sku.sku_id}, 价格: ¥{sku.price}, 库存: {sku.stock}, 规格: {sku.props}")当你访问一个商品链接时,浏览器首先会加载一个几乎为空的HTML骨架,然后通过执行大量的JavaScript代码,向后台服务器发起多个异步请求,最终将获取到的数据填充到页面中。

2201_76125261的博客 1129

深入解析URP Lit Shader源码:从PBR原理到自定义着色器实践

PBR(基于物理的渲染)是现代实时渲染的核心技术,它通过模拟光线与物体表面的物理交互,实现更真实的光照效果。其原理基于微表面理论和能量守恒,通过金属度、粗糙度等参数描述材质属性。在Unity的通用渲染管线(URP)中,Lit Shader作为标准的PBR着色器,采用了模块化设计,将表面数据(SurfaceData)与上下文信息(InputData)解耦,通过BRDF函数计算光照贡献。这种设计不仅提升了代码复用率,更为开发者提供了灵活的定制入口。当遇到Shader变体编译报错或光照异常时,深入理解URP Li

weixin_30740581的博客 303

手把手教你学Simulink——基于Simulink的无感FOC(滑模观测器+PLL)实战

本文详细介绍了基于Simulink的无感FOC(滑模观测器+PLL)实现方法。主要内容包括:1)SMO+PLL原理精讲,阐述滑模观测器核心思想和PLL的作用;2)系统架构全景图展示;3)Simulink建模全流程,从基础FOC框架到SMO和PLL模块的实现;4)关键参数整定指南和工程实践要点;5)仿真结果分析及常见问题解决方案。该方法可有效替代机械传感器,降低成本并提高可靠性,适用于空调压缩机、电动汽车水泵等工业场景。文章还提供了详细的调试建议和动手实践指导。

MHD0815的博客 83

Unity笔刷系统全解析:从地形绘制到网格雕刻的架构与优化

在游戏开发与虚拟仿真领域,交互式绘制与编辑是核心功能之一,其背后依赖的是笔刷系统这一关键技术。笔刷系统本质上是一个数据驱动的修改器管道,它将离散的用户输入(如鼠标轨迹)转化为对场景对象(如地形高度图、网格顶点)的连续、区域化修改。其技术价值在于为游戏、创意工具及仿真应用提供了直观、高效的实时编辑能力,直接影响用户体验与创作自由度。在Unity引擎中实现一个高性能、可扩展的笔刷系统,需要深入理解其核心架构,这通常包括输入控制器、笔刷逻辑、目标数据接口、可视化反馈及历史记录等模块。针对不同的应用场景,如地形编辑

weixin_34323858的博客 381

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ShaderGraph视图方向节点:从原理到实战,掌握菲涅尔与反射效果

在计算机图形学中,视图方向(View Direction)是一个基础且核心的概念,它定义了从物体表面指向摄像机的单位向量。其数学本质是通过摄像机位置与表面点坐标的差值归一化计算得出,这一向量是许多光照与渲染效果的基石。从技术价值来看,视图方向是实现物理正确光照模型的关键,它直接参与了反射、折射、边缘光等核心渲染方程的计算。在工程实践中,开发者需要根据不同的坐标空间(如世界空间、切线空间)来选择合适的视图方向表示,以确保与法线、灯光方向等其他向量在相同空间下进行运算,这是避免渲染错误的前提。在应用场景上,视图

weixin_33863087的博客 327

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

给程序员的TA入门课:用Unity Shader理解渲染管线中的“结构体”与数据流转

本文为程序员提供技术美术(TA)入门指南,通过Unity Shader中的结构体与数据流转解析渲染管线。文章将Shader编程类比传统编程中的函数调用与数据结构,详细讲解顶点着色器、片段着色器的数据处理流程,帮助开发者理解从模型导入到屏幕像素的完整渲染过程,并分享高级结构体应用与性能优化技巧。

weixin_34110970的博客 172

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: Unity Shader 法线贴图跟切线空间有什么关系
下一篇: Unity Shader 什么是球谐光照 原理是什么
mxwin
博客等级 码龄19年 22粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值