抓取屏幕内容和AlphaBlend都有渲染物体包含背景物体颜色的特点,不同的是,AlphaBlend渲染像素时,只能基于该像素的前一次DrawCall结果来混合,而抓取屏幕内容可以得到其他像素颜色,能做出扰动、折射之类的效果。

URP:Opaque Texture

Opaque Texture是URP管线在所有不透明(渲染队列)物体渲染完毕后Copy一张图片,供着色器采样屏幕画面。所以Opaque Texture只能抓取到不透明(渲染队列)物体,且只能在透明(渲染队列)物体中使用。

开启功能

在URP中,默认启用Opaque Texture,可在渲染管线资产中修改,还可以修改Opaque Texture的存储大小。

采样内容

法一:使用库函数

引入库 这个库文件很轻量,只有一个纹理、采样器声明和两个简单函数,可以放心使用。

HLSL
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl"
点击展开查看更多

采样内容

HLSL
float3 opaqueColor = SampleSceneColor(uv);
点击展开查看更多

法二:手动采样

声明纹理和采样器

HLSL
TEXTURE2D_X(_CameraOpaqueTexture);
SAMPLER(sampler_CameraOpaqueTexture);
点击展开查看更多

采样内容

HLSL
float4 opaqueColor = SAMPLE_TEXTURE2D_X(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, uv);
点击展开查看更多

Built-In:GrabPass

GrabPass的功能是在此物体DrawCall的前一次DrawCall时Blit一张图片,供着色器采样屏幕画面。

示例

SHADERLAB
    SubShader
    {
        GrabPass { "_Name" } // 声明
        Pass
        {
            HLSLPROGRAM
            sampler2D _Name; // 变量
            // ...
            half4 frag() : SV_TARGET {
                float4 ScreenColor = tex2D(_Name, UV); // 采样
            }
            ENDHLSL
        }
    }
点击展开查看更多

语法 & 规则

PLAINTEXT
GrabPass {}
GrabPass { "属性名" }
点击展开查看更多

版权声明

作者: Chaim

链接: https://chaim.eu.org/posts/%E6%8A%93%E5%8F%96%E5%B1%8F%E5%B9%95%E5%86%85%E5%AE%B9-opaque-texturegrabpass/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键