游戏开发38课 unity 模板测试

news2024/11/15 11:03:35

ShaderLab 命令:模板

 

配置与 GPU 上的模板缓冲区相关的设置。

模板缓冲区为帧缓冲区中的每个像素存储一个 8 位整数值。为给定像素执行片元着色器之前,GPU 可以将模板缓冲区中的当前值与给定参考值进行比较。这称为模板测试。如果模板测试通过,则 GPU 会执行深度测试。如果模板测试失败,则 GPU 会跳过对该像素的其余处理。这意味着可以使用模板缓冲区作为遮罩来告知 GPU 要绘制的像素以及要丢弃的像素。

通常会将模板缓冲区用于特殊效果,例如门户或镜子。此外,在渲染硬阴影或者构造型实体几何 (CSG) 时,有时会使用模板缓冲区。

渲染管线兼容性

功能名称内置渲染管线通用渲染管线 (URP)高清渲染管线 (HDRP)自定义 SRP
模板

用法

此命令会更改渲染状态。在 Pass 代码块中使用它可为该通道设置渲染状态,或者在 SubShader 代码块中使用它可为该子着色器中的所有通道设置渲染状态。

You can use the Stencil command to do two different things: to configure the stencil test, and to configure what the GPU writes to the stencil buffer. You can do both of these things in the same command, but the most common use case is to create one Shader object that masks out areas of the screen that other Shader objects cannot draw to. To do this, you need to configure the first Shader object to always pass the stencil test and write to the stencil buffer, and configure the others to perform a stencil test and not write to the stencil buffer.

使用 RefReadMask 和 Comp 参数可配置模板测试。使用 RefWriteMaskPassFail 和 ZFail 参数可配置模板写入操作。

模板测试方程为:

(ref & readMask) comparisonFunction (stencilBufferValue & readMask)
签名示例语法功能
Stencil
{
    Ref <ref>
    ReadMask <readMask>
    WriteMask <writeMask>
    Comp <comparisonOperation>
    Pass <passOperation>
    Fail <failOperation>
    ZFail <zFailOperation>
    CompBack <comparisonOperationBack>
    PassBack <passOperationBack>
    FailBack <failOperationBack>
    ZFailBack <zFailOperationBack>
    CompFront <comparisonOperationFront>
    PassFront <passOperationFront>
    FailFront <failOperationFront>
    ZFailFront <zFailOperationFront>
}

请注意,所有参数都是可选的。
Stencil
{
    Ref 2
    Comp equal
    Pass keep
    ZFail decrWrap
}
根据给定参数配置模板缓冲区。

有效参数值

参数功能
ref整数。范围为 0 到 255。默认值为 0。参考值。

GPU 使用在 compareOperation 中定义的操作将模板缓冲区的当前内容与此值进行比较。

此值使用 readMask 或 writeMask 进行遮罩,具体取决于进行的是读取操作还是写入操作。

如果 Pass、Fail 或 ZFail 的值为 Replace,则 GPU 也可以将此值写入模板缓冲区。
readMask整数。范围为 0 到 255。默认值为 255。GPU 在执行模板测试时使用此值作为遮罩。

有关模板测试方程,请参阅上文。
writeMask整数。范围为 0 到 255。默认值为 255。GPU 在写入模板缓冲区时使用此值作为遮罩。

请注意,与其他遮罩一样,它指定操作中包含的位。例如,值为 0 表示写入操作中不包含任何位,而不是模板缓冲区接收值 0。
comparisonOperation比较操作。请参阅比较操作值以了解有效值。默认值为 Always。GPU 为所有像素的模板测试执行的操作。

这会定义适用于所有像素的操作,而与朝向无关。如果定义了此值以及 comparationOperationBack 和 comparationOperationFront,则此值会覆盖它们。
passOperation模板操作。请参阅模板操作值以了解有效值。默认值为 Keep。当像素通过模板测试和深度测试时,GPU 对模板缓冲区执行的操作。

这会定义适用于所有像素的操作,而与朝向无关。如果定义了此值以及 passOperationBack 和 passOperationFront,则此值会覆盖它们。
failOperation模板操作。请参阅模板操作值以了解有效值。默认值为 Keep。当像素未能通过模板测试时,GPU 对模板缓冲区执行的操作。

