法线贴图Nomal mapping 原理

法线贴图多用在CG动画的渲染以及游戏画面的制作上,将具有高细节的模型通过映射烘焙法线贴图低端模型的法线贴图通道上,使之拥有法线贴图的渲染效果,却可以大大降低渲染时需要的面数和计算内容,从而达到优化动画渲染和游戏渲染的效果。
 
现在好多3d网游都没有法线贴图啊,呵呵,《giant》就没有。

CG:计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。

维基百科:
法线贴图

法线贴图
 什么是法线贴图技术呢?这是一种用来实现3D效果的一种技术,要想理解这种技术还请您听我慢慢道来。

  我们知道,在游戏中经常会有这样的情况,就是一个平面——这个平面在现实中并不是一个“平”面,例如砖墙的表面带有石质浮雕等等。这样的情况如果要求游戏开发人员将复杂的3D细节都做出来是不现实的,因为即使不计较在建模时候的复杂度,过多的3D细节也同样会大量消耗显示芯片的性能,让游戏根本没有可玩性。

 

如何利用贴图实现凹凸效果呢?

  可行的方法就是将这个平面用一个贴图覆盖,用贴图的纹理实现一定的凹凸效果。但是这种方法实现的效果并不是很好,因为如果视角一变化,看起来就会像一张简单的画有图案的平面了。

  后来,聪明的游戏开发者想出了一种方法,就是在贴图过程中对贴图进行一定的处理,从而保证了在视角变换以后仍然保证有较为明显的凹凸效果。

  光与影,法线贴图技术的物理学基础

  我们知道,人之所以能够对景物看出立体感的主要原因是因为人有两只眼睛。两只眼睛看的景象是不同的,所以人们才能分辨出立体感来。但是,由于电脑的屏幕是一个平面,分辨3D效果就只能靠光影效果来实现了。

  举个简单的例子,这就像我们画素描的时候,为了不让一个球体看起来像是一个圆圈,必须让球体的一些区域是亮的,一些区域是暗的。而且从亮部转向暗部的时候是一个均匀的按照物理模型特点的过渡,这样画出来的球体才像个球体,电脑为我们绘制的过程也是一样。

 

因为有明暗,我们才能将平面理解成立体

  基于这个道理,我们就不难理解可以通过贴图局部的亮暗变化来实现假的3D效果。换一种说法就是说我们可以通过在贴图上的局部做一些亮暗的变化来做到一种假的3D效果。

 

光照因角度不同而呈现不同的明暗

  那么如何实时的对贴图进行转换呢?如果要实现虚拟的光影变换,我们最起码需要知道在一个平面上真正的凹凸的情况,这样才能让显示芯片进行运算,生成一种假的凹凸的效果。

  显然,记录真实的凹凸模型是得不偿失的——如果那样的话就没有任何意义了,我们需要用一种非常简单的方法来记录一个贴图的凹凸情况,于是就诞生了一种全新的方法,法线贴图技术。

  接下来,我们再回到我们刚才谈到的法线贴图的话题上。

  法线贴图就是记录了一个需要进行光影变换的贴图上的各个点的凹凸情况的贴图,显示芯片根据这个贴图的内容,来实时的生成新的有过光影变化的贴图,从而实现立体效果。

  那么,究竟是怎样利用法线贴图记录一个平面或者说是一个贴图的凹凸情况呢?我们知道,物体表面产生明暗变化的直接原因,就是光线照射角度的不同,光线垂直于平面的地方就亮,光线斜射到平面的地方就暗,光线照不到的地方就更暗(应该是黑色,但是由于环境光照所以不会有阴影是真正的黑色)。

  借色彩之值存法线之向,巧妙的存储

  学过初中物理的朋友一定还都记得,表示光线射向平面的角度时通常使用光线和该点法线角度来表示。这也就意味着,如果我们将一个贴图上所有点的法线记录起来的话,就不难再利用这些信息实现后期的假的凹凸效果了。

  记录这些法线的载体就被我们称为法线贴图。为什么称之为贴图呢?我们知道,一条法线是一个三维向量,一个三维向量由X、Y、Z等3个分量组成,于是人们想出了一个聪明的方法,就是以这3个分量当作红绿蓝3个颜色的值存储,这样的话就生成一张新的贴图了,这就是法线贴图的来历。

 

法线贴图其实并不是真正的贴图,所以也不会直接贴到物体的表面,它所起的作用就是记录每个点上的法线的方向。所以这个贴图如果看起来也会比较诡异,经常呈现一种偏蓝紫色的样子。(polygons:多边形)

