《Unity Shader入门精要》 第十章 高级纹理 笔记

高级纹理

立方体纹理

  • 环境映射的一种实现方式。
  • 包含六张图像,对应立方体六个面。
  • 纹理采样需要提供一个三维坐标,坐标作为一个矢量从立方体中心出发,采样结果就是矢量与立方体表面交点的信息。
  • 优点:实现简单,得到的效果好。
  • 缺点:引入新的物体、光源,或者物体发生移动时,需要重新生成。
  • 常用与天空盒以及环境映射。

天空盒

  • 模拟天空或室内等背景
  • Unity中,天空盒是在所有不透明物体之后渲染的。

用于环境映射的立方体纹理

  • Unity5中创建用于环境映射的立方体纹理的方法:
  1. 直接由特殊布局的纹理生成
    需要一张具有特殊布局,类似立方体展开的交叉布局、全景布局。把纹理的Texture Type设置为Cubemap即可。
  2. 手动创建一个Cubemap资源,再给它添加6张图
    与天空盒材质创建相同。Unity5后建议使用第一种方式,方便压缩、边缘修正、光滑反射和HDR
  3. 由脚本生成。
    前两种方法需要提供提前准备好的纹理图像。Unity中可以使用Camera.RenderToCubemap函数把从任意位置观察到的图像存储到6张图像中,从而创建出对应位置上的立方体纹理。

反射

  • 因为光线可逆,我们通过视角方向(指向表面)和表面法线可以计算出入射光线的方向,通过这个方向对纹理进行采样就可以得到反射信息。

折射

  • 当光线从一种介质斜射入另一种介质时,传播方向一般会发生改变。
  • 给定入射角时,我们可以使用斯涅尔定律来计算反射角。
  • 光从介质1沿着和表面法线夹角为θ1的方向斜射入介质2时,我们可以使用如下公式计算折射光线与法线的夹角θ2
    η1sinθ12sinθ2
    η1、η2分别为两个介质的折射率(index of refraction)
    《Unity Shader入门精要》 第十章 高级纹理 笔记

菲涅尔反射

  • 根据视角方向控制反射程度。
  • 关于菲涅尔反射,建议看看这个网站:
    万物皆有菲涅尔反射
  • Schilck菲涅尔近似等式:
    Fschilk(v,n)=F0+(1-F0)(1-v·n)5
    其中F0为反射系数,用于控制反射强度,v是视角方向,n是表面法线。
  • Empricial 菲涅尔近似等式:
    FEmpricial(v,n)=max(0,min(1,bias+scale×(1-v·n)power))
    其中bias、scale和power都是控制项。

渲染纹理

  • 之前学习中,一个摄像机的渲染结果会输出到颜色缓冲中。现在GPU允许我们把整个三维场景渲染到一个中间缓冲中,即渲染目标纹理(Render Target Texture,RTT),而不是传统的帧缓冲或后备缓冲。
  • 与之相关的是多冲渲染目标(Multiple Render Target,MRT),允许我们把场景同时渲染到多个目标纹理中。
  • Unity专门定义了一种纹理类型——渲染纹理(Render Texture)
  • Unity中有两种方式使用渲染纹理:
  1. 在Project目录下创建一个渲染纹理,把某个摄像机的渲染目标设置成该渲染纹理,这样摄像机的渲染结果会实时更新到渲染纹理中,而不会显示在屏幕上。
  2. 屏幕后处理时,使用GrabPass命令或OnRenderImage函数来获取当前屏幕图像,Unity会把这个屏幕图像放到一张和屏幕分辨率等同的渲染纹理中,之后我们可以在自定义的Pass中把它们当做普通的纹理来处理,从而实现各种屏幕特效。

玻璃效果

  • Unity shader中我们可以使用一种特殊的Pass来完成获取屏幕图像的目的,这就是GrabPass。
  • 在shader中定义一个GrabPass后,Unity会把当前屏幕的截图保存在一张纹理中,我们可以再之后的Pass中访问它。
  • 使用GrabPass时,需要额外小心物体的渲染队列设置
  • 我们需要把物体的渲染队列设置为透明队列(“Queue” = “Tansparent”)。

程序纹理

  • 指的是由计算机生成的图像。
  • 好处在于可以使用各种参数来控制纹理的外观。