这会定义适用于所有像素的操作,而与朝向无关。如果定义了此值以及 failOperationBack 和 failOperationFront,则此值会覆盖它们。
zFailOperation模板操作。请参阅模板操作值以了解有效值。默认值为 Keep。当像素通过模板测试,但是未能通过深度测试时,GPU 对模板缓冲区执行的操作。

这会定义适用于所有像素的操作,而与朝向无关。如果定义了此值以及 zFailOperation 和 zFailOperation,则此值会覆盖它们。
comparisonOperationBack比较操作。请参阅比较操作值以了解有效值。默认值为 Always。GPU 为模板测试执行的操作。

这会定义仅适用于背面像素的操作。如果定义了 comparisonOperation,则该值会覆盖此值。
passOperationBack模板操作。请参阅模板操作值以了解有效值。默认值为 Keep。当像素通过模板测试和深度测试时,GPU 对模板缓冲区执行的操作。

这会定义仅适用于背面像素的操作。如果定义了 passOperation,则该值会覆盖此值。
failOperationBack模板操作。请参阅模板操作值以了解有效值。默认值为 Keep。当像素未能通过模板测试时,GPU 对模板缓冲区执行的操作。

这会定义仅适用于背面像素的操作。如果定义了 failOperation,则该值会覆盖此值。
zFailOperationBack模板操作。请参阅模板操作值以了解有效值。默认值为 Keep。当像素通过模板测试,但未能通过深度测试时,GPU 对模板缓冲区执行的操作。

这会定义仅适用于背面像素的操作。如果定义了 zFailOperation,则该值会覆盖此值。
comparisonOperationFront比较操作。请参阅比较操作值以了解有效值。默认值为 Always。GPU 为模板测试执行的操作。

这会定义仅适用于正面像素的操作。如果定义了 comparisonOperation,则该值会覆盖此值。
passOperationFront模板操作。请参阅模板操作值以了解有效值。默认值为 Keep。当像素通过模板测试和深度测试时,GPU 对模板缓冲区执行的操作。

这会定义仅适用于正面像素的操作。如果定义了 passOperation,则该值会覆盖此值。
failOperationFront模板操作。请参阅模板操作值以了解有效值。默认值为 Keep。当像素未能通过模板测试时,GPU 对模板缓冲区执行的操作。

这会定义仅适用于正面像素的操作。如果定义了 failOperation,则该值会覆盖此值。
zFailOperationFront模板操作。请参阅模板操作值以了解有效值。默认值为 Keep。当像素通过模板测试,但未能通过深度测试时,GPU 对模板缓冲区执行的操作。

这会定义仅适用于正面像素的操作。如果定义了 zFailOperation,则该值会覆盖此值。

比较操作值

在 C# 中,这些值通过 Rendering.CompareFunction 枚举进行表示。

Rendering.CompareFunction 枚举中的对应整数值功能
Never1从不渲染像素。
Less2在参考值小于模板缓冲区中的当前值时渲染像素。
Equal3在参考值等于模板缓冲区中的当前值时渲染像素。
LEqual4在参考值小于或等于模板缓冲区中的当前值时渲染像素。
Greater5在参考值大于模板缓冲区中的当前值时渲染像素。
NotEqual6在参考值与模板缓冲区中的当前值不同时渲染像素。
GEqual7在参考值大于或等于模板缓冲区中的当前值时渲染像素。
Always8始终渲染像素。

模板操作值

In C#, these values are represented by the Rendering.Rendering.StencilOp enum.

Rendering.StencilOp 枚举中的对应整数值功能
Keep0保持模板缓冲区的当前内容。
Zero1将 0 写入模板缓冲区。
Replace2将参考值写入缓冲区。
IncrSat3递增缓冲区中的当前值。如果该值已经是 255,则保持为 255。
DecrSat4递减缓冲区中的当前值。如果该值已经是 0,则保持为 0。
Invert5将缓冲区中当前值的所有位求反。
IncrWrap6递增缓冲区中的当前值。如果该值已经是 255,则变为 0。
DecrWrap7递减缓冲区中的当前值。如果该值已经是 0,则变为 255。

示例

Shader "Examples/CommandExample"
{
    SubShader
    {
         // 此处是定义子着色器的代码的其余部分。

        Pass
        {    
             // 此通道中的所有像素都会通过模板测试并将值 2 写入模板缓冲区
             // 如果要防止后续着色器绘制到渲染目标的此区域或将它们限制为仅渲染到此区域,则通常会执行此操作
             Stencil
             {
                 Ref 2
                 Comp Always
                 Pass Replace
             }            

             // 此处是定义通道的代码的其余部分。
        }
    }
}

