shadergraph 视差贴图
时间: 2025-05-23 20:57:45 AIGC 浏览: 44
### 如何在 Shader Graph 中实现视差贴图效果
#### 1. 视差贴图简介
视差贴图是一种基于纹理的渲染技术,能够在不增加几何复杂度的情况下模拟物体表面的凹凸细节[^1]。与法线贴图相比,视差贴图不仅改变了光照的方向,还通过调整像素的位置来创建更真实的深度感。
#### 2. 准备工作
在 Unity 的 Shader Graph 中实现视差贴图之前,需要准备以下资源:
- **高度图 (Height Map)**:存储了表面深度信息的灰度图像。
- **基础材质纹理**:用于显示模型的基础颜色或其他属性。
- **Shader Graph 节点支持**:确保项目启用了 HDRP 或 URP 并安装了最新版本的 Shader Graph 工具包。
#### 3. 创建 Shader Graph
打开 Shader Graph 编辑器并新建一个 Unlit 或 Lit 类型的着色器图表。以下是具体操作:
##### 添加必要的输入节点
- 使用 `Texture2D` 节点加载高度图和基础材质纹理。
- 将 `Vector1` 节点设置为视差强度参数 (`Parallax Intensity`),允许动态调节深度效果。
##### 配置视差逻辑
Unity 提供了一个内置的 `Parallax Occlusion Mapping` 节点,可以直接用来实现高级别的视差映射功能。如果该节点不可用,则可以通过手动方式构建简单的视差偏移算法。
```csharp
// 手动计算视差偏移量
float parallaxOffset = tex2D(_HeightMap, IN.uv).r * _ParallaxIntensity;
float2 offsetUV = IN.viewDir.xy / length(IN.viewDir.xyz);
offsetUV *= parallaxOffset;
finalUV = IN.uv + offsetUV;
```
将上述代码片段转换成对应的 Shader Graph 连接结构如下:
- 计算当前片元的世界空间视线方向(World Space View Direction)。
- 对其进行标准化处理以获得单位向量。
- 结合高度值乘积生成最终 UV 偏移坐标。
##### 输出结果
最后一步是将经过视差修正后的 UV 应用于采样其他地图(如 Albedo 和 Normal),从而完成整个流程。
#### 4. 示例代码展示
下面是一个简化版的手写 HLSL 片段示例,便于理解核心原理:
```hlsl
half4 frag(v2f i) : SV_Target {
half depthSample = SAMPLE_TEXTURE2D(_HeightMap, sampler_HeightMap, i.uv).r;
float3 viewDir = normalize(i.worldPos - _WorldSpaceCameraPos);
float2 projCoord = viewDir.xy / abs(viewDir.z);
float heightDelta = (_HeightScale * (depthSample - 0.5));
float2 displacedTexcoord = i.texcoord + projCoord * heightDelta;
half4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, displacedTexcoord);
return col;
}
```
此脚本展示了如何读取高度数据以及应用基本投影运算得到新的纹理索引位置[^1]。
---
###
阅读全文
相关推荐



















