|
2 | 2 | title: 集成到项目 |
3 | 3 | weight: 2 |
4 | 4 | --- |
| 5 | + |
5 | 6 | ## 集成到项目 |
6 | | -要使用 LTC 光源,场景中必须且只能存在一个 `LTCLightManager` 实例。你可直接使用预制体 `Prefabs/LTCManager.prefab`。 |
7 | 7 |
|
8 | | -接下来需要设置材质,使其能够接收 LTC 光照,具体步骤分以下两种场景: |
| 8 | +无论你使用的是自定义渲染管线(SRP) 还是官方的通用渲染管线(URP),本工具在Shader Graph 和手写着色器代码两种开发方式下的集成流程都极为简便。 |
| 9 | + |
| 10 | +> [!NOTE] |
| 11 | +> 本工具集在多数情况下是独立于渲染管线运行的。其工作原理是从渲染管线中提取粗糙度、法线、金属度等表面参数,完成光照计算后,再将计算结果叠加到原始渲染输出上。 |
| 12 | +
|
| 13 | +{{% steps %}} |
| 14 | +1. ### 添加 LTCLightManager |
| 15 | + |
| 16 | + 若要使用 LTC 光照,场景中必须且只能存在一个`LTCLightManager`实例。你可以创建一个空游戏对象,然后为其添加`LTCLightManager`组件。 |
| 17 | + |
| 18 | + {{< image src="/imgs/LTCLightManager.png" alt="LTCLightManager" title="LTCLightManager" loading="lazy" >}} |
| 19 | + |
| 20 | + PrefilterTexture着色器的路径如下: |
| 21 | + |
| 22 | + `Real Time Area Lights/Shaders/PrefilterTexture.shader`. 该着色器用于纹理面光源功能,需将其指定给LTCLightManager组件。 |
| 23 | + |
| 24 | + 你也可以直接使用预制件 Prefabs/LTCManager.prefab,无需额外配置。 |
| 25 | + |
| 26 | + {{< image src="/imgs/LTCLightManager_prefab.png" alt="LTCLightManager Prefab" title="LTCLightManager Prefab" loading="lazy" >}} |
| 27 | + |
| 28 | +2. ### 着色器修改 |
| 29 | + |
| 30 | + 下一步需要对着色器进行简单修改,使材质能够接收 LTC 光照。 |
| 31 | + |
| 32 | + #### Shader Graph |
| 33 | + 目前无法直接拦截片段着色器阶段的光照计算流程,但可以将 LTC 附加光照的计算结果连接到自发光通道(Emission Channel),该通道的输出最终会叠加到整体光照结果中。 |
| 34 | + |
| 35 | + {{< image src="/imgs/shadergraph_sample.png" alt="shadergraphsample" title="shadergraphsample" loading="lazy" >}} |
| 36 | + |
| 37 | + 操作方法:在 Shader Graph 中创建一个 LTCLighting 节点(该节点已包含在本工具集中),为其接入与Fragment block 几乎完全一致的输入,最后将节点输出连接 Fragment Block 的自发光端口。 [参考 ShaderGraph 示例](/docs/ltclight/sample#shader-graph-示例). |
| 38 | + |
| 39 | + #### Shader 代码 |
| 40 | + |
| 41 | + 对于手写的着色器,扩展 LTC 光照支持同样便捷。工具集已提供辅助函数,可将 URP 标准光照着色器的输入参数转换为 LTC 光照所需的格式 —— 实际上二者的参数结构基本一致。 |
| 42 | + |
| 43 | + 以 URP 标准光照着色器为例,首先在LitForwardPass.hlsl文件中引入 LTC 着色器头文件: |
| 44 | + |
| 45 | + ``` cpp |
| 46 | + #include "Packages/com.petabytes.ltclight/Shaders/LTC_URP.hlsl" |
| 47 | + ``` |
| 48 | + |
| 49 | + 然后在 URP 的 PBR 光照计算完成后,添加 LTC 光照的计算逻辑: |
| 50 | + |
| 51 | + ``` cpp |
| 52 | + // For example in LitForwardPass.hlsl |
| 53 | + InitializeBakedGIData(input, inputData); |
| 54 | + half4 color = UniversalFragmentPBR(inputData, surfaceData); |
| 55 | + |
| 56 | + // Add LTC lighting here |
| 57 | + color.rgb += CalculateFragmentLTC(inputData, surfaceData); |
| 58 | + ``` |
| 59 | + |
| 60 | + [参考 Shader 代码示例](/docs/ltclight/sample#着色器代码示例). |
| 61 | + |
| 62 | + |
| 63 | +3. ### 添加 LTC 光照组件 |
| 64 | + |
| 65 | + 最后一步,在场景中创建所需的 LTC 光源即可。 |
| 66 | + |
| 67 | +{{% /steps %}} |
| 68 | + |
| 69 | +> [!NOTE] |
| 70 | +> ### 自定义渲染管线适配说明 |
| 71 | +> 若使用自定义渲染管线,你需要提供与 URP 中`inputData`和`surfaceData`数据结构一致的参数,然后参照[Shader 代码](#shader-代码)的方式修改着色器。 |
| 72 | +
|
| 73 | + |
| 74 | +### Specular 和 Metallic 工作流适配 |
| 75 | + |
| 76 | +在资源制作过程中,你可能会使用高光工作流或金属度工作流,本工具集对两种工作流均提供良好支持: |
9 | 77 |
|
10 | | -### 针对 Shader Graph 的设置 |
11 | | -我们无法修改 Fragment graph 的光照计算,但可将额外的 LTC 光照添加到「自发光(Emission)」通道中,该通道的效果会融入最终光照结果。 |
| 78 | +{{< tabs >}} |
| 79 | +{{% tab "URP Shader Graph" %}} |
12 | 80 |
|
13 | | - |
| 81 | +若在 URP 着色器图中集成,需根据当前使用的工作流,将 LTC 光照节点连接到对应的输入通道。 |
14 | 82 |
|
15 | | -操作步骤如下:在 Shader Graph 中添加一个「LTCLighting」节点(该节点已包含在本资源包中),为其添加与 Fragment 模块几乎完全一致的输入通道,再将输出连到 Fragment 模块的自发光通道即可。你可参考 Shader Graph 示例项目中的具体设置。 |
| 83 | +{{< image src="/imgs/shadergraph_workflow.png" alt="specular metallic workflow" title="specular metallic workflow" loading="lazy" >}} |
16 | 84 |
|
17 | | -### 针对 Shader 代码的设置 |
18 | | -扩展手写着色器以支持 LTC 光照同样便捷,资源包中已提供辅助函数,可将 URP(通用渲染管线)光照着色器的输入转换为 LTC 光照的输入——实际上两者的输入格式基本一致。 |
| 85 | +{{% /tab %}} |
| 86 | +{{% tab "URP Shader Code" %}} |
19 | 87 |
|
20 | | -以 URP Lit 着色器为例,具体步骤如下: |
21 | | -1. 在 `LitForwardPass.hlsl` 文件中引入 LTC 着色器: |
22 | | - ```cpp |
23 | | - #include "Packages/com.petabytes.ltclight/Shaders/LTC_URP.hlsl" |
24 | | - ``` |
25 | | -2. 在 URP 的 PBR(基于物理的渲染)计算完成后,添加 LTC 光照计算: |
26 | | - ```cpp |
27 | | - // 示例代码位于 LitForwardPass.hlsl 中 |
28 | | - InitializeBakedGIData(input, inputData); |
29 | | - half4 color = UniversalFragmentPBR(inputData, surfaceData); |
| 88 | +若在 URP 着色器代码中集成,URP 标准着色器已内置对两种工作流的兼容逻辑,无需额外操作。 |
30 | 89 |
|
31 | | - // 在此处添加 LTC 光照 |
32 | | - color.rgb += CalculateFragmentLTC(inputData, surfaceData); |
33 | | - ``` |
| 90 | +{{% /tab %}} |
| 91 | +{{%tab "Customized Render Pipeline"%}} |
34 | 92 |
|
35 | | -完成以上步骤后,最后一步是在场景中添加 LTC 光源实例。 |
| 93 | +若使用自定义渲染管线,在向 LTC 光照计算函数传递表面参数时,需自行完成金属度与高光参数之间的格式转换,可参考 URP 的`InitializeBRDFData`函数的实现逻辑。 |
36 | 94 |
|
| 95 | +{{%/tab%}} |
| 96 | +{{< /tabs >}} |
0 commit comments