首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Unity通用渲染管线(URP)系列(十四)——多相机(Camera Blending & Rendering Layers)

通过LitPassFragment中此函数过滤表面alpha,以在末尾获得正确alpha值。 ? 在UnlitPassFragment中对base alpha做同样操作。 ?...我没有给它提供深度缓冲区,因为我渲染了带有Post FX相机,该相机使用深度缓冲区创建了自己中间渲染纹理。 ?...因为这纯粹是下拉菜单装饰,所以我们只需要对Unity编辑器执行此操作。因此,将CustomRenderPipelineAsset转换为局部类。 ? 然后为其创建一个覆盖属性仅编辑器脚本资产。...发生这种情况是因为渲染层掩码在内部存储为符号整数uint。这是有必须因为它用作位掩码,但是SerializedProperty仅支持获取和设置带符号整数值。...我们将掩码作为uint添加到Surface结构中,因为它是位掩码。 ? 在LitPassFragment中设置表面的掩码时,我们需要使用asuint固有函数。

8.2K22

Unity通用渲染管线(URP)系列(八)——复杂贴图(Masks, Details, and Normals)

因此,它是RGB纹理,而不是RGBA。 ? 3.1 细节UV坐标 因为细节贴图应该比基础贴图使用更高Tiling,所以它需要自己tiling 和offset。...(插值后反照率) 这很有效,而且很明显,因为我们细节贴图非常强。但是增亮效果似乎比增暗效果更强。那是因为我们正在线性空间中应用修改。在伽马空间中执行此操作将更好地匹配视觉上相等分布。...(淡化细节) 4 法线贴图 即使我们已经让表面复杂很多了,它看起来仍然很平坦,因为它确实如此。照明与表面法线交互,该法线在每个三角形上平滑插值。...而且,在使Mip贴图淡化时,Unity忽略Alpha通道,因此该通道中数据将不会正确变淡。因此,需要在Unity外部或使用脚本自行生成Mip映射。...通过添加一些着色器功能来控制着色器使用哪些贴图,可以避免不必要工作。Unity着色器会根据在编辑器中分配贴图自动执行此操作,但是我们将通过显式切换来控制它。

4.1K40
您找到你想要的搜索结果了吗?
是的
没有找到

Unity通用渲染管线(URP)系列(四)——方向阴影(Cascaded Shadow Maps)

如果还有空间,存储灯光可见索引并增加计数。 ? 但是阴影只能保留给有阴影灯光。如果灯光阴影模式设置为或阴影强度为零,则它没有阴影,应将其忽略。 ?...完成此操作后,Unity将抱怨着色器数组大小已更改,但无法使用新大小。这是因为一旦着色器声明了固定数组,就无法在同一会话期间在GPU上更改其大小。我们需要重新启动Unity才能对其进行初始化。...现在,仅在表面深度小于最大距离时才执行此操作,而不是始终在GetShadowData中将强度初始化为一,否则将其设置为零。 ? ?...4.3 法线偏差 发生不正确自遮影是因为阴影投射深度texel覆盖了多个片段,从而导致投射物体体积从其表面戳出。因此,如果我们将投射器缩小得足够多,则该情况不再发生。...(不受光,但是可以投射阴影) 5.6 接受阴影 最后,我们还可以使Lit表面忽略阴影,这可能对全息图之类东西或仅出于艺术目的有用。

6.4K40

Unity通用渲染管线(URP)系列(七)——LOD和反射(Adding Details)

你可以通过在Group组件中选择一个级别块,然后将对象拖动到其“渲染器”列表中,或直接将其拖放到LOD级别块上,来执行此操作。 ? (LOD 0渲染器) Unity将自动呈现适当对象。...Unity为LOD_FADE_CROSSFADE关键字选择一个着色器变体,因此将其多编译指令添加到我们Lit着色器中。对CustomLit和ShadowCaster传递都执行此操作。 ?...1.4 抖动 为了混合两个LOD级别,我们可以使用裁剪,应用类似于近似半透明阴影方法。由于我们需要对表面及其阴影都进行此操作,因此我们将其为此添加一个ClipLOD函数。...这就忽略了淡入淡出过渡宽度,而是在组通过LOD阈值时迅速进行淡入淡出。 ? ?...(反射环境探针) 现在,表面可以反射环境。这对于金属表面很明显,但是其他表面也可以反射它。因为它只是天空盒,所以还没有其他反射,但是我们稍后再讨论。 ?