此示例代码演示在 SubShader 代码块中使用此命令的语法。

Shader "Examples/CommandExample"
{
    SubShader
    {
             // 仅当模板缓冲区的当前值小于 2 时,此子着色器中的所有像素才通过模板测试
             // 如果希望仅绘制到渲染目标中未"遮罩"的区域,则通常会执行此操作
             Stencil
             {
                 Ref 2
                 Comp Less
             }  

         // 此处是定义子着色器的代码的其余部分。

        Pass
        {    
              // 此处是定义通道的代码的其余部分。
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/71336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

liunx如何重启mysql

Linux如何重启MySQL Linux中重启MySQL可以使用service mysql restart命令和脚本启动方式/etc/inint.d/mysql restart。 推荐&#xff1a;MySQL教程 其他命令如下&#xff1a; 一、 启动 1、使用 service 启动&#xff1a;service mysql start 2、使用 mysqld 脚本启动&am…

使用redis做分布式锁

思路步骤 获取锁, 使用 SETNX 命令设置一个key.如果没获取到&#xff0c;从新拿锁&#xff0c;返回步骤1 ; 从新拿锁可以设置等待时间;也可以记录拿锁次数为了做“避免死循环”.如果获取到&#xff0c;使用 EXPIRE 给锁加存活时间&#xff1b;接步骤3&#xff0c;执行业务&…

微机----------------中断控制器8259A(可编程的中断控制器)

目录 功能8259A的引脚8259A的工作方式中断响应顺序8259A的中断优先级管理8259A中断屏蔽管理⭐8259A的中断结束管理功能 ①单片825能管理8级中断,并且可级联管理64级 ②可对任一级中断单独屏蔽或允许 ③中断被响应后,可直接提供中断类型号 ④可通过编程选择其工作方式 IRR中断…

C++入门篇

入门C命名空间命名空间定义命名空间的使用C输入&#xff0c;输出缺省参数缺省参数概念缺省参数分类函数重载函数重载概念C支持函数重载的原因引用引用概念引用特性具体应用const修饰的常量进行引用&#xff08;常引用&#xff09;传值&#xff0c;传引用的效率引用和指针的区别…

【无标题】3 GENERIC语句 和 INTEGER类型

【VHDL】【作业】3 GENERIC语句 和 INTEGER类型 文章目录【VHDL】【作业】3 GENERIC语句 和 INTEGER类型前言什么是GENERIC语句&#xff1f;32位加法器仿真波形总结每天进步一点点 笔记仅供自学&#xff0c;用来回看复习&#xff0c;不一定适合你&#xff0c;如有错误请指出。前…

SpringBoot:概述

Spring Boot 是 Spring 开源组织下的子项目&#xff0c;是 Spring 组件一站式解决方案&#xff0c;主要是简化了使用 Spring 的难度&#xff0c;简省了繁重的配置&#xff0c;提供了各种启动器&#xff0c;开发者能快速上手。 &#xff5e; 本篇内容包括&#xff1a;Spring Boo…

[选型] 实时数仓之技术选型

数仓技术路线选型 对于已有的hive数据仓&#xff0c;怎样改造成实时数仓的要求呢&#xff1f; 2.关于实时数仓的选型 如果选择hbase&#xff0c;建议选择kudu 如果选择kudu, 还可以选择doris 如果选择doris&#xff0c;建议选择iceberg 以上三种选择&#xff0c;要配合具体…

C++实现身份证号码过滤与排序

1.描述 警察办案里检索到一批(n个)身份证号码&#xff0c;希望按出生日期对它们进行从大到小排序&#xff0c;如果有相同日期&#xff0c;则按身份证号码大小进行排序&#xff0c;如果是错误的身份证号&#xff0c;则从排序列表中删除(仅需判断前两位省级地区编码是否在下面的…

知识图谱-KGE-语义匹配-双线性模型-2016:NAM

【paper】 Probabilistic Reasoning via Deep Learning: Neural Association Models【简介】 本文是中科大和科大讯飞联合发表在 IJCAI 2016 上的工作&#xff0c;本文提出了 NAM&#xff08;Neural Association Model&#xff09;用于概率推理&#xff0c;并具体化为 DNN&…

十二月7号

一、uboot概念 1.1 uboot和bootloader关系 1.bootloader:是一系列引导加载程序的统称 boot:引导 loader&#xff1a;加载 2.uboot是引导加载程序中的一种 1.2 uboot特点 1.uboot是由德国DNEX小组进行维护的 2.uboot是一个开源分布式系统 3.uboot支持多种硬件架构平台(ARM/X8…

Blazor 部署 pdf.js 不能正确显示中文资源解决办法

原文链接 [https://www.cnblogs.com/densen2014/p/16964858.html] 在Blazor项目嵌入 pdf.js 时不能正确显示中文,浏览器F12显示如下错误 错误 l10n.js /web/locale/locale.properties not found. 我找到了解决方案。它不仅消除了上面提到的错误&#xff08;即 404 - locale.p…

nextjs13 webpack5 使用wasm报错

问题描述&#xff1a; 在next 13, webpack 5, react 18的项目中使用Rust编写的wasm报错&#xff1a; ./node_modules/image-map-path/image_map_path_bg.wasm Module parse failed: Unexpected character (1:0) The module seem to be a WebAssembly module, but module is n…

freemarker

文章目录创建项目引入依赖创建配置文件创建启动类和测试类语法listMapif运算符处理空值使用??指定缺失变量默认值内建函数集合长度数据类型布尔值时间类型数值类型字符串类型sequence序列类型hash类型常见指令assign自定义变量指令json转成对象实例list通过下标取值map取值通…

「Redis数据结构」集合对象(Set)

「Redis数据结构」集合对象&#xff08;Set&#xff09; 文章目录「Redis数据结构」集合对象&#xff08;Set&#xff09;一、概述二、结构三、编码转换四、小结一、概述 Set是Redis中的单列集合&#xff0c;其特点为不保证有序性、保证元素唯一、可以求交集、并集、差集。 从…

Python入门自学进阶-Web框架——28、DjangoAdmin项目应用-只读字段与后端表单验证

有时候&#xff0c;记录的某些字段在生成后就不允许再修改了&#xff0c;这时前端只能显示&#xff0c;不能修改。这时&#xff0c;可在AdminClass中进行设置&#xff1a;readonly_fields[字段名&#xff0c;字段名&#xff0c;。。。]&#xff0c;前端格式就显示成只显示不能修…

联想电脑怎么录屏?这3个方法,轻松解决

录屏是现在最常见的办公功能之一&#xff0c;最近有朋友问联想电脑怎么录屏。联想电脑是使用Windows系统的。如果想用联想电脑录屏&#xff0c;可以使用Windows系统自带了的录屏软件进行录屏。下面小编将详细的介绍3个方法&#xff0c;解决联想电脑怎么录屏的问题&#xff0c;感…

8086寻址方式图解

目录 1&#xff1a;立即寻址 2&#xff1a;寄存器寻址 3&#xff1a;直接寻址&#xff08;存储器直接寻址&#xff09; 4&#xff1a;寄存器间接寻址&#xff08;重点&#xff09; 5&#xff1a;基址寻址&#xff08;相对寻址&#xff09; 6&#xff1a;变址寻址 &#x…

后端程序员必备的Linux基础知识+常见命令(2023年最新版教程)

文章目录[1. 从认识操作系统开始](https://link.juejin.cn?targethttps%3A%2F%2Fsnailclimb.gitee.io%2Fjavaguide%2F%23%2Fdocs%2Foperating-system%2Flinux%3Fid%3D_1-%E4%BB%8E%E8%AE%A4%E8%AF%86%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%A7%8B)[1.1. 操作系统简…

【与达梦同行】数据库coredump的配置方式与截断测试

一、简述 Core的意思是内存, Dump的意思是扔出来, 堆出来.开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成。在国产操作系统麒麟V10中运维的时候&#xff0c;经常遇见一个问…

一、OpenAI ChatGPT 注册使用

文章目录注册购买openai的官网问题今天早上在sheep公众号里面看到了关于openai 旗下研发的chatgpt的产品&#xff0c;去到chatgpt的网页&#xff0c;我们可以看到他的标语。ChatGPT: Optimizing Language Models for Dialogue 哈哈&#xff0c;我百度了一下&#xff0c;大概意…