unity未将对象引用设置到对象的实例_Unity可编程渲染管线系列(七)反射(镜面和环境)...

本文是Unity可编程渲染管线教程的第七部分,主要讲解如何添加镜面高光、反射环境、非同一缩放支持以及与反射探针的配合。教程通过实例详细解释了镜面高光的实现,包括平滑度、表面数据、漫反射光、镜面选项和镜面高光计算。同时,介绍了如何采样环境立方体贴图以模拟环境反射,并调制反射和菲涅耳效应。此外,文章还讨论了非同一缩放物体的着色问题。最后,文章介绍了如何处理透明表面,通过预乘Alpha实现半透明效果。
摘要由CSDN通过智能技术生成

目录

1 高亮的高光

1.1 光滑度

1.2 表面数据

1.3 漫反射光

1.4 镜面选项

1.5 镜面高光

1.6 逐物体平滑度

2 反射环境

2.1 采样环境

2.2 调制反射

2.3 菲涅尔

2.4 金属表面

3 非同一的缩放值

3.1 移除假设条件

4 反射探针

4.1 盒投影

4.2 探针混合

4.3 HDR解码

5 透明表面

5.1 预乘Alpha

5.2 预设

本文重点:

1、添加镜面高光

2、反射环境

3、支持非同一的缩放

4、和反射探针一起工作

5、结合反射和透明度

这是涵盖Unity的可脚本化渲染管道的教程系列的第七部分。它涵盖了反射,镜面高光和采样反射探针的添加。

本教程是CatLikeCoding系列的一部分,原文地址见文章底部。“原创”标识意为原创翻译而非原创教程。

本教程使用Unity 2018.3.0f2制作。

9c1258768320693ae399b734c4c1e147.png

(倒影生动起来)

1 高亮的高光

到目前为止,我们仅使用了简单的漫射照明,没有任何照明。我们现在将改变它,增加对镜面照明的支持。我们将使用与Unity的Lightweight渲染管道中使用的模型相同的模型。“渲染4,拳头照明”教程介绍了镜面照明的原理,但使用了不同的模型。

1.1 光滑度

完美的漫反射表面(即完美的漫射器)根本没有镜面反射。表面是如此粗糙,以至于没有聚焦反射发生。表面越光滑,反射的光线就越多,而不是扩散。我们将通过从0到1的平滑度材料属性(默认值为?)进行控制。

6b182b527fac5d35a28943d51246c5c9.png

30b0865654f7c76e71393fadf3c6ada8.png

(光滑度 滑动条)

添加相应的着色器变量。

08873644390ac71392c98cfd7bff6a45.png

1.2 表面数据

囊括镜面反射会使我们的照明模型更加复杂。让我们将其所有代码放在一个单独的文件Lighting.hlsl中。在里面定义一个LitSurface结构,该结构包含执行照明计算所需的所有表面数据。那就是表面的法线,位置,漫反射和镜面反射的颜色及其粗糙度。还会包含视图方向,它实际上不是表面的属性,但是相对于我们正在使用的表面点而言是恒定的。

d5f6cff872a6a6437f34f6fb200627b8.png

添加一个GetLitSurface函数,该函数返回Lit的表面数据。在此HLSL文件中,我们将不依赖于着色器特定的属性,纹理或定义,因此必须将所有相关数据定义为参数。尽管我们把平滑度作为输入,但是在内部,我们使用粗糙度,只是反过来而已。此外,我们现在使用金属工作流程并将自己局限于电介质材质。介电材质是非金属的,仅反射少量的光,相当于平均0.04的灰度镜面反射。就像Unity的光照代码一样,我们将对其进行硬编码。

22a8089e20faf8b21b2d3251afd78735.png

根据迪斯尼模型(Disney model),此时我们拥有的粗糙度实际上是一个称为感知粗糙度的值。物理粗糙度是其平方。我们都需要。

d8758e1c91ee71a6911afc925b1f297e.png

在Lit.hlsl中包含Lighting.hlsl。

9d15e08234f4c250fae7d8c4d0139a47.png

现在,在执行任何光照计算之前,我们可以在LitPassFragment中获取表面。视线方向就是相机位置减去片段位置(归一化)。

00f160028144d7a8785e48f48ad06658.png

1.3 漫反射光

我们将把照明计算移到Lighting.hlsl。为此,为其提供一个LightSurface函数,以表面和光的方向为参数。它执行漫反射点乘积,并将其乘以表面的漫反射色。我们假设这里是理想的光线,纯白色而没有衰减。

a65c20dc8c26c1416b510498d375a294.png

调整MainLight,使其仅将表面作为参数,而不是位置和法向矢量。让它调用LightSurface而不是执行点乘积本身。和以前一样,在此处应用衰减和光色。

a92499a5a5b409bc48b43db057aa9362.png

以相同的方式调整DiffuseLight,将其重命名为GenericLight,从现在开始可以更好地描述其目的。

47613ac4fbbc0388e641b4e0773b5a0a.png

现在,LitPassFragment必须将表面作为参数传递。而且,漫反射现在也沿途(而不是在末尾)计入颜色。在开始时,我们仍然必须将其纳入顶点照明。

a32aea706f58a28dfa11f6e03e59fa55.png

我们还必须对顶点灯光使用GenericLight。顶点照明是纯漫反射的,因此仅需要位置和法线。颜色为白色,其他值无关紧要。让我们为Lighting.hlsl添加一个方便的包装函数。

e9f2621235cf02f734d8176157f7ae56.png

然后在LitPassVertex中使用它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值