4.3K31

基础渲染系列(五)——多灯光

深度表示每个像素到相机最近表面的距离。就像声纳。 如果要渲染片段前面没有任何内容,则当前是最靠近相机表面。GPU继续运行片段程序。它会覆盖像素颜色,并记录其新深度。...如果是这样的话,我们最终会到达与上一个通道完全相同深度因为它是针对同一对象。因此,我们最终记录了完全相同深度值。 由于不需要两次写入深度缓冲区,因此可以禁用它。...因此,光子密度降低。这就确定了观察到亮度。 ? (球形衰减) 半径为r 表面积等于 ? 。要确定光子密度,我们可以将其除以它。忽略常数4π,因为我们可以假设这是光线强度因子。...UNITY_ATTEN_CHANNEL是r还是a,具体取决于目标平台。 因为我们不支持阴影,所以SHADOW_ATTENUATION宏变为1,可以忽略。 使用此宏后,衰减似乎不再起作用。...(默认天空盒,没有方向光) 现在,Unity在后台渲染天空盒。它是基于主方向灯程序生成天空盒。由于我们没有活动光,因此它行为就像太阳在地平线上。

2.4K20

Unity通用渲染管线(URP)系列(三)——方向光(Direct Illumination)

定义UNITY_ASSUME_UNIFORM_SCALING时,它将调用TransformObjectToWorldDir,该函数与TransformObjectToWorld相同,但它忽略平移部分,因为我们正在处理方向矢量而不是位置...我们只需要指定一个最小值,因为点积绝不会大于1,但是饱和度是一种常见着色器操作,因此通常是自由操作修饰符。 添加另一个GetLighting函数,该函数返回表面和灯光最终照明。...它是矩阵第三列,必须再次取反。 ? 最终颜色已经应用了光源强度,但是默认情况下Unity不会将其转换为线性空间。...因为一个表面可以包含这两者混合,所以我们将为其添加一个范围为0~1滑块,其中1表示它是完全金属。默认为全绝缘。 第二个属性控制表面的光滑程度。...它是Opaque另一个副本,具有调整混合模式和队列,并且没有深度写入。 ? 第四个预设是Fade变体,它应用了预乘alpha混合。

5.5K40

基础渲染系列(十一)——透明度

在我们例子中,这是主反照率纹理Alpha通道,以及颜色色调Alpha通道。 下面是透明度贴图示例。它是纯白色纹理,因为它是白色,所以我们可以完全专注于透明度,而不会受到反照率模式干扰。...片段是完全不透明,或者是完全透明。如果它是透明,那么根本就不会渲染。这使得可以在某表面上切孔。 要中止渲染片段,可以使用clip函数。如果此函数参数为负,则片段将被丢弃。...此着色器标记本身不会执行任何操作。这是一个提示,告诉Unity它是哪种着色器。替换着色器使用它来确定是否应渲染对象。 什么是replacement着色器? 它可以否决使用哪种着色器渲染对象。...这可以用来创建许多不同效果。在某些情况下,需要深度缓冲区但无法访问时,Unity可能会使用替换着色器创建深度纹理。...在我们例子中,某些DrawCall显然会产生错误结果。发生这种情况是因为我们着色器仍会写入深度缓冲区。深度缓冲区是二进制,并不关心透明度。如果片段没有被裁剪,其深度最终将写入缓冲区。

3.6K20

基础渲染系列(十)——更复杂复合材质

(没有VS有 全遮挡) 这会产生更强阴影。实际上,它们可能过于强了。由于遮挡贴图基于表面形状而不是特定光,因此将其仅应用于间接光才是有意义。来自四面八方光会随着进入凹坑深度而减少。...SSAO是一种后处理图像效果,它使用深度缓冲区动态创建整个帧遮挡图。它用于增强场景深度感。由于它是一种后处理效果,因此在渲染所有灯光之后将其应用于图像。这意味着阴影会同时应用于间接和直接光。...由于着色器编译器优化,我们可以通过两次定义检查来完成此操作。 ? 那反照率图和颜色呢? Unity标准着色器假定始终存在一个反照率贴图,因此不为其保留关键字。...不必使用目标字段,我们需要遍历编辑器目标数组中所有材质。让我们使用一个foreach循环来执行此操作因为它是简洁代码,在这里我们不必担心性能。 ? foreach如何工作?...在这种情况下,UI会显示凹凸比例,因为它是基于第一种材质。这不是问题,因为第二种材质将仅忽略凹凸比例。但是,当更改凹凸比例时,UI将更新两种材质关键字。

