抓取屏幕内容和AlphaBlend都有渲染物体包含背景物体颜色的特点,不同的是,AlphaBlend渲染像素时,只能基于该像素的前一次DrawCall结果来混合,而抓取屏幕内容可以得到其他像素颜色,能做出扰动、折射之类的效果。
URP:Opaque Texture
Opaque Texture是URP管线在所有不透明(渲染队列)物体渲染完毕后Copy一张图片,供着色器采样屏幕画面。所以Opaque Texture只能抓取到不透明(渲染队列)物体,且只能在透明(渲染队列)物体中使用。
开启功能
在URP中,默认启用Opaque Texture,可在渲染管线资产中修改,还可以修改Opaque Texture的存储大小。
采样内容
法一:使用库函数
引入库 这个库文件很轻量,只有一个纹理、采样器声明和两个简单函数,可以放心使用。
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl"采样内容
float3 opaqueColor = SampleSceneColor(uv);法二:手动采样
声明纹理和采样器
TEXTURE2D_X(_CameraOpaqueTexture);
SAMPLER(sampler_CameraOpaqueTexture);采样内容
float4 opaqueColor = SAMPLE_TEXTURE2D_X(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, uv);Built-In:GrabPass
高性能消耗!
GrabPass的功能是在此物体DrawCall的前一次DrawCall时Blit一张图片,供着色器采样屏幕画面。
示例
SubShader
{
GrabPass { "_Name" } // 声明
Pass
{
HLSLPROGRAM
sampler2D _Name; // 变量
// ...
half4 frag() : SV_TARGET {
float4 ScreenColor = tex2D(_Name, UV); // 采样
}
ENDHLSL
}
}
语法 & 规则
GrabPass {}
GrabPass { "属性名" }
- 属性名需要与后面的
sampler2D变量名一致 - 属性名可以不填写,此时
sampler2D的变量名为_GrabTexture - 在不同的着色器中,相同属性名的GrabPass仅捕获一次,即其他着色器会直接使用最早捕获的相同属性名的GrabPass结果。(不填写除外)