Skip to content

Commit d0c126f

Browse files
committed
refine zh docs
1 parent af59e51 commit d0c126f

7 files changed

Lines changed: 296 additions & 71 deletions

File tree

content.zh/docs/ltclight/_index.md

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,37 @@ aliases:
55
- /posts/ltc_area_light_cn/
66
---
77

8-
# 使用指南
8+
## 使用指南
99

1010
[WebGL demo](https://yaotouge.github.io/imgs/LTCDemo/WebGLBuild/index.html).
1111

12-
本文档将指导你使用 LTC 光源插件,以下是几种不同光源类型的效果展示
12+
本文档将指导你使用**实时面光源**插件包。该插件包扩展了 Unity 的光照系统,使其支持面光源功能。以下是不同光源类型的效果展示
1313

14-
### 多边形光源
15-
![图片](/imgs/polygon.png)
14+
多边形光源
15+
{{< image src="/imgs/polygon.png" alt="polygon" title="polygon" loading="lazy" >}}
1616

17-
### 线性光源
18-
![图片](/imgs/linear.png)
17+
线光源:
18+
{{< image src="/imgs/linear.png" alt="linear" title="linear" loading="lazy" >}}
1919

20-
### 纹理光源
21-
![图片](/imgs/textured.png)
20+
带纹理光源:
21+
{{< image src="/imgs/textured.png" alt="textured" title="textured" loading="lazy" >}}
22+
23+
### 面光源
24+
传统光照计算会将光源抽象为空间中某一位置上无体积的点(如聚光灯、点光源等),或是处于无限远处的光源(如平行光)。这种抽象简化了实时图形学的光照计算流程。
25+
26+
但现实世界中的光源并非无限小,当光源体积相对较大时,这种抽象模型与真实效果的差异会变得十分明显。要实现视觉上精准的光照效果,光照算法往往需要用到蒙特卡洛积分这类计算成本极高的方法,而这并不适用于实时应用场景。
27+
28+
### 线性变换余弦函数
29+
[线性变换余弦函数(LTC)](https://eheitzresearch.wordpress.com/415-2/)为我们提供了一种解析解近似面光源的方法,能够在常数时间内得到可信度较高的光照计算结果。
30+
31+
该方法的提出者发现,我们已经拥有一套针对余弦球面分布的多边形积分解析解,但余弦分布仅适用于漫反射表面的光照计算。
32+
33+
{{<image src="https://eheitzresearch.wordpress.com/wp-content/uploads/2016/04/ltc_integration2.png?w=625">}}
34+
35+
更进一步,他们创新性地引入矩阵变换,将余弦分布转换为基于物理的光照反射分布(PBR BRDF)(近似转换)。换句话说,我们可以通过逆变换,将基于物理的光照反射分布转换为存在解析解的余弦球面分布。
36+
37+
{{<image src="https://eheitzresearch.wordpress.com/wp-content/uploads/2016/04/ltc_isotropic.gif?w=625">}}
38+
39+
最终,我们将多边形从基于物理的光照反射分布空间,变换到余弦球面分布空间中,再执行多边形积分的解析计算即可。
40+
41+
{{<image src="https://eheitzresearch.wordpress.com/wp-content/uploads/2016/04/ltc_integration.gif?w=625">}}

content.zh/docs/ltclight/integration.md

Lines changed: 82 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,95 @@
22
title: 集成到项目
33
weight: 2
44
---
5+
56
## 集成到项目
6-
要使用 LTC 光源,场景中必须且只能存在一个 `LTCLightManager` 实例。你可直接使用预制体 `Prefabs/LTCManager.prefab`
77

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+
在资源制作过程中,你可能会使用高光工作流或金属度工作流,本工具集对两种工作流均提供良好支持:
977

10-
### 针对 Shader Graph 的设置
11-
我们无法修改 Fragment graph 的光照计算,但可将额外的 LTC 光照添加到「自发光(Emission)」通道中,该通道的效果会融入最终光照结果。
78+
{{< tabs >}}
79+
{{% tab "URP Shader Graph" %}}
1280

13-
![图片](/imgs/shadergraph_sample.png)
81+
若在 URP 着色器图中集成,需根据当前使用的工作流,将 LTC 光照节点连接到对应的输入通道。
1482

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" >}}
1684

17-
### 针对 Shader 代码的设置
18-
扩展手写着色器以支持 LTC 光照同样便捷,资源包中已提供辅助函数,可将 URP(通用渲染管线)光照着色器的输入转换为 LTC 光照的输入——实际上两者的输入格式基本一致。
85+
{{% /tab %}}
86+
{{% tab "URP Shader Code" %}}
1987

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 标准着色器已内置对两种工作流的兼容逻辑,无需额外操作。
3089

31-
// 在此处添加 LTC 光照
32-
color.rgb += CalculateFragmentLTC(inputData, surfaceData);
33-
```
90+
{{% /tab %}}
91+
{{%tab "Customized Render Pipeline"%}}
3492

35-
完成以上步骤后,最后一步是在场景中添加 LTC 光源实例
93+
若使用自定义渲染管线,在向 LTC 光照计算函数传递表面参数时,需自行完成金属度与高光参数之间的格式转换,可参考 URP 的`InitializeBRDFData`函数的实现逻辑
3694

95+
{{%/tab%}}
96+
{{< /tabs >}}

content.zh/docs/ltclight/light_types/_index.md

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,52 @@ title: LTC 光源类型
33
weight: 4
44
---
55

6-
## LTC 光源类型
7-
目前支持三种光源类型:多边形光源、线性光源和纹理面光源。未来将新增更多类型,如贝塞尔曲线形状的面光源。
6+
## LTC 面光源
87

9-
所有光源类型均包含以下通用属性:
8+
当前该资源包支持多边形光源、线性光源和带纹理面光源。未来还将新增更多光源类型,例如贝塞尔曲线形状的面光源。
109

11-
| 属性名称 | 描述 |
12-
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
13-
| Color(颜色) | 光源的 RGB 颜色 |
14-
| Intensity(强度) | 光源的发光强度 |
15-
| Range(范围) | 光源的影响空间范围,不同光源类型对该属性的定义不同。**此属性不受物体缩放影响,选中光源时可以通过 gizmo 可查看范围** |
16-
| Light Mode(光照模式) | 选择仅使用漫反射光照、仅使用镜面反射光照,或两者同时使用 |
17-
| Use World Position(使用世界坐标) | 光源形状的坐标基于物体本地空间还是世界空间 |
10+
### 属性说明
1811

19-
---
12+
以下是所有光源类型的通用属性:
13+
14+
{{<image src="/imgs/common_attrib.png" title="Common Attributes" alt="Common Attributes" loading="lazy">}}
15+
16+
**`Color(颜色)`**
17+
18+
光源的 RGB 颜色值。
19+
20+
> [!TIP]
21+
> 对于带纹理的光源,该颜色会与纹理自身的颜色进行相乘叠加。
22+
>
23+
> {{<image src="/imgs/textured_color.png" title="Multiply Color" alt="Multiply Color" loading="lazy">}}
24+
25+
**`高光/漫反射强度(Specular|Diffuse Intensity)`**
26+
27+
光源强度是光照计算结果的乘数因子,由漫反射强度和高光强度两部分组成,二者可独立调节。
28+
29+
**`Range(作用范围)`**
30+
31+
光源影响的空间范围,该参数在不同光源类型下的含义有所区别。此范围不受对象缩放变换的影响,选中光源对象后,可在场景视图中通过 Gizmo 直观查看作用范围。
32+
33+
**`Light Mode(光照模式)`**
34+
35+
光照计算包含两个核心部分:漫反射光照与高光反射光照。尽管这两项计算结果会受材质金属度属性的调节,但你仍可根据特殊需求,选择仅启用漫反射、仅启用高光反射,或同时启用两种光照模式。
36+
37+
{{% columns %}}
38+
- {{< card image="/imgs/spec_diff.png" >}}
39+
高光 + 漫反射模式
40+
{{< /card >}}
41+
42+
- {{< card image="/imgs/diff_only.png" >}}
43+
仅漫反射模式
44+
{{< /card >}}
45+
46+
- {{< card image="/imgs/spec_only.png" >}}
47+
仅高光反射模式
48+
{{< /card >}}
49+
50+
{{% /columns %}}
51+
52+
**`Use World Position(使用世界坐标)`**
53+
54+
设置光源顶点的坐标空间:勾选后使用世界空间,此时对象的transform 会被忽略;未勾选时使用对象局部空间。该选项适用于光源顶点基于世界空间的场景,例如 [着色器代码示例](/docs/ltclight/sample#shader-代码示例) 中的激光束效果。

content.zh/docs/ltclight/light_types/linear_light.md

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,32 @@
22
title: 线光源
33
---
44

5-
### 线性光源的专属属性
6-
| 属性名称 | 描述 |
7-
| ------------------- | ---------------------------------------------------------------------------------- |
8-
| Range(范围) | 胶囊体的范围,定义胶囊两端半球的半径和中间圆柱的长度,胶囊体外部区域不受该光源影响 |
9-
| Start Point(起点) | 线性光源的起点,即胶囊体一端半球的球心 |
10-
| End Point(终点) | 线性光源的终点,即胶囊体另一端半球的球心 |
11-
| Radius(半径) |**Range(范围)** 无关,仅表示线性光源的“粗细”,数值越大,光源看起来越亮 |
12-
13-
---
5+
## 线光源
6+
7+
线光源用于模拟呈线条形态的光线,例如激光束、光剑、光带等。
8+
9+
其形态与多边形光源略有区别,线光源的形态仅由两点决定:起点和终点,光照范围呈胶囊状。
10+
11+
{{<image src="/imgs/tube_type.png" alt="tube light" title="tube light">}}
12+
13+
### 属性说明
14+
15+
**`Range(照射范围)`**
16+
17+
胶囊状区域的半径,决定了两端半球与中间柱体的半径大小,胶囊区域外的范围不会被照亮。
18+
19+
{{<image src="/imgs/tube_range.gif" alt="tube range" title="tube range">}}
20+
21+
**`Start Point(起点)`**
22+
23+
线光源的起始端点,同时也是起始端半球的球心。
24+
25+
**`End Point(终点)`**
26+
27+
线光源的终止端点,同时也是终止端半球的球心。
28+
29+
**`Radius(光源半径)`**
30+
31+
**照射范围(Range)** 无关联,指的是线光源本身的粗细,光源越粗,亮度越高。
32+
33+
{{<image src="/imgs/tube_radius.gif" alt="linear light radius" alt="linear light radius">}}

content.zh/docs/ltclight/light_types/polygon_light.md

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,50 @@ title: 多边形光源
33
weight: 1
44
---
55

6-
### 多边形光源的专用属性
7-
| 属性名称 | 描述 |
8-
| --------------------------- | ---------------------------------------------------------------------------- |
9-
| Range(范围) | 包围球的半径,球外区域不受该光源影响 |
10-
| Double Sided(双面发光) | 多边形光源是否对正反两侧物体的都产生光照效果 |
11-
| PolygonPoints(多边形顶点) | 自定义多边形形状的顶点数据,顶点需构成以原点为中心的 2D 多边形 |
12-
| Preset(预设形状) | 提供五边形、六边形等预设多边形形状,仅为编辑器内便捷操作设计,运行时无此属性 |
6+
## 多边形光源
137

14-
---
8+
多边形光源适用于模拟单色面光源,例如室内场景的窗户、室外的自发光造型等。
9+
10+
{{< image src="/imgs/polygon_type.png" alt="Polygon Light" title="Polygon Light" loading="lazy" >}}
11+
12+
多边形光源的形状由一组多边形顶点定义,你可以使用预设多边形来修改其形状。
13+
14+
{{< image src="/imgs/polygon_preset.png" alt="preset polygon" title="preset polygon" loading="lazy">}}
15+
16+
也可以为其自定义形状。
17+
18+
{{< image src="/imgs/customize_polygon.png" alt="customize polygon" title="customize polygon" loading="lazy">}}
19+
20+
> [!CAUTION]
21+
> 多边形形状的中心应与transform 一致。
22+
23+
> [!CAUTION]
24+
> 建议设置的多边形顶点为共面的(即二维多边形)。
25+
26+
### 属性说明
27+
28+
**`Range(范围)`**
29+
30+
指包围球的半径,球体范围外的区域不会被该光源照亮。
31+
32+
{{< image src="/imgs/polygon_range.png" title="polygon range" alt="polygon range" loading="lazy">}}
33+
34+
**`Double Sided(双面发光)`**
35+
36+
启用双面发光的光源会同时照亮多边形的正面和背面;若不启用,则仅正面会被照亮。
37+
38+
{{< image src="/imgs/polygon_double_sided.png" alt="double sided" title="double sided" loading="lazy">}}
39+
40+
**`PolygonPoints(多边形顶点)`**
41+
42+
你可以为该属性指定一组自定义多边形的顶点数据,这些顶点需构成二维多边形,且中心要与变换位置重合。
43+
44+
> [!INFO]
45+
> 正面方向向量 {{< katex >}}\vec {f}{{< /katex >}} 由中心点 {{< katex >}} o {{< /katex >}}(若使用世界坐标则为原点,否则为 transform 位置)和多边形顶点计算得出。其中 {{< katex >}} a {{< /katex >}} 和 {{< katex >}} b {{< /katex >}} 是多边形上两个连续的顶点。
46+
计算公式:
47+
>
48+
> {{<katex>}}\vec {f}=\vec {oa} \times \vec {ob} {{< /katex >}}
49+
50+
**`Preset(预设形状)`**
51+
52+
包含多种预设多边形形状,如五边形、六边形等。该属性是为了方便操作而设计的编辑器专属属性,在运行时不可使用。

0 commit comments

Comments
 (0)