unity路径渲染的路径颜色怎么设置

unity路径渲染的路径颜色怎么设置,第1张

持不同的渲染路径。您应具体取决于你的游戏内容和目标平台/硬件来选择使用哪一个。不同的渲染路径有不同的特点和性能特点,主要影响灯光和阴影

如果图形卡不能处理选定的渲染路径,Unity将自动使用一个较低保真度的设置。因此,在GPU上不能处理延迟照明(Deferred Lighting),将使用正向渲染(Forward Rendering )。如果不支持正向渲染(Forward Rendering ),将使用顶点光照(Vertex Lit)。

时间: 2020-7到12月

修改:20201213

PBR系列笔记共三篇,本篇为第三篇:基于 Unity URP BRDF 算法分析

目录

简要:本笔记略过大量的基础信息。只有在效果开发中,出现频率较高处测试下。

环境:U3D 20194 URP 731 管线下的标准 Litshader 分析

公式说明:Fragment DirectBDRF 函数内包含对迪斯尼BRDF的精简拟合公式(笔记下文有详细注释)

顶点着色器 LitPassVertex

日常效果开发中:法线的处理,和SH的调用,对美术效果影响比较大。这两块功能的处理也是极易出现错误的地方。处理好了这两块,对美术效果会有质的提升。祥见第6点和第8点。

1、GetVertexPositionInputs

2、GetVertexNormalInputs

3、GetCameraPositionWS

4、VertexLighting

5、ComputeFogFactor

6、NormalizeNormalPerVertex 法线归一化

重要的法线归一化:为了获得更好的质量,法线应该在之前和之后标准化插值。

但是,我们将在此处尝试平衡性能与质量,同时让用户将其配置为着色器质量等级。

7、OUTPUT_LIGHTMAP_UV

8、OUTPUT_SH

顶点SH颜色,会经常用于角色和场景中。使用宏来判断是使用普通Sample版还是线性版。祥细测试见本笔记下文。

9、GetShadowCoord

片元着色器 LitPassFragment

结构体SurfaceData

1、InitializeStandardLitSurfaceData 贴图信息打包

11、SampleAlbedoAlpha

12、Alpha

13、SampleMetallicSpecGloss

14、对法线的处理

一般来说法线贴图,最终调取的还是UnpackNormalAG函数

15、SampleOcclusion

16、SampleEmission

结构体InputData

2、InitializeInputData 初始化PBR输入数据,处理顶点传递过来的数据信息

21-24

25、SAMPLE_GI 简单的全局光照计算

251、SampleLightmap

252、SampleSHPixel

第一排:顶点里面最简单的SH,第二排:顶点里面的线性SH(这里需要跟片元里面的SH计算做混合),第三排:片元里面的像素SH;第四排:像素里的线性SH计算,并且跟顶点里面的线性SH结果混合(测试结果跟顶点SH效果相差不大)。从测试结果来看,单纯的像素SH效果是最好的。SH灵活运用,用途广泛。

3、UniversalFragmentPBR BRDF-PBR计算

当函数拟合能熟练使用时,并不需要再做这些图例测试,可以直接给拟合曲线图例说明了。

结构体BRDFData

31、InitializeBRDFData

结构体Light

32、GetMainLight

33、MixRealtimeAndBakedGI

34、GlobalIllumination

GlossyEnvironmentReflection

EnvironmentBRDF

35、LightingPhysicallyBased

DirectBDRF 内含公式拟合说明

深度纹理实际就是一张渲染纹理,只不过它里面存储的像素值不是颜色值,而是一个高精度的深度值。由于被存储在一张纹理中,深度纹理里的深度值范围是[0, l], 而且通常是非线性分布的。这些深度值来自于顶点变换后得到的归一化的设备坐标 (Normalized Device Coordinates , 简称NDC) 。一个模型要想最终被绘制在屏幕上,需要把它的顶点从模型空间变换到齐次裁剪坐标系下,这是通过在顶点着色器中乘以 MVP 变换矩阵得到的 。在变换的最后一步,我们需要使用一个投影矩阵来变换顶点,当我们使用的是透视投影类型的摄像机时,这个投影矩阵就是非线性的。

