zoukankan      html  css  js  c++  java
  • Unity3D教程宝典之Shader篇:第十九讲凹凸贴图

    本讲分为两个部分
    一:原理
    二:实现
     
     
      一:原理
     
    (1)眼睛与光
    让我们来看看一个粗糙的表面。
         



       从远处看,你判断这个物体是粗糙的的唯一证据是在它表面上下的亮度有改变。你的大脑能够获得这些亮暗不一的图案信息,然后判断出它们是表面中有凹凸的部位。左边的一幅图就说明了这一点。你可以发现它是一个浮雕式的表面。一些矩型和字母被印入表面,但是它们摸上去就像是一个隐藏的监控器的玻璃。如果这个图像是在适当的位置上,那么它除了改变亮度,不需要再做任何其他的工作。
     
       那么你也许会问:我是怎么知道哪些点要亮,哪些点要暗呢?这不难。绝大多数人生活在这样一种环境下——这个环境的大多数光源来自上方(译者注:比如白天主要的光来自太阳,夜晚主要的光来自天花板上的日光灯)。所以向上倾的地方就会更亮,而向下倾的地方就会更暗。所以这种现象使你的眼睛看到一个物体上亮暗区域时,可以判断出它的凹凸情况。相对亮的块被判断是面向上的,相对暗的块被判断是面向下的。所以我只需要给物体上的线条简单得上色。
     
       如果你想要更多的证据,这里还有一幅几乎相同的图,不同于前的是它旋转了180度。所以它是前一幅图倒转的图像。那些先前看起来是凹进去的区域,现在看起来是凸出来的了。
      
     
       这个时候你的大脑并没有被完全欺骗,你脑中存留的视觉印象使你仍然有能力判断出这是前一幅图,只是它的光源变了,是从小往上照的你的大脑可能强迫性地判断出它是第一幅图。事实上,你只要始终盯着它,并且努力地想像着光是从右下方向照射的,你就会理解它是凹的(译者注:因为日常生活的习惯,你会很容易把这些图形判断成凸出的图形,但是因为有了上一幅对照图的印象,你可能才会特别注意到这些图块其实还是凹入的,只是判断方法不符合我们日常生活习惯,因为这时大多数光不是从上方照射,而是从下往上照射)。
     
    (2)法线
    之前15讲提到过,法线对光的反射很重要。而一般来说 一个三角形上某点的法线就等于垂直整个三角型的法线。但是我们可以通过灰度图或者从法线贴图取得法线,达到更真实的画面效果。
     
     
      二:实现
     
    (1)与灰度图叠加 
    这种方式也叫fake bump mapping,假凹凸贴图。因为并没有改变物体表面点的位置或者法线。仅仅是把Bump Map叠加在已经渲染好的表面上,造成亮度上的扰动,从而让眼睛以为是凹凸的。计算复杂度是基本加减法。缺点是并不会随着光方向的改变而改变明暗区域。
     
    (2)生成法线
    由于(1)的方法有不能对光进行反应的硬伤。于是有了更逼真的方法:用高度计算法线。
    高度计算法线的方法比较多,这里主要介绍的是CG里广泛采用的一种。
    方法:
    在对灰度图上的点采样的时候,不单取该点的高度Hg,而且取该点之右的点Hr和该点之上的点Ha
    以这三个点作2个向量:第一个向量V1是(1,0,Hr - Hg) 第二个V2是(0,1,Ha - Hg)
    法线为 单位化后的 v1与v2的向量积。
     
    如果把结果储存在一张图上,那么就生成了法线贴图了。Unity3d能替我们做这些,将灰度图转换为法线贴图。就是下面的(3)
     
    (3)Unity里高度图转法线贴图
    具体步骤:
    1)导入heightmap
    2)选中之后将Texture Type改为Normal map
    3)勾选Create from Grayscale
    4)Apply
    之后就看到unity里该图直接变成了呈蓝色的法线贴图。


     
     
    PS: 
    Unity3D里自带的Bump Map Shader,即Bumped Diffuse等Shader是法线贴图的方式。也就是用的是RGB的法线贴图,一般呈蓝色。Unity自带的Shader是没有直接使用灰度图的,而提供能是灰度图转法线贴图的功能。
     
     
    本文部分内容出自
    http://freespace.virgin.net/hugo.elias/graphics/x_polybm.htm
  • 相关阅读:
    众包中使用变分推断和信念传播的几篇文章
    众包中的概率图模型和 EM 算法的使用和总结
    矩阵求导
    CCDM2018会议见闻
    关于 PCA 算法的一点小结
    Nginx--安装
    Nginx--简介
    linux--系统启动过程
    linux--目录结构
    Linux 远程连接工具Xshell6
  • 原文地址:https://www.cnblogs.com/zdlbbg/p/4329478.html
Copyright © 2011-2022 走看看