builtinAOContext
builtinAOContext
一个辅助函数,用于为某段节点图声明一个内置的环境光遮蔽(Ambient Occlusion, AO)上下文。它通过 context() 将传入的 aoNode 挂接到渲染管线的 getAO 钩子上,让 AO 自动参与后续的光照计算。
核心优势
在不入侵现有着色器逻辑的前提下,为整段节点图统一注入 AO:如果已经存在 AO 输入,则自动与之相乘;如果没有,则直接使用传入的 aoNode。同时会对 transparent=true 的材质自动跳过 AO,避免玻璃、粒子等透明对象被不合理地变暗。
常见用途
将烘焙 AO 贴图或屏幕空间 AO(SSAO 等)的结果注入标准 PBR 光照模型,而无需在每个材质中手动编写乘法逻辑。
只对特定对象或特定节点树启用 AO,例如:包裹某个角色的光照节点,而不影响 UI 或特效几何。
在已有 AO 管线的基础上叠加额外的程序化 AO(如按照高度、曲率或噪声增加局部暗角)。
在 LookDev 阶段快速切换或对比不同 AO 源(不同 AO 贴图或不同强度曲线),通过替换 aoNode 即可。
如何调整
builtinAOContext 本身没有可调属性,它的行为完全由传入的 aoNode 和 node 决定。一般建议:1)保证 aoNode 在 0~1 范围内,1 为完全不遮蔽,0 为完全遮蔽;2)通过 pow、mix、smoothstep 等对 aoNode 做曲线调整,避免 AO 过黑;3)根据需求选择第二个参数 node:通常将完整的光照/材质节点图作为 node 传入,这样 AO 只会作用在这段图上;如果不传则使用默认上下文,适合在更高层做统一封装。透明材质(material.transparent=true)会被自动跳过,不需要额外判断。
代码示例
1// 1. 定义一个 0~1 的 AO 节点(值越小代表遮蔽越强)
2const ao = texture( aoMap ).g.oneMinus();
3
4// 2. 任意一段需要应用 AO 的光照 / 材质节点图
5const shaded = someLightingNode;
6
7// 3. 用 builtinAOContext 为这段节点图声明“内置 AO 上下文”
8const shadedWithAO = builtinAOContext( ao, shaded );
9
10// 4. 将其作为最终颜色输出使用(示例)
11material.colorNode = shadedWithAO;