You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Unity Shader Graph自定义函数节点中使用URP采样缓冲区

在URP自定义函数节点中采样World Space法线缓冲区

我需要在一系列UV范围内,从URP采样缓冲区中采样World Space法线(NormalWorld)源缓冲区。为简化操作,希望在自定义函数节点中遍历该UV范围,但不清楚如何在此节点内实现NormalWorld的采样。


参考:场景深度的采样实现

对比官方提供的场景深度采样方式,以下是实现示例:

官方实现代码:

void Unity_SceneDepth_Raw_float(float4 UV, out float Out) {
    Out = SHADERGRAPH_SAMPLE_SCENE_DEPTH(UV);
}

自定义函数节点中的等效实现:

void myCustomDepth_float(float2 uv, out float depth) {
    depth = SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv);
}

场景深度节点与自定义函数节点结果一致


需求:自定义函数节点中采样World Space法线

目前URP采样缓冲区的相关文档缺失,需要找到在自定义函数节点中采样NormalWorld的等效代码,待实现的模板如下:

void myCustomNormalWorld_float4(float2 uv, out float4 normalWorld) {
    normalWorld = ...?
}

实现代码缺失


解决方案

在URP的ShaderGraph环境中,采样World Space法线缓冲区可以通过SHADERGRAPH_SAMPLE_TEXTURE宏结合内置的法线纹理实现,具体代码如下:

void myCustomNormalWorld_float4(float2 uv, out float4 normalWorld) {
    // 采样URP内置的World Space法线纹理
    normalWorld = SHADERGRAPH_SAMPLE_TEXTURE(_CameraNormalsTexture, sampler_CameraNormalsTexture, uv);
    // 将存储在[0,1]范围的法线还原为标准[-1,1]空间
    normalWorld.xyz = normalWorld.xyz * 2.0 - 1.0;
    normalWorld.w = 1.0;
}

关键说明:

  • _CameraNormalsTexture是URP内置的World Space法线纹理名称,对应的采样器为sampler_CameraNormalsTexture
  • URP会将法线数据压缩到[0,1]范围存储,因此必须通过*2.0 - 1.0转换回标准的法线空间
  • 确保你的URP渲染管线配置中已启用Depth and Normals通道,否则无法采样到法线缓冲区

内容的提问来源于stack exchange,提问作者BlueBossa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:12:14