[base]Mipmapping Normal Maps

http://developer.download.nvidia.com/whitepapers/2006/Mipmapping_Normal_Maps.pdf

来自nvidia的小短文,处理远处normal map不正确的计算导致的specular lighting,反射等闪烁的问题。

核心思想是把远处平均后的normal的长度作为衡量normal变化率的标志,基于此来修正用normal map计算的东东(specular lighting,env reflection...)。

中间各种的数学推导是精华(如果说low level programming is good for programmer‘s soul,那么也可以说math is good for render programmer‘s soul)

normal variation

一般normal map处理的时候,生成mipmap的话,就是linear的一级级downsample,这样在normal变化很大的地方,平均出来的normal的长度就很小。

那么可以根据normal的平均长度来建立normal的方差数学模型:

这里一旦出现normal偏差较大,那么就是用概率中的高斯分布(我们上学时候一般说是正态分布,和大家考评时候出现的中间占大头,两边占小头一样的)来描述。

specular lighting

远处一个点可以看作是一片点的specular lighting的平均值(离散积分):

这里可以看出,结果并不是和normal线性相关的,所以拿平均的normal来算离结果会相差很远,所以会产生较大的偏差(specular lighting又很亮,出来的就是闪烁)。

那么结合前面normal对于方差,正态分布的描述,这里可以对specular lighting计算进行建模,然后在一定范围内使用更简单的数学函数逼近(图形学推导常用方法)

最后specular lighting计算出来这样的:

其中ft,在文中被作者michael toksvig成为toksvig factor:

其中n就是normal,s是specular power。

最后直观描述出来就是,如果normal的长度低,也就是normal的方差大(变化大),那么会呈现远处specular power(gloss)降低的观感。

crytek在14年siggraph论文中谈到,把normal这个分布看作roughness一部分,也很有道理,远处normal很分散,不就是roughness很大么(相对gloss就低么),crytek正是使用这个原理,来根据normal的length来矫正roughness的。

没有做roughness矫正的:

做了矫正的:

其实直接看可能不是特别明显,这种情况如果动起来就闪的很厉害。

这个数学结论也更接近物理实际的情况和直觉观感。

实现:

paper最后是建议使用look up table把结果存起来,毕竟计算还是有点费的。

时间: 2024-10-25 10:14:54

[base]Mipmapping Normal Maps的相关文章

翻译 Tri-Ace:在Shader里近似渲染公式

继上一篇:次世代基于物理渲染的反射模型,本篇是Tri-Ace 在cedec2014上最近发布的, 主要内容如名称所示,解释了他们在实现基于物理渲染时,对shader的渲染公式所做的近似工作. 因为本身就是会议上的PPT,还是必须配合演讲看效果才好,所以如果有错误或不理解的地方,还希望留言或联系我 另外3A在官网上说会提供英文版,那家公司或个人希望可以分享下吧. 大致做下简介,如果有兴趣的可以下载看看 在本篇ppt中,3A先是花了一些篇幅介绍了渲染公式积分所引发的问题,随后是介绍本文中主要运用的正

第九章 Normal Mapping and Displacement Mapping

第九章 Normal Mapping and Displacement Mapping 本章主要讲述两种图形学技术,支持在不增加objects的poly primitive的情况下,在场景中增加更多的细节.第一种是normal mapping,通过创建一些"fake" geometry(虚设的多边形图元)模拟光照作用.第二种是displacement mapping,根据纹理数据moving vertices actually(与"fake"相对应,这里指真实的移动

UMA - Unity Multipurpose Avatar

UMA version 1.0.1.0R Unity 4.3 What is UMA? UMA - Unity Multipurpose Avatar, is an open avatar creation framework, it provides both base code and example content to create avatars. Using the UMA pack, it ?s possible to customize the code and content

游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)

(转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例) 重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering Path Details 正向渲染路径细节 Forward Rendering Path Details 延迟光照渲染路径的细节 Deferred Lighting Rendering Path Details 以unity3d为例,以下将详细讲解三种灯光渲染方式的实现.原理及缺陷. 顶点照明渲染路径

材质 “Glow 效果” 的实现【UE4】

效果如下:(由于对上传图片大小有限制,所以GIF截图质量下降严重) 算法较简单,首先来看 Base color 部分: 就是将对实现准备好的三张纹理进行线性插值,其中 Mask 为遮罩纹理 接着再来看 Emissive Color 部分: 算法也很简单,即随着时间的变化,经过变化的常量颜色和遮罩纹理进行线性插值,然后结果传入 Emissive Color 总览图 最后,附上 UE4 自动生成 HLSL 代码,有兴趣的朋友可以研究一下: // Copyright 1998-2016 Epic Ga

使用Unity3D50个技巧-50 Tips for Working with Unity (Best Practices)

原文: 50 Tips for Working with Unity (Best Practices) About these tips These tips are not all applicable to every project. They are based on my experience with projects with small teams from 3 to 20 people. There's is a price for structure, re-usabilit

前向渲染路径细节 Forward Rendering Path Details

正向渲染路径细节 Forward Rendering Path Details Forward Rendering path renders each object in one or more passes, depending on lights that affect the object. Lights themselves are also treated differently by Forward Rendering, depending on their settings and

Unity Shaders and Effects Cookbook (4-4)在Cubemap 上使用 法线贴图 (法线贴图与反射)

法线贴图 在之前学习过了,我们使用法线贴图在低分辨率的模型上 模拟 高分辨率的效果. Unity中 通过 UnpackNormal 函数 来使用法线贴图. 之前学习法线贴图的记录 Unity Shaders and Effects Cookbook (2-5) 如何使用法线贴图 这一节讲的是 在Cubemap 上使用法线贴图.模拟凹凸效果. 最终效果如图 一起来做吧. 首先搭建好场景,和上一节一样. 导入法线贴图 创建材质 .Shader . 复制上一节的 Shader 就行.然后修改成下面的内

Dynamic device virtualization

A system and method for providing dynamic device virtualization is herein disclosed. According to one embodiment, the computer-implemented method includes providing a hypervisor and one or more guest virtual machines (VMs). Each guest VM is disposed