2.3K30

基础渲染系列(二十)——视差(基础篇完结)

灯光表明坡度陡峭,而视差告诉我们它是平坦。因此,法线贴图仅适用于不会显示明显视差微小变化。 ? (更强法线,但还是平坦) 为了获得真正深度感,我们首先需要确定应该有多少深度。...它是灰度,黑色代表最低点,白色代表最高点。因为我们将使用此贴图创建视差效果,所以通常称为视差贴图,而不是高度贴图。 ?...像遮挡贴图一样,Unity标准着色器希望高度数据存储在纹理G通道中。因此,我们也将执行此操作,并在工具提示中进行说明。 ?...仅当所有片段都执行相同代码时,它才能执行此操作。 这对于我们循环是不可能因为它可以提前终止,每个片段可能有所不同。...但是,视差遮挡引起轮廓总是被混淆。MSAA并没有消除它,因为它仅适用于几何图形边缘,不适用于纹理效果。只要不依赖深度缓冲区,后处理抗锯齿技术仍然可以使用。 能把每个片段写入深度缓冲区吗?

2.9K20

Unity高级开发-光照系统-2019.4LFT版本

降噪设置: ? 降噪设置烘焙结果: ? 打开降噪设置: ?...像素和纹素最大区别是:像素其实就是图片数据;但是纹素可以代表很多类型数据,它可以是纹理贴图,也可以是用于计算阴影深度图。...(2) 模型上用于光照烘焙UV不存在重叠: 如果看下来其实所有模型原始UV都不存在问题,在实际烘焙好光照贴图场景中也看不出有什么“渗色”情况,我们可以忽略这个警告。...Albedo Boost(反射率增强):用于控制物体表面之间光子弹射数量。默认数值为1。数值限定在1到10之间。数值越大,物体表面的反射率越趋向于白色。...(3) 将场景切分成多个小场景,使用多场景方式进行加载。这样可以针对各个小场景进行烘焙。

1.9K62

Unity可编程渲染管线系列(十一)后处理(全屏特效)

该ID有一个RenderTargetIdentifier,但假定它是着色器属性ID,则从int隐式转换为该类型。另外,我们可以指定加载和存储操作。...发生这种情况是因为Unity在某些情况下会进行垂直翻转以获得一致结果。例如,当不使用OpenGL时,场景视图窗口和小型相机预览将被翻转。...首先将HLSL文件中CopyPassVertex重命名为DefaultPassVertex,因为它是一个简单顶点程序,可以用于多种效果。...5.4 仅不透明后处理 除天空盒外,透明几何也不会写入深度缓冲区。因此,条纹将基于其背后内容而应用于透明表面的上层。景深等效果行为方式相同。对于某些效果,最好不要将它们完全应用于透明对象。...再次设置颜色和深度目标,这一次我们要确保它们已加载。 ? ? ? (不透明几何图形后绘制深度条纹。)

3.5K20

Unity可编程渲染管线系列(三)光照(单通道 正向渲染)

Unity默认管线针对每个对象在单独通道中渲染每个灯光。轻量级管线针对每个对象在一次通道中渲染所有灯光。HD管线使用延迟渲染,该渲染将渲染所有对象表面数据,然后每光源渲染一遍。...通过将世界位置乘以灯光方向或位置矢量W分量,我们可以用相同计算来支持这两种方法。如果它是位置向量,则W为1,计算不变。但是,如果它是方向矢量,则W为0,并且消除了相减。...除此之外,还有unity_LightIndicesOffsetAndCount,另一个float4向量。它Y分量包含影响对象灯光数量。它X分量包含使用第二种方法时偏移量,因此我们可以忽略它。...以及MyPipeline中maxVisibleLights。 ? 重新编译后,Unity警告我们我们已经超出了先前数组大小。不幸是,不可能仅在着色器中更改固定数组大小。...对于超出最大值所有灯光,请在ConfigureLights末尾执行此操作。 ? 当我们最终看到太多可见光时,我们才真正需要这样做,而这并不是所有时间都应该发生。 ?

2.2K20

Unity基础教程系列(新)(一)——游戏对象和脚本(Creating+a+Clock)

