Unity 高级纹理

立方体纹理

在图形学中,立方体纹理是环境映射的一种实现方法。环境映射可以模拟物体周围的环境,而使用了环境映射的物体可以看起来像镀了一层金属一样反射出周围的环境。

和之前的纹理不同,立方体纹理一共包含6张图像,这些图像对应了一个立方体的6个面,立方体纹理的名称也由此而来。立方体的每个面表示沿着世界空间下的轴向(上下左右前后)观察所得的图像。对于立方体纹理采样我们需要提供一个三维的纹理坐标,这个三维纹理坐标表示我们世界空间下的一个3D方向。这个方向矢量从立方体的中心出发,当它向外部延伸时就会和立方体的6个纹理之一发生相交,而采样得到的结果就是由该相交点计算而来的。

使用立方体纹理的好处在于,他的实现简单快速,而且得到的效果也比价好。但是他有一些缺点,例如当场景中引入了新的物体,光源。或者物体发生位移时,我们就需要重新生成立方体的纹理。除此之外,立方体纹理也可以反射环境,但不能反射使用了该立方体纹理的物体本身。

立方体纹理咋实时渲染中有很多应用,最常见的就是用于天空盒以及环境映射。

天空盒子

天空盒是用戏中用于模拟北京的一种方法。天空盒这个名字有两个信息:他是用于来模拟天空的,他是一个盒子。当我们在场景中使用天空盒时,整个场景就会包围在一个立方体内。这个立方体的每一个面使用的技术就是立方体纹理映射技术。

Unity要想使用天空盒非常简单。我们只需要创建一个Skybox材质,在把他赋给该场景相关设置即可。

创建用于环境反射的立方体纹理

除了天空盒子,立方体纹理最常见的用于环境映射。这种方法,我们可以模拟出金属质感的材质。

创建用于环境映射的立方体纹理的方法有三种:第一种方法就是直接由一些特殊布局的纹理创建;第二种方法就是手动创建一个Cubemap资源,再把6张图赋予给它;第三种方法就是由脚本生成。

如果使用第一种方法,我们需要提供一张具有特殊布局的纹理,然后我们只需要把该纹理的Texture Type设置成Cubemap即可,unity自动处理好接下来的事情。

第二种方法就是,我们首先需要在项目资源中创建一个Cubemap,然后把6张纹理拖拽到他的面板中。

前面两种方法都需要我们提供准备好的立方体纹理的图像,他们得到的立方体纹理往往是被场景中色物体所公用的的。但在理想情况下,我梦希望根据物体在场景中位置的不同,生成他们各自不同的立方体纹理,这时,我们就可以在unity中使用脚本来创建。通过利用Unity提供的Camera.renderToCubemap函数来实现。

扫描二维码关注公众号,回复: 13715662 查看本文章

反射

使用了反射的物体看起来像是镀了一层金属。想要模仿反射的效果很简单,我们只需要通过入射光线的方向和表面反向来计算反射方向,再利用反射方向对立方体纹理采样即可。

折射

折射的物理原理比反射复杂一些,我们在初中物理就已经接触过折射的定义;当光线从一种介质斜射入另一种介质时,传播方向一般会发生变化。当给定射入角时,我们可以使用斯涅尔定律来计算反射角。当光从介质1沿着和表面法线夹角为θ1的方向斜射入介质2时,我们可以使用如下公式计算折射光线与法线的夹角θ2

 

n1,n2分别是两个介质的折射率。折射率是一项重要的物理常数,例如真空的折射率为1,而玻璃的折射率一般为1.5。

通常来说,当得到折射方向后我们就会直接使用它对立方体纹理进行采样,但这是不符合物理规律的。对于个透明物体来说,一种更精准的模拟方法需要计算两次折射,一次是当光线进入到它的内部时,另一次则是从她内部射出时。但是想要实时渲染中模拟出第二次折射反向是比较复杂的,而且仅仅模拟一次得到的效果从视觉上看起来“也挺想”。

 

菲涅耳反射

在实时渲染中,我们通常会使用菲聂耳反射来根据视角方向控制反射程度。通俗来讲,菲聂耳反射描述了一种光学现象,即当光线照射到物体表面上时,一部分发生反射,一部分进入物体内部,发生折射或散射。被反射的光和入射的光之间存在一定的比率关系。这个比率关系可以通过菲聂耳等式进行计算。一个经常使用的例子是,当你站在湖边,直接抬头看脚边的水面时,你会发现水几乎是透明的,你可以直接看到水底的小鱼和石子;但是当你抬头看远处的水面时,会发现几乎看不到水下的场景,而只能看到水面反射的环境。这就是所谓的菲聂耳效果,这是基于物理的渲染中非常重要的一项高光反射计算因子。

真实世界的菲聂耳等式是非常复杂的,但是在实时渲染中,我们通常会使用一些近似等式来计算。其中一个著名的近似等式就是Schlick菲聂耳近似等式:

 

其中f0是一个反射系数,用于控制菲聂耳反射的强度,v是视角方向,n是表面法线。另一个应用比较广泛的等式是Empricial菲聂耳近似等式。

 

使用上面的菲聂耳近似等式,我们可以在边界处模拟反射光强和折射光照。漫反射光强之间的变化。在很多车漆,水面等材质渲染中,我们经常会使用菲聂耳反射来模拟更加真实的反射效果。

渲染纹理

一个摄像机的渲染结果会输出到颜色缓冲中,并显示到我们的屏幕上。现代的GPU允许我们把整个三维场景渲染到一个中间缓冲中,即渲染目标纹理,而不是传统的帧缓冲或后备缓冲。与之相关的是多重渲染目标,这种技术指的是GPU允许我们吧场景同时渲染到多个渲染目标纹理中,而不再需要为每个渲染目标纹理单独渲染完整的场景。延迟渲染就是使用多重渲染目标的一个应用。

Unity为渲染目标定义了一种专门的纹理类型——渲染纹理。在Unity中使用渲染纹理通常有两种方式:一种方式是在Project目录下创建一个渲染纹理,然后把某个摄像机的渲染目标设置成该渲染纹理,这样一来该摄像机的渲染结果就会实时更新到渲染纹理中,而不会显示在屏幕上。使用这种方法,我们还可以选择渲染纹理的分辨率,滤波模式等纹理属性。另一种方式是在屏幕后处理时使用GrabPass命令或OnRenderImage函数来获取当前屏幕图像,Unity会吧这个屏幕图像放到一张和屏幕分辨率等同的渲染纹理中,下面我们可以在自定义的Pass中把他们当成普通纹理来处理,从而实现各种屏幕特效。我们将依次学习这两种方法在Unity中实现。

程序纹理

程序纹理指的是那些由计算机生成的图像,我们通常使用一些特定的算法来创建个性化图案或者非常真实的自然元素,使用程序纹理的好处在于我么你可以使用各种参数来控制纹理的外观,而这些属性不仅仅是那些颜色属性,甚至可以是完全不同类型的图案属性,这使得我们可以得到更加丰富的动画和视觉效果。

猜你喜欢

转载自blog.csdn.net/f402455894/article/details/123269472