『小提示-05:事实上,真正的法线贴图并不是记录贴图上每个点的法线的绝对角度,而是记录的是相对于平面的一个差值。这样的话,随着平面的3D变换都能够实现即时的法线运算了。』

  传统纹理压缩,法线贴图不再适用

  采用法线贴图技术的优势就是利用很少的资源实现了效果非常好的凹凸效果,而且可以利用我们在开篇的时候提到的纹理压缩技术对法线贴图进行压缩,进一步节省资源。

 

3D max里面是如何制作发现贴图的呢?看下面,图看不见的话点链接。

制作法线贴图

  接下来我们在3ds Max里面制作Normal Map (法线贴图),将低模和高模分别命名为:low-model和high-model,然后将导出的低模UV 分好,高模不用分UV。

法线贴图的优缺点:

优点:

法线贴图的好处有很多,不仅仅能表现出哪里凹,哪里凸,还能表现出很多不同斜率的曲面的情况。所以法线贴图技术能够带来更好的效果。

法线贴图比起凹凸贴图而言,能够实现的效果更加好了,相对的就是运算量更大了,每个象素的光照情况都需要计算这个点的法线向量和光照情况的夹角计算该点的亮度和颜色。

缺点:

    当然,法线贴图技术同样不是完美的,它也有着自己的不足,凹凸贴图没有能够解决的切向效果问题肯定是仍然不能够得到解决。

    此外,就是法线贴图技术不能够解决解决更大的凹凸情况的效果。大家如果去观察的话,法线贴图效果能实现的通常是一些内凹或者外凸不是很严重的表面效果。

原文未知,我是从这里看到的:http://www.cnblogs.com/lancidie/archive/2010/11/02/1866914.html

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

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

相关文章

Html.Action、html.ActionLink与Url.Action的区别

1.html.ActionLink返回的指向指定controller、指定action的超链接标签<a>标签.如果没有指定controller&#xff0c;则默认为本页面对应的Controller. 如Html.ActionLink(“链接文本”、“someaction”、“somecontroller”,new { id " 123 " },null)生成:<…

ss

http://blog.csdn.net/lvanneo/article/details/16885121 http://www.360doc.com/content/11/0506/22/6110614_114908124.shtml转载于:https://www.cnblogs.com/mliudong/p/3851502.html

gdi+ 双缓冲

