如何在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
相关产品推荐
相关产品推荐

