当前位置:首页 > 技术分析 > 正文内容

法线贴图的原理以及工作方式

ruisui881个月前 (03-25)技术分析9

当开始输出时就意味着需要更多的输入,继续复习总结归纳提炼。还是保持着之前的思路,把程序的语境转化成美术也能够理解的语境去整理。

法线比较难用简单几句话说清楚,从制作法线贴图到在着色器里面如何使用都有了严格的标准。本文会涉及到一部分图形学的内容,但不会深入展开。比如TBN(Tangent Binormal Normal)矩阵。而是用更为通俗易懂的语言去阐述法线贴图的原理以及工作方式,侧重于美术从业者阅读。其中使用了的书籍以及博客等作为参考会在文章末尾列出。


1引言

人之所以能分辨立体与平面是基于光影(明暗关系)。学习美术的同学都知道素描的基础,物体的三大面五大调。物体受光后三大明暗区域:亮面、灰面和暗面。五个调子是指:亮色调、灰色调、明暗交接线、反光、投影。那么电脑绘制的过程也是一样的。那么基于这个理论我们就可以通过在贴图上做一些明暗变化去模拟一种假的立体效果。


在计算机图形学的发展过程中,三维建模软件开始支持高模多边形网格。而游戏引擎中和我们玩的游戏设备不能支持高模,这就是引入法线贴图技术的原因。在这项技术中,我们读取高模的法线基于顶点的纹理坐标,然后将其烘焙到2D法线纹理上。然后把法线贴图用于低多边形网格以模拟照明,在游戏中它看起来像一个高模。所以如果场景中没有灯光,我们的法线贴图就无法正常显示。

2什么是法线

在2D空间中一个曲面可以是平面,对于一个平面来说法线是一条垂直于平面的线或者表示这个曲面的方向。也就是垂直于这个表面的线,代表了平面的方向也就是平面的法线。对于曲面,法线将是一条垂直于曲面切线的直线。所以定义法线是垂直于曲面切线接触点的直线。


那么在3D空间中,如果曲面是平直的,那么法线就垂直于该平面的方向,所以这个垂直于平面的线或垂直方向就变成了法线。曲面是弯曲的,法线将是在某个点上与曲面相切平面垂直方向的直线。那么这和2D曲面上一样会在曲面上选择一个点,然后画个切面代替切线,这个平面刚好接触到曲面上的点,这就是我们的切面。然后一条代表方向的垂直线就变成了法线。

3法线贴图原理

法线贴图是使用深度或表面变形为模型添加凹凸(立体)的效果,但不会让网格产生真实的变形。是一个2D图像纹理,它可以改变光线对网格的影响。

物体表面产生明暗变化的直接原因就是光线照射角度的不同,而法线就是模拟出高面数模型的光照信息。而光照信息最重要的就是光入射方向与入射点的法线夹角。法线就是记录了这个夹角的相关信息。

4法线贴图储存

法线贴图使用RGB通道来储存信息。一个单一的白色像素由RGB三个不同的通道组成,也就是原色相加。每个颜色通道的取值范围在0到1之间(8位颜色的值是0到255)。

但重要的不是法线贴图是什么颜色。而是了解存储在红绿蓝通道中的数据是怎样的。所以重点是法线贴图并不是由颜色组成的贴图,而是由三个黑白数值贴图,通过通道合成的法线贴图。他们的作用在于用黑白的数值来控制光线的反射角度。

法线是一个方向,我们需要三个不同的变量来读取三维空间中的方向,也就是XYZ。比如我们在XYZ三个轴上都移动一个单位。如果我们绘制出新的向量,我们就有了一个三维的向量坐标。当然我们可以有很多不同的值。不同的值对应了向量中不同的点。

法线贴图的RGB通道可以包含X、Y、Z通道的向量数据。红通道控制光线的左右方向X轴,绿通道控制光线的上下方向Y轴。蓝通道模拟模型的深浅Z轴。我们把向量数据值存储在像素的RGB颜色通道上。所以法线贴图表达的是一种方向信息,只存放方向数据。光线可以通过它表面的方向进行计算。

向量

向量(也称矢量)是指具有大小(magnitude)和方向的量。在游戏中3D向量既可以表示一个方向,也可以表示一个点。



5三个空间坐标系

坐标系有很多种,一般在使用法线贴图的时候会有几个选项,最常用的就是切线空间法线和模型空间法线,当然还有一个比较少用到的世界空间法线。这三个又可以被理解为世界空间坐标系,模型空间坐标系和切线空间坐标系。

模型空间法线

模型空间保存的是模型空间坐标系中的高模方向。模型空间是模型的局部3D空间。向上总是向上,向左总是向左。模型可以被旋转和位移,但模型不能有变形。