内存bmp方式 1. 初始化 Gdiplus::Bitmap* pBitmap new Gdiplus::Bitmap(w,h); Gdiplus::Graphics* pGraphics Gdiplus::Graphics::FromImage(pBitmap); pGraphics->SetSmoothingMode(Gdiplus::SmoothingModeHighQuality); pGraphics->SetInterpolationMode(Gdiplus::In…

Javascript引擎单线程机制及setTimeout执行原理说明

setTimeout用法在实际项目中还是会时常遇到。比如浏览器会聪明的等到一个函数堆栈结束后才改变DOM&#xff0c;如果再这个函数堆栈中把页面背景先从白色设为红色&#xff0c;再设回白色&#xff0c;那么浏览器会认为DOM没有发生任何改变而忽略这两句话&#xff0c;因此我们可以…

java实现c语言的函数_C语言实现返回字符串函数的四种方法

前言C语言返回字符串函数共有四种方式&#xff0c;分别如下&#xff1a;使用堆空间&#xff0c;返回申请的堆地址&#xff0c;注意释放函数参数传递指针&#xff0c;返回该指针返回函数内定义的静态变量(共享)返回全局变量下面来看看详细的介绍其实就是要返回一个有效的指针&am…

解决VS命令提示符 “Setting environment for using Microsoft Visual Studio. 此时不应有“系列错误

一、起因 最近在玩Boost库。当然首先是要进行Boost库的安装和配置。于是浅墨Google了一下boost库的安装配置攻略&#xff0c;下载了最新版1.55的boost库&#xff0c;就愉悦地开始进行配置了。 当进行到第五步&#xff0c;要在VS命令提示符中运行bootstrap.bat的时候&#xff0c…

yii2多语言设置

yii2的多语言切换功能 1.页面添加语言切换按钮&#xff0c;如下图&#xff1a; 代码如下&#xff1a; <ul> <li> <a href"javascript:;" οnclick"changeLanguage(en_US);"> <span><?php echo …

php 字符串 大括号,PHP中的字符串大括号

复杂(卷曲)语法这并不是因为语法复杂&#xff0c;而是因为它允许使用复杂表达式。任何具有字符串表示的标量变量、数组元素或对象属性都可以通过此语法包括在内。只需将表达式以与字符串外显示的方式相同的方式写入&#xff0c;然后将其包装在{和}..自{无法转义&#xff0c;只有…

bat

1. 打印变量 set a 123echo %a%2. if errorlevel 测试前一程序的返回状态。如果该程序的返回状态大与或等于所说明的值就执行所说明的DOS命令 if errorlevel 命令让批处理文件测试一程序的返回状态值&#xff0c;然后根据测试结果作相应的进一步处理&#xff0c;当MS-DOS遇到…

APP安全环节缺失,手游运营商怎样应对APP破解困境

2013年手游行业的规模与收入均实现了大幅增长&#xff0c;发展势头强劲。然而&#xff0c;在手游快速发展的同一时候&#xff0c;因为监管、审核等方面存在着漏洞&#xff0c;手机游戏软件被破解后注入恶意代码、盗取用户財产、窃取用户设备信息的现象屡见不鲜。手游被破解后黑…

UE4版本和vs版本的对应关系

查找UEBuildWindows.cs文件&#xff0c;里面记录了此版本的UE4可以用哪个版本的VS编译 比如 4.19.1版本 public enum WindowsCompiler {/// <summary>/// Use the default compiler. A specific value will always be used outside of configuration classes./// </su…

linux php cpu,获取Linux服务器性能CPU、内存、硬盘等使用率 PHP

数据库配置文件&#xff1a; conn.phpdefine("MONITORED_IP", "172.16.0.191"); //被监控的服务器IP地址 也就是本机地址define("DB_SERVER", "172.16.7.2"); //存放数据的服务器IP地址define("DB_USER", "roo…

Codeforces 229D

一 题意描述&#xff1a; 有n(1<n<5,000)座塔排在一条直线上&#xff0c;从左到右每个塔的高度分别为hi(1<hi<100,000)&#xff0c;每次操作你可以选择一座塔&#xff08;假设是第i座&#xff09;&#xff0c;用吊车把它吊起来&#xff0c;然后放到与它相邻的一座塔…

GenerateProjectFiles.bat分析

1. 实际是调用了Engine\Build\BatchFiles\GenerateProjectFiles.bat 2. 然后调用Engine\Build\BatchFiles\GetMSBuildPath.bat 3. 依次查找2017,2015,2013 vs的MSBuild.exe&#xff0c;首先找到哪个版本的MSBuild.exe就直接成功退出 4. 调用MSBuild.exe生成UnrealBuildTool MSB…

php设计模式的作用是什么意思,php设计模式工厂模式有什么作用?

我们给大家介绍了php工厂模式的好处&#xff0c;工厂模式的含义&#xff0c;以及工厂模式的三种情况&#xff0c;那么我们今天继续给大家介绍php工厂模式的作用是什么&#xff01;工厂模式分为三种&#xff1a;简单工厂、工厂方法、抽象工厂 ,三种工厂的区别是&#xff0c;抽象…

matlab sort descend,详解Matlab中 sort 函数用法

搜索热词(1)Bsort(A) 对一维或二维数组进行升序排序,并返回排序后的数组,当A为二维时,对数组每一列进行排序.eg: A[1,5,3],则sort(A)[1,3,5]A[1,3;2,4,1],1;2,3](2)Bsort(A,dim),对数组按指定方向进行升序排序,dim 1,表示对每一列进行排序,dim2表示对每一行进行排序.(3)Bsort(A…

【HDU1325】Is It A Tree?(并查集基础题)

有以下坑点&#xff1a; 1.结束输入不一定-1&#xff0c;题目中的叙述只是说所有权值都为正值。 2.是否构成一棵树不能只判断是否只有一个根节点&#xff0c;没有环路&#xff0c;而且还需要判断每个节点的入度一定是1&#xff0c;不然就不是一棵树。 &#xff08;无环路也可用…

mysql 逗号金额比较,如何使用MySQL比较两个逗号分隔的字符串列表

我使用了一个名为“ containsAll()”的Java方法来检查ArrayLists是否具有共同的内容.假设我在MySQL表中有一个列表A(一行)和其他几个列表(在“名称”列中,逐行).所有列表均由逗号分隔的字符串(列表中至少一个字符串)组成-名称或其他名称.现在,我想检查列表A中的所有字符串是否都…

MFC序列化(serial)简单例子

我们保存一些文本内容可以很简单的保存成一个文件就行了.但如果要把一些类对象信息保存起来,然后读取时用那些信息初始化一个类对象就比较复杂了.MFC提供了一个叫序列化的功能.可以把一个对象信息转化成二进制文件(或者xml文件)保存起来.下面举一个简单的例子,假如有类CArwen,实…