下图 显示了Unity 中透视投影对顶点的变换过程。最左侧的图显示了投影变换前,即观察空间下视锥体的结构及相应的顶点位置,中间的图显示了应用透视裁剪矩阵后的变换结果,即顶点着色器阶段输出的顶点变换结果 ,最右侧的图则是底层硬件进行了透视除法后得到的归一化的设备坐标(NDC)。需要注意的是,这里的投影过程是建立在Unity对坐标系的假定上的,也就是说,针对的是观察空间为右手坐标系,使用列矩阵在矩阵右侧进行相乘,且变换到NDC后 z分量范围将在[-1, l] 之间的情况。而在类似 DirectX 这样的图形接口中,变换后z分量范围将在[0, 1]之间 。如果是在其他图形接口下,需要对一些计算参数做出相应变化。

下图 显示了在使用正交摄像机时投影变换的过程。同样,变换后会得到一个范围为 [-1, 1]的立方体。正交投影使用的变换矩阵是线性的。

在得到NDC后,深度纹理中的像素值就可以很方便地计算得到了,这些深度值就对应了NDC中顶点坐标的z分量的值。由于NDC中 z分量的范围在[-1, I], 为了让这些值能够存储在一张图像中,需要使用下面的公式对其进行映射:

其中,d对应了深度纹理中的像素值, 对应了NDC坐标中的z分量的值。

在Unity中,深度纹理可以直接来自于真正的深度缓存,也可以是由一个单独的 Pass 渲染而得,这取决于使用的渲染路径和硬件。通常来讲,当使用延迟渲染路径(包括遗留的延迟渲染路径)时,深度纹理理所当然可以访问到,因为延迟渲染会把这些信息渲染到 G-buffer 。而当无法直接获取深度缓存时,深度和法线纹理是通过一个单独的Pass渲染而得 。具体实现是Unity会使用着色器替换技术选择那些渲染类型(即 SubShader RenderType 标签)为 Opaque 的物体,判断它们使用的渲染队列是否小于等于2500(内置的 Background Geometry AlphaTest 渲染队列均在此范围内),如果满足条件,就把它渲染到深度和法线纹理中。因此,要想让物体能够出现在深度和法线纹理中,就必须在Shader中设置正确的RenderType标签。

在 Unity中,可以选择让一个摄像机生成一张深度纹理或是一张深度+法线纹理。当选择前者,即只需要 张单独的深度纹理时, Unity 会直接获取深度缓存或是按之前讲到的着色器替换技术,选取需要的不透明物体,并使用它投射阴影时使用的 Pass (即 LightMode 被设置为ShadowCaster Pass)来得到深度纹理。如果 Shader 中不包含这样一个 Pass, 那么这个物体就不会出现在深度纹理中(当然,它也不能向其他物体投射阴影)。深度纹理的精度通常24 位或 16 位,这取决于使用的深度缓存的精度。如果选择生成一张深度+法线纹理, Unity 创建一张和屏幕分辨率相同、精度为 32 位(每个通道为 位)的纹理,其中观察空间下的法线信息会被编码进纹理的 通道,而深度信息会被编码进 通道。法线信息的获取在延迟渲染中是可以非常容易就得到的, Unity 只需要合并深度和法线缓存即可。而在前向渲染中,默认情况下是不会创建法线缓存的,因此 Unity 底层使用了一个单独的 Pass 把整个场景再次渲染一遍来完成。这个 Pass 被包含在 Unity 内置的一个 Unity Shader 中,可以在内置的builtin_shaders-xxx/DefaultResources/Camera-DepthNormaITextureshader 文件中找到这个用于渲染深度和法线信息的 Pass。

获取深度纹理,先设置摄像机的 depthTextureMode:

然后在 Shader 中通过声明_CameraDepthNormalsTexture 变量来访问它。

同理,如果需要获取获取深度+法线纹理,设置摄像机的 depthTextureMode为:

然后在 Shader 中通过声明_CameraDepthN ormalsTexture 变量来访问它。

还可以组合这些模式,让一个摄像机同时产生一张深度和深度+法线纹理:

在 Shader 中访问到深度纹理_CameraDepthTexture 后,我们就可以使用当前像素的纹理坐标对它进行采样。绝大多数情况下,我们直接使用 tex2D 函数采样即可,但在某些平台(例如 PS3 PSP2) 上,我们需要 一些特殊 处理 Unity 为我们提供了一个统一的宏SAMPLE_DEPTH_TEXTURE, 用来处理这些由于平台差异造成的问题。而我们只需要在 Shader中使用 SAMPLE_DEPTH_TEXTURE 宏对深度纹理进行采样,例如:

其中,iscrPos是在顶点着色器中通过调用ComputeScreenPos(opos)得到的屏幕坐标。上述这些宏的定义,可以在Unity 内置的HLSLSupportcginc文件中找到。

当通过纹理采样得到深度值后,这些深度值往往是非线性的,这种非线性来自于透视投影使用的裁剪矩阵。然而,在我们的计算过程中通常是需要线性的深度值,也就是说,我们需要把投影后的深度值变换到线性空间下,例如视角空间下的深度值,我们只需要倒推顶点变换的过程即可。下面以透视投影为例,推导如何由深度纹理中的深度信息计算得到视角空间下的深度值。

当我们使用透视投影的裁剪矩阵 对视角空间下的一个顶点进行变换后,裁剪空间下顶点的z和w分量为:

其中,Far和Near分别是远近裁剪平面的距离。然后,我们通过齐次除法就可以得到NDC下的z分量:

而深度纹理中的深度值是通过下面的公式由NDC 计算而得的:

由上面的这些式子,可以推导出用d表示而得的 的表达式:

由于在Unity 使用的视角空间中,摄像机正向对应的z值均为负值,因此为了得到深度值的正数表示,我们需要对上面的结果取反,最后得到的结果如下:

它的取值范围就是视锥体深度范围,即[Near, Far]。如果我们想得到范围在[0, l]之间的深度值,只需要把上面得到的结果除以Far即可。这样,0就表示该点与摄像机位于同一位置,1表示该点位于视锥体的远裁剪平面上。结果如下:

其实,Unity提供了两个辅助函数来为我们进行上述的计算过程LinearEyeDepth 和LinearOlDepth。LinearEyeDepth 负责把深度纹理的采样结果转换到视角空间下的深度值,也就是我们上面得到的 。而Linear01Depth则会返回一个范围在[0, 1]的线性深度值,也就是我们上面得到的 。这两个函数内部使用了内置的_ZBufferParams变量来得到远近裁剪平面的距离。

如果需要获取深度+法线纹理,可以直接使用tex2D函数对_CameraDepthNormalsTexture 进行采样,得到里面存储的深度和法线信息。Unity提供了辅助函数来为我们对这个采样结果进行解码,从而得到深度值和法线方向。这个函数是DecodeDepthNormal,它在UnityCGcginc 里被定义为:

DecodeDepthNormal 的第一个参数是对深度+法线纹理的采样结果,这个采样结果是 Unity 深度和法线信息编码后的结果 它的 xy 分量存储的是视角空间下的法线信息 而深度信息被编码进了 zw 分量。通过调用 DecodeDepthNormal 函数对采样结果解码后, 我们就可 得到解码后的深度值和法线。这个深度值是范围在[O l] 的线性深度值(这与单独的深度纹理中存储 深度值不同),而得到的法线则是视角空间下的法线方向。同样也可以通过调用 DecodeFloatRG和DecodeViewNormalStereo 来解码深度+法线纹理中的深度和法线信息。