世界空间法线

世界空间保存的是世界坐标系中的高模法线方向。因此低模取出该点法线就可以直接使用,前提是低模的世界坐标系与高模一致,不能有旋转这样会导致法线方向改变。

切线空间法线

在一个不同的坐标空间中进行光照,法线贴图向量总是指向这个坐标空间的正Z轴方向,所有的光照向量都相对于这个正Z轴方向进行变换,而不管最终变换的方向如何。这样我们就能始终使用同样的法线贴图。

6烘焙法线概念

基本上来说法线烘焙的好与坏最主要需要考虑三个大的方面。

软硬边(平滑组)

从上面的内容可以知道,软件基本上是使用的点法线。比如相邻的两个点共用了一个法线,通过算法就会变成软边的效果。如果法线没有互相共用,单独的点都有单独的法线。这样就会有多根法线,就会变成硬边的效果。

左侧的图像是具有硬边的模型。这将导致一些严重的问题,可以在黄色和蓝色星星上看到。蓝色区域计算两次常规细节,黄色区域根本不计算。右侧的图像是一个具有平滑法线的模型。这将允许在烘焙法线贴图时更接近细节。所以调整低模的软硬边会改变烘焙的结果。

UV

尽可能把UV的排列方式做到横平竖直,尤其是在烘焙分辨率比较低的法线贴图时,可能会有锯齿。一般来说可以倒角解决。但如果能从源头规避掉潜在的问题肯定更好。

同时硬边需要断开分离,我们知道法线贴图表达方向是一种方向信息。两个不同方向的信息相交重叠到了一个点上,就会出现法线贴图有一到缝。如果我们把硬边模型的低模边缘分离的话,通过隔开一定距离(edge padding)就可以解决这个问题。简单来说就是给两个uv shell更多的像素。

Cage

Cage的功能就是把作用于cage上使用的平均法线把高模的信息去映射到低模上使用的正常法线。可以看到如果使用软边烘焙法线方向是会根据模型的大小发生变化,也就意味着烘焙是基于法线方向的,结果也会发生变化。而用作cage的平均法线方向没有发生变化。因为平均法线是根据两个面之间的角度去计算。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3021.html

分享给朋友:

“法线贴图的原理以及工作方式” 的相关文章

Deepin Linux正式引入AI功能,成为第一个正式加入AI潮流的Linux发行版

Deepin Linux是一个基于Debian的Linux发行版,以美观和实用性而闻名。现在为了达到人工智能发展趋势的前沿,Deepin Linux的开发人员宣布,他们已经开始将AI功能集成到桌面环境及其随附的应用程序中。AI集成包含了两种风格——AI驱动的图像编辑插件和AI编码助手。其中图像编辑插...

react hooks自定义组件居然能这样做

前言  这里写一下如何封装可复用组件。首先技术栈 react hooks + props-type + jsx封装纯函数组件。类组件和typeScript在这不做讨论,大家别白跑一趟。接下来会说一下封装可复用组件的思路,比如一个新手应该怎么去封装,都需要有哪些东西。  然后说一些复杂组件需要的功能,...

代码分支规范

一.gitflow工作流说明:主分支:master,稳定版本代码分支,对外可以随时编译发布的分支,不允许直接Push代码,只能请求合并(pull request),且只接受hotfix、release分支的代码合并。gitlab上做限制。热修复分支:hotfix,针对现场紧急问题、bug修复的代码分...

理解virt、res、shr之间的关系(linux系统篇)

前言想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过top命令查看进程占用了多少内存。这里我们可以看到VIRT、RES和SHR三个重要的指标,他们分别代表什么意思呢?这是本文需要跟大家一起探讨的问题。...

壹啦罐罐 Android 手机里的 Xposed 都装了啥

这是少数派推出的系列专题,叫做「我的手机里都装了啥」。这个系列将邀请到不同的玩家,从他们各自的角度介绍手机中最爱的或是日常使用最频繁的 App。文章将以「每周一篇」的频率更新,内容范围会包括 iOS、Android 在内的各种平台和 App。本期继续歪楼,由少数派撰稿作者@壹啦罐罐介绍他正在使用的...

身体越柔软越好?刻苦拉伸可能反而不健康 | 果断练

坐下伸直膝盖,双手用力向前伸,再用力……比昨天前进了一厘米,又进步了! 这么努力地拉伸,每个人都有自己的目标,也许是身体健康、线条柔美、放松肌肉、体测满分,也可能为了随时劈个叉,享受一片惊呼。 不过,身体柔软,可以享受到灵活的福利,也可能付出不稳定的代价,并不是越刻苦拉伸越好。太硬或者太软,都不安全...