3.2 定义组件类型 将脚本加载到代码编辑器中之后,首先删除标准模板代码,因为我们将从头开始创建组件类型。 空文件是不会定义任何内容。它需要包含我们时钟组件定义。我们要定义不是组件单个实例。...就像Unity检测到我们字段一样,它也检测到此Awake方法。当组件具有Awake方法时,Unity在唤醒时将在该组件上调用该方法。这是在播放模式下创建或加载后发生。...相反,rotation属性表示世界空间中最终旋转,同时考虑了整个对象层次。如果将时钟整体旋转,则设置该属性会产生奇怪结果,因为指针会忽略该属性,因为该属性会补偿时钟旋转。...Unity完成重新编译后,你会在控制台中看到一条警告,抱怨Clock.hoursPivot从未分配值给它。现在仅显示警告因为这是我们第一次通过代码访问该字段。...触发警告因为C#编译器不知道应该通过检查器进行连接。我们可以通过为字段声明分配默认值来消除此警告,我们可以通过立即为其分配默认值来做到这一点。 ? 现在,在编辑器中进入播放模式。

4.2K20

Unity基础教程系列(五)——生成区域(Level Variety)

(只在区域表面生成) 仅在表面上生成才可以使球体形状更加明显。 ? ? (表面和内部对比) 1.5 可视化区域 现在可以调整生成区域了,但如果可以不生成很多点就能看到其形状就会更好了。...使用Spawn Zone对象执行此操作,将其从Main Scene移到Level 1。 ? (生成区域转移到 Level 1) 该区域现在是关卡一部分,但是Unity警告我们它检测到跨场景引用。...仅在加载关卡之后才能执行此操作。实际上,每次加载关卡时都必须执行此操作因为每个关卡必须具有自己生成区域。问题是谁应该对此负责。 尽管Game控制关卡加载,但它不能直接访问关卡内容。...虽然这在进入播放模式和构建时有效,但是static属性不会在编辑器中处于播放模式编译之间持久存在,因为它不是Unity游戏状态一部分。...请注意,在关卡更改后也会调用OnEnable,因为加载关卡时我们会暂时禁用Game。这不会造成问题,因为我们最终用相同引用替换了旧引用。

1.8K20

基础渲染系列(七)——阴影

深度信息最终存储为0-1范围内值。查看纹理时,附近纹素看起来很暗。纹素越远,它变得越轻。 ? (深度纹理,相机近切面设置为5) 什么是剪辑空间? 它是确定相机所见空间。...这使我们可以从两个角度比较深度测量值。从概念上讲,我们有两个向量在同一点结束。如果他们确实到在同一点结束了,则相机和灯光都可以看到该点,因此它是。...为了支持所有相关pass,我们必须向它着色器添加一个pass,其照明模式设置为ShadowCaster。因为我们只对深度值感兴趣,所以它将比其他pass操作简单得多。 ?...片段程序实际上不需要执行任何操作,因此只需返回零即可。GPU会为我们记录深度值。 ? 这就已经足以定向投射阴影了。 ? (投射阴影) 2.1 偏差 我们还必须支持阴影偏差。...UnityEncodeCubeShadowDepth是做什么Unity更喜欢使用浮点立方体贴图。在可能情况下,此功能不执行任何操作

4K30

Unity通用渲染管线(URP)系列(九)——点光源和聚光灯(Lights with Limited Influence)

如果最终我们看到可见光比最大数量更多,则将被忽略掉。Unity会根据重要性对可见光列表进行排序,因此只要可见光不发生变化,哪些灯被忽略就是一致。...这时,光线方向会随每个片元而变化。我们通过将从表面位置到光线光线归一化来找到它。因为目前不支持阴影,因此衰减为1。 ?...(正确衰减烘焙) 不幸是,Unity 2019.2光照贴图器不支持聚光灯自定义内衰减角度。可以设置内spot角度,但它会被忽略。 光照贴图程序可以在更高版本Unity中使用内Spot角度吗?...通常,这对于小型物体而言效果很好,但对于大型物体而言并不理想,因为如果光线仅影响物体一小部分,则仍然需要对其整个表面进行评估。...首先是unity_LightData,它包含其Y分量中灯光量。之后是unity_LightIndices,它是长度为2数组。两个向量每个通道都包含一个光索引,因此每个对象最多支持八个。 ?