打开Mudbox 在开始之前,我们需要设置一些变量。 调整FOV视角层的FOV参数来匹配你Unity上面的摄像机FOV值。这样就能得到一个好点的刻度调整以及均衡的视角。 将工具的雕刻值方向只设置Y。由于高度地图指示存储高度信息,我们只需要多边形向上在Y轴移动。 为雕刻工具选择一个好的邮戳。可以在制作完基本形状后再做。Bw_cliffFacetif邮戳在岩石表面运行起来效果不错。 开始雕刻地形,直到你满意为止。 完成之后,你的地形如下图所示: 现在要导出我们地形的高度地图来在机器世界里使用! 为此我们导入简单的屏幕OBJ文件到场景中来映射高多边地形数据到平、低多边的平面。 之后到UV和地图-;提取纹理地图-;新 *** 作 选择移置地图并调整下面的参数: 目标模型-;添加低多边平面 源模型-;添加高多边平面地形 搜索距离-;用最佳猜想试验,如果在高度地图中得到非人工的则进行调整 尺寸-;我们用20482048分辨率的 基本文件名字-;选择你的文件名字并选择TIFF16位整数 点击提取来制作你的高度地图 制作过程完毕后,你会得到一个20482048的。 添加地形过程详细信息 我们打开机器世界并设置一些节点。 处理各种参数的时候最好将分辨率设为一个较低的值(513513),这样会加速构建时间。一旦你觉得地形不错了你就可以将分辨率增加到20492049 你可以在项目设置菜单里更改分辨率。 机器世界里对每个节点都做了很多预设。只需要尝试不同设置即可。 创建一个新的高度地图 首先我们需要生成器列表中的一个文件输入节点来加载我们的高度地图。双击节点选择你的TIF高度地图文件。你可以谅解不同规格的节点到文件输出模块的高度域 最终谅解一输出列表中的高度输出节点到你更改环节中最后的一个模块的高度域输出即可 双击高度输出节点并选择一个文件名字 选择RAW16作为文件格式,将之前的r16文件后缀名改为raw 点击写出到硬盘! 创建一个splat地图 Splat地图是根据其水平高度来对地形进行纹理化的。 因此我必须将地形的高度信息分离到单独的通道来获取器RGBA值。我们会使用选择器列表中的选择坡度和选择高度模块。 我们的节点如下所示: 坡度选择器可以只选择来自给定高度的数据来配置地形数据。 如果最大值和最小值跟其他坡度选择器重叠,你就会获得最好的结果。 由于选择器只有一个高度位域输出,我们必须使用合并器列表中的通道合并,然后连接高度位域到通道合并器输入的红、绿、蓝。 最后我们连接来自输出列表中的位图输出节点来将我们的splat地图导出为一个16位PNG。 创建标准地图 标准地图是为地形添加结构的一种很好的方式。为了导出一个标准地图我们需要从转换列表中添加一个标准地图制作节点,然后将其连接到一个位图输出。 创建颜色地图 最后我们需要用转换列表中的颜色节点来制作一个颜色地图。 详细情况是我们将通过选择器列表中的选择顶点节点来导出一个曲率地图。 为了导出文件我们需要连接一个高度输出和一个位图输出节点。 我们将用Photoshop将曲率地图和颜色地图合并。不断对透明度和混合模式进行调整直到你满意为止。 如果你想更深入的了解使用Mudbox创建地形,在CryEngine和UDK里有一个好的更加深入的教程。 下面第二部分处理将地图导入到CryEngine,我们将在下面的环节中涵盖Unity的部分。 你处理完毕后应该会得到四个和一个高度地图的源数据文件。 重要:为了用ats颜色地图终极地形渐变器,你序号将它们在Y轴翻转。 将地形和地图导入到Unity中 打开Unity并将地图添加到项目里。 额外需要添加至少四个纹理,以便在地形中使用。你可以从Unity素材商店里花费10美金购买ats颜色地图终极地形渐变器,我们要用到它的,它可是物超所值哦。 用通过游戏对象-;创建其他-;地形来创建一个新的地形。 到你新创建地形对象的设置列表中,设置高度地图的分辨率为2049,并点击导入源按钮啦导入你的高度地形的源文件。 使用ats颜色地图顶级地形渐变器 启动ats颜色地图渐变器有点复杂,但是包里的文档还是不错的。 创建好地形最好的方法就是遵循手册里的步骤。无论如何,下面是建立渐变器的大概步骤。 至少添加四个地形纹理到地形着色工具中 在地形中添加CustomTerrainScriptColorMapUltraU4cs脚本 在添加颜色地图脚本的时候,设定颜色地图并用地形上的新编辑器处理标准地图 添加splatmap然后选择应用splatd地图 为防止处理splat地图格式时候出错,你可以在Unity里更改文件的导入格式 通过添加地形纹理的标准地图到槽里来创建合并的标准地图,然后导出新生成的合并标准地图 为每个纹理无缝混合生成平均的颜色 创建一个新材料的地形 现在你应该在Unity里得到了一个不错的地形了。 如果在使用ats Colormap UL TRA地形渐变器过程中有什么问题,请查看包里的用户手册。里面很详细,你应该可以解决任何问题。 下面是我们刚才创建的地形。

1打开软件,新建工程如下图所示。点击创建工程按钮。

2在层级面板中穿件Cube,在项目面板鼠标右键中创建材质,如下图所示

3在项目面板下创建脚本文件,如图所示

4双击脚本文件打开,编写代码如下

5创建标准shader,如下图所示

6并将创建的shader替换给Cube对象

7双击打开5中创建的Shader文件,查看参数信息(参数信息的结果是为了书写4中的代码,参见经验视频)

8将3中的脚本附加给Cube。

9点击运行,结果如图。

via @ >

以上就是关于unity路径渲染的路径颜色怎么设置全部的内容,包括:unity路径渲染的路径颜色怎么设置、PBR-BRDF-Disney-Unity-3、Unity Shader 获取深度纹理和法线纹理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9766602.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存