美文网首页
贴花的一些细节补充

贴花的一些细节补充

作者: 上午八点 | 来源:发表于2019-02-22 13:19 被阅读0次

在研究通过HDRP中自带的Decal Projector Component组件来实现贴花效果的过程中,遇到了一些需要理解的地方,以下列出一些关键步骤来说明贴花过程中的细节问题。

DBufferRender 阶段

1. 根据渲染管线中贴画的设置决定是否要使用四张RenderTexture作为渲染目标。

调用ClearAndSetTargets

2. 设置当前渲染目标并clear,使这些纹理有一个初始默认颜色(60至75行)。

3. 设置最终的渲染目标为RTIDs数组(78行),其中对应的纹理即是 _DBufferTexture0, 即是 _DBufferTexture1 和 即是 _DBufferTexture2(此处只用到三张纹理),可通过查看CreateBuffers方法中得知这三张纹理对应的名称是DBuffer0,DBuffer1 和 DBuffer2,和FrameDebug中显示的信息相对应。

设置多个RenderTexture作为渲染目标   RenderTexture的名称 DBufferRender中渲染的三张纹理,在GBuffer中被使用

4. 把m_HTile这张图设置为可以在shader中被写入(80行)。同时需要在shader中声明对应的可读写格式Texture,该声明在ShaderVariablesDecal.hlsl文件中,同时每个Decal都会执行到的frag函数(在ShaderPassDBuffer.hlsl文件中)中, 对_DecalHTile进行写入操作,写入的数据记录了是否需要对Decal进行 基础颜色,法线以及法线遮罩计算的flag标记。最后的判断在 LitDecalData.hlsl 文件中的 ApplyDecalToSurfaceData 方法中进行。

设置m_HTile为可读写目标 与m_HTile对应的_DecalHTile 写入_DecalHTile

5. 再把 m_HTile设置到名称为 "_DecalHTileTexture" 的图,

设置全局贴图 PropertyID的声明

GBuffer 阶段

1.  frag方法在 ShaderPassGBuffer.hlsl 文件中,通过获取当前surfacedata和贴画的surfacedata,通过计算把贴花的baseColor,normalWS,ambientOcclusion等属性应用到当前画面上。

frag方法 应用贴花的surfacedata到当前surfacedata

2. 在获取贴花surfacedata时用_DecalHTileTexture中的数据给 HTileMask 字段赋值。HTileMask 字段在应用贴花数据到当前画面时作flag位判断用。

读取_DecalHTileTexture纹理并给HTileMask字段赋值 用HTileMask字段作为flag标记位对相应属性进行操作

Enable Decal 的控制

使用HDRenderPipeline/Lit 时可以在inspector面板通过勾选 Enable Decal 选项来设置是否使用decal效果,接下来简要说一下代码中是怎么通过这个选项来控制是否显示贴画的。

"HDRenderPipeline/Lit" 这个shader使用了自定义的inspector面板显示方式,通过一个叫 LitGUI的类来实现,

而 Enable Decal 这个选项在 LitGUI的父类即BaseLitGUI中定义,

其对应的ShaderProperty是 "_SupportDecals",

根据是否含有该属性以及该属性的值来设置名为 "_DISABLE_DECALS" 的 shader_feature,

在最后混合decal数据和当前表面数据时有两个判断条件来控制是否可以混合,即 HAVE_DECALS 宏和 _EnableDecals变量,其中 HAVE_DECALS 宏的定义就和 _DISABLE_DECALS 有关,

至此可以搞清楚在材质球的Inspector面板中控制的 "Enable Decal" 选项在shader中控制的是 HAVE_DECALS 这个宏。

 _EnableDecals 的控制

下面理清下 _EnableDecals 变量是从哪里控制的。全局查找 "_EnableDecals" 关键字发现在 DBufferManaget.cs 中通过SetGlobalInt方式来设置该属性值,

enableDecals变量是DBufferManager类的成员变量,在HDRenderPipeline.cs中的Render方法中被设置

可以看出控制条件是 hdCamera.frameSettings.enableDecals,看名称应该是摄像机相关的一些设置。

回到Unity界面中,查看摄像机的Rendering Path设置,如果是 Use Graphics Settings,则找到当前使用的RenderPipeline物体,设置其 Rendering Passes 展开菜单中的 Decals  选项;如果是 Rendering Path 设置是Custom,那么直接在当前Inspector的Rendering Passes展开中找到Decals选项。这两处Decals的设置对应着代码中的 hdCamera.frameSettings.enableDecals 值。

Decal的开关 Decal的开关

总结:

1. DBufferRender阶段写入_DecalHTile纹理,存储decal可以影响哪些表面数据的flag标志位。

2. 把_DecalHTile纹理对应的RenderTexture设置给_DecalHTileTexture纹理。

3. GBuffer阶段读取_DecalHTileTexture纹理,根据其值去对把decal属性和当前表面属性进行混合(baseColor,normalWS,ambientOcclusion 或 specularColor,metallic)。

4. 材质球Inspector面板上的 Enable Decal 选项控制Shader中的 HAVE_DECALS 宏。

5. 摄像机Rendering Path设置中的Decals选项控制Shader中的_EnableDecals变量。

相关文章

  • 贴花的一些细节补充

    在研究通过HDRP中自带的Decal Projector Component组件来实现贴花效果的过程中,遇到了一些...

  • 000408一些细节补充

    9.28解禁股1.333亿股 解禁压力山大,到底是不是真的呢? 解禁股成本到底是多少呢? 六、发行价格新能源汽车带...

  • 补充细节

    马昊轩: “哎,作业真多呀,这得到什么时候才能写完呀?”极度疲惫的我看着桌上堆积如山的作业,心中不免发愁。...

  • torch中添加新层

    原文:https://www.zhihu.com/question/34091628 经过实践,补充了一些细节。 ...

  • Binder机制的细节补充

    (1)Binder驱动的核心方法①用户态程序调用内核驱动,需要陷入内核态,进行系统调用。当用户空间调用open方法...

  • Python语法细节补充

    首先推荐一个初学Python的网站,相信不少人都阅读过,廖雪峰的Python教程:http://www.liaox...

  • iOS -记录

    目前这个APP快做完了,进入到查漏补缺的环节。功能点还是很多,在此记录一些细节,也是基础的补充。

  • 降临 | 你一生的故事

    电影 小说 相互补足 看完电影 觉得 有些中断的点 不是很连贯 看了小说 细节补充上来 电影加了一些情节 也让故事...

  • 贴花花

    ️₂₀₂₁.₀₂.₀₉☼ ﹊﹊﹊﹊﹊﹊﹊﹊星期二,农历腊月廿八คิดถึง。人生就是不屈不挠、顽强跋涉的旅程,每一...

  • Freeline加快Android Studio编译速度

    本文只是对Freeline 官方使用说明文档的一些细节的补充,大部分使用说明是直接Copy过来的。 Freelin...

网友评论

      本文标题:贴花的一些细节补充

      本文链接:https://www.haomeiwen.com/subject/gsrxyqtx.html