4K20

Unity通用渲染管线(URP)系列(五)——烘焙光(Baked Light)

2.2 光照贴图坐标 要得到光照贴图UV坐标,就必须由Unity将其发送到着色器。我们需要告诉管线对每个被烘焙了灯光信息对象执行此操作。...一旦Unity用我们自己meta pass重新烘焙了场景,所有的间接照明都将消失,因为黑色表面不会反射任何东西。 ?...我让它们为全局光照做些贡献,并在“Lightmap ”中将它们Scale 加倍,以避免发出有关重叠UV坐标的警告。...到这步之后仍然还不能正常工作,因为Unity会积极尝试避免在烘焙时使用单独emission通道。如果材质emission 设置为零的话,还会直接将其忽略。但是,它没有限制单个对象材质属性。...(半透明天花板会被视为不透明) 6.1 硬编码属性 不幸是,Unity光照贴图器(烘焙器)对于透明性处理是硬编码。它会查看材质队列以确定它是不透明,裁切还是透明。

8.1K20

基础渲染系列(十三)——延迟着色

要渲染物体,着色器必须获取网格数据,将其转换为正确空间,对其进行插值,检索和导出表面属性,并计算照明度。前向着色器必须对受光对象每个像素光重复所有这些操作。...附加通道比基本通道便宜一些,因为深度缓冲区已经准备好了,它们不会被间接光打扰。但是他们仍然必须重复基本通道已经完成大部分工作。 ? (重复工作) 由于几何属性每次都是相同,为什么不缓存它们呢?...我们必须按片段存储此数据,因此我们需要一个适合显示缓冲区,就像深度缓冲区和帧缓冲区一样。 ? (缓存表面属性) 现在,缓冲区中提供了照明所需所有几何数据。唯一缺少是灯光本身。...在这种情况下,前向物体需要进行深度通道。G缓冲区填满后直接执行此操作。副作用是,前向对象在反照率缓冲区中最终变为纯黑色。 ? ? (延迟和前向一起) 透明对象也是如此。...对于deferred pass,需要为所有四个输出分配值,我们将在稍后进行操作。其他pass只复制最终阴影颜色。 ? 2.2 Buffer 0 第一个G缓冲区用于存储漫反射反照率和表面遮挡。

2.7K20

基础渲染系列(十六)——静态光照

因为镜面光取决于视角,也就是取决于相机。通常,相机是可移动,因此不能包含在光照贴图中。此限制意味着光照贴图可以用于微弱灯光和暗淡表面,但不适用于强直射灯光或闪亮表面。...(环境照明,实时光VS光照贴图) 每次光子反弹,它都会失去部分能量,并被与其相互作用材质融色。烘焙间接光时,Unity考虑到这一点。结果就是,物体会根据附近物体进行上色。 ? ?...这是指在角落和折痕中发生间接光阴影。这是一种人工增强,可以增强深度感。 ? ? (使用了环境遮挡) 环境光遮挡效果仅基于表面的隐藏程度。它不考虑光实际来源。...由于这种不一致,我们必须手动进行操作。 ? 2.3 采样光照贴图 因为光照贴图数据被认为是间接光照,所以我们将在CreateIndirectLight函数中对其进行采样。...它用于一些编辑器可视化效果,这时我们将忽略它们。 ? UnityMetaFragment是什么样

3.6K20

Unity Shader入门精要》笔记:基础篇(1)

---- 目录 渲染流水线 额外补充 Unity Shader基础 额外补充 渲染流水线 (本篇部分内容在HLSL笔记中也有所提及) 什么是渲染流水线:传送门 CPU和GPU之间通信:1、把数据加载到显存中...(测试、混合部分可进行高自由度编写) 片元->模板测试->深度测试->混合->颜色缓冲区。(模板测试可以用于渲染阴影,轮廓等) 经过上述操作后,图像最终显示在屏幕上。...具体操作如下图所示。 Tip:Unity Shader和渲染管线中Shader有很大区别,在阅读时请区分两者,具体内容会在之后表述。...Unity加载Shader时会扫描所有的SubShader并选择第一个能运行SubShader运行,如果都不可以运行则使用Fallback指定UnityShader SubShader...Unity Shader形式:表面着色器,顶点/片元着色器,固定函数着色器。 表面着色器(Surface Shader):Unity自创着色器代码类型。

85720
领券