mx_heighttonormal
mx_heighttonormal
将高度信号转换为法线向量的便捷函数。内部先将输入强制为 vec3,再将强度强制为 float,并调用 bumpMap 完成法线扰动。
核心优势
一行替代手写流程:类型安全封装 + 直接复用 bumpMap 的数值实现,快速把高度图或程序化高度接到材质法线。
常见用途
从灰度高度图即时生成法线细节(无需离线烘焙法线贴图)。
把程序化噪声当高度场转为法线,用于水面、岩石、皮革等微细结构。
只有高度数据的工作流里,作为 normalMap 的轻量替代或补充。
与现有法线贴图混合,动态增强或减弱凹凸感。
如何调整
核心是调整 scale:正值更“鼓”,负值更“凹”;绝对值越大,法线扰动越强。输入可为 float/vecN,节点会转为 vec3 再传递给 bumpMap。若高度来自彩色纹理,建议先取单通道或用 grayscale() 得到稳定亮度。需要与现有 normalMap 混合时,用 mix(normalMap(...), mx_heighttonormal(...), mask) 控制权重。材料接线口为 material.normalNode。
代码示例
1<mesh>
2 <sphereGeometry args={[0.4, 128, 128]} />
3 {/* 将高度贴图转换为法线并赋给材质 */}
4 <meshStandardNodeMaterial
5 normalNode={mx_heighttonormal( texture(heightMap).r, float(0.75) )}
6 />
7</mesh>
8
9// JS 用法(等价):
10const n = mx_heighttonormal( texture( heightMap ).r, 0.75 );
11material.normalNode = n; // 通过 normalNode 接入材质法线输入