【Unity高级】如何获取着色器(Shader)的关键词

news2025/2/24 12:02:18

在动态设置Shader时,会需要通过EnableKeyword, DisableKeyword来完成。但一个Shader有哪些关键词呢?Unity的文档中并没有列出来,但我们可以通过遍历Shader的KeywordSpace来查看。

1. 代码如下

using UnityEngine;

public class KeywordExample : MonoBehaviour
{
    public Material material;

    void Start()
    {
        CheckShaderKeywordState();
    }

    void CheckShaderKeywordState()
    {
        // 获取材质所使用的着色器类实例
        var shader = material.shader;

        // 获取影响着色器的所有本地关键字
        var keywordSpace = shader.keywordSpace;

        // 遍历所有本地关键字
        foreach (var localKeyword in keywordSpace.keywords)
        {
            // 如果本地关键字是可覆盖的,
            // 并且存在同名的全局关键字且已启用,
            // 那么 Unity 将使用全局关键字的状态
            if (localKeyword.isOverridable && Shader.IsKeywordEnabled(localKeyword.name))
            {
                Debug.Log("Local keyword with name of " + localKeyword.name + " is overridden by a global keyword, and is enabled");
                // 翻译:
                Debug.Log("名为 " + localKeyword.name + " 的本地关键字被全局关键字覆盖,并且已启用");
            }
            else
            {
                var state = material.IsKeywordEnabled(localKeyword) ? "enabled" : "disabled";
                Debug.Log("Local keyword with name of " + localKeyword.name + " is " + state);
                // 翻译:
                Debug.Log("名为 " + localKeyword.name + " 的本地关键字状态为 " + state);
            }
        }
    }
}

2. 代码说明

这段代码主要用来检查材质(Material)所使用的着色器(Shader)中本地关键字(Local Keyword)的状态,以及是否被全局关键字(Global Keyword)覆盖。以下是详细说明:

背景知识
  • 关键字(Keywords)
    • Unity 中的 Shader 系统可以通过启用或禁用关键字来控制着色器的功能,比如切换效果、动态优化等。
    • 有两种关键字:本地关键字(Local Keyword)和全局关键字(Global Keyword)。
      • 本地关键字:特定于某个着色器或材质的关键字。
      • 全局关键字:作用于整个应用程序的关键字。
    • 如果本地关键字是可覆盖的(isOverridable),Unity 会优先考虑全局关键字的状态。

代码解析
  1. 获取材质的着色器实例

    var shader = material.shader;
    

    从材质中获取所使用的着色器。

  2. 获取关键字空间(keywordSpace

    var keywordSpace = shader.keywordSpace;
    

    获取此着色器所有相关的本地关键字。

  3. 遍历所有关键字

    foreach (var localKeyword in keywordSpace.keywords)
    

    遍历关键字空间中的所有本地关键字。

  4. 判断关键字是否被全局关键字覆盖

    if (localKeyword.isOverridable && Shader.IsKeywordEnabled(localKeyword.name))
    

    检查:

    • 当前关键字是否是可覆盖的(isOverridable)。
    • 如果全局关键字(Global Keyword)中存在同名关键字并启用了它(Shader.IsKeywordEnabled),本地关键字将被覆盖。

    如果条件满足:

    Debug.Log("名为 " + localKeyword.name + " 的本地关键字被全局关键字覆盖,并且已启用");
    
  5. 输出本地关键字状态
    如果关键字未被全局覆盖,输出它的启用状态:

    var state = material.IsKeywordEnabled(localKeyword) ? "enabled" : "disabled";
    Debug.Log("名为 " + localKeyword.name + " 的本地关键字状态为 " + state);
    

用途
  • 调试:可以用来了解某个材质的关键字状态,尤其是在优化或切换着色器功能时。
  • 开发辅助:帮助开发者清晰了解全局与本地关键字的优先级以及当前生效的关键字。
  • 着色器优化:检查是否有多余或冲突的关键字,减少 GPU 负担。

比如,我们用上面的方法,查看URP默认的Lit材质(透明模式)时,得到下面的关键词。与不透明模式对比,会发现标黄部分的关键词状态有变化。
在这里插入图片描述

参考:https://docs.unity3d.com/ScriptReference/Shader-keywordSpace.html

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

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

相关文章

针对边缘计算优化LoRa的TinyML信道跳变管道

论文标题:Optimizing LoRa for Edge Computing with TinyML Pipeline for Channel Hopping(针对边缘计算优化LoRa的TinyML信道跳变管道) 作者信息:Marla Grunewald, Mounir Bensalem 和 Admela Jukan,来自德国布伦瑞克…

使用AI工具Screenshot to Code将UI设计图翻译成代码

一、获取openAI apikey。 一般有两种方式,一种是到openAI官网注册账号,付费申请GPT4的apikey。另一种是某宝买代理。我这里采用第二种。 二、安装Screenshot to Code 1.到github下载源码。 2.启动,两种方式:源码启动和docker启动…

python学opencv|读取图像(三)放大和缩小图像

【1】引言 前序已经学习了常规的图像读取操作和图像保存技巧,相关文章链接为: python学opencv|读取图像-CSDN博客 python学opencv|读取图像(二)保存彩色图像-CSDN博客 今天我们更近一步,学习放大和缩小图像的技巧&…

【vue2自定义指令】v-disabled 实现el-switch,el-button等elementUI禁用(disabled)效果

如果你搜过类似的功能,肯定看到过千篇一律的 // 实现按钮禁用el.disabled true// 增加 elementUI 的禁用样式类el.classList.add(is-disabled)但是这个方案明显对el-switch,不起作用,所以我这边直接把方案贴出来,不想了解具体原理…

烟草行业通过Profinet转EthernetIP网关打通数据壁垒

在工业自动化领域,Profinet转Ethernet/IP是两种广泛应用的工业以太网协议。它们各自具有独特的特点和优势,而在实际应用中,经常需要实现这两种协议之间的互通,这时就需要使用到开疆智能Profinet转Ethernet/IP网关KJ-EIP-108。同时…

C++内存布局以及常用关键字

C内存布局以及常用关键字 C的内存空间 代码存储区域:常量区、代码区、静态区(全局区)、堆区、栈区 栈区向下增长,堆区向上增长。栈由系统管理,没有内存碎片,每个元素之间都是连续的,大小比较…

插入排序⁻⁻⁻⁻直接插入排序希尔排序

引言 所谓的排序,就是使一串记录按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 常见的排序算法有: 今天我们主要学习插入排序的直接插入排序和希尔排序。 直接插入排序 什么是直接插入排序? 直接插入排序其…

Python实现中国象棋

探索中国象棋 Python 代码实现:从规则逻辑到游戏呈现 中国象棋,这款源远流长的棋类游戏,承载着深厚的文化底蕴与策略智慧。如今,借助 Python 与 Pygame 库,我们能够在数字世界中复刻其魅力,深入探究代码背后…

2024年12月6日Github流行趋势

项目名称:lobe-chat 项目维护者:arvinxx, semantic-release-bot, canisminor1990, lobehubbot, renovate项目介绍:一个开源的现代化设计的人工智能聊天框架。支持多AI供应商(OpenAI / Claude 3 / Gemini / Ollama / Qwen / DeepSe…

FastAPI 响应状态码:管理和自定义 HTTP Status Code

FastAPI 响应状态码:管理和自定义 HTTP Status Code 本文介绍了如何在 FastAPI 中声明、使用和修改 HTTP 状态码,涵盖了常见的 HTTP 状态码分类,如信息响应(1xx)、成功状态(2xx)、客户端错误&a…

AWS 机器学习,推动 AI 技术的健康发展

目录 一、AI 正在改变生产方式二、从炒作走向务实1、选对场景2、重视数据3、产品思维4、持续优化 三、人才是最稀缺的资源四、负责任的 AI 开发五、未来已来六、启示与思考七、结语 如果说传统软件开发是手工作坊,那么 AI 就像工业革命带来的机器生产。 在最新的一…

OceanBase 的探索与实践

作者:来自 vivo 互联网数据库团队- Xu Shaohui 本文总结了目前我们遇到的痛点问题并通过 OceanBase 的技术方案解决了这些痛点问题,完整的描述了 OceanBase 的实施落地,通过迁移到 OceanBase 实践案例中遇到的问题与解决方案让大家能更好的了…

Nginx安装和配置详解

1.Nginx的安装 1.1运行以下脚本安装 yum install yum-utils -y rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm# 查看所有可安装nginx版本 yum --showduplicates list available nginx yum install nginx-1.24.0 -y …

up主亲测,ToDesk/青椒云/顺网云这三款云电脑玩转AIGC场景

文章目录 1. 前言2. 云电脑性能分析3. 基础硬件数据3.1 硬件配置3.2 AI 评测跑分 4. 云电脑 AIGC 上手实测4.1 ToDesk4.1.1 AIGC 技术集成情况4.1.2 界面及功能4.1.3 项目部署4.1.4 黑神话悟空 AI 换脸4.1.6 AIGC 文生图体验 4.2 青椒云4.2.1 AIGC 技术集成情况4.2.2 界面及功能…

ARM架构-Cache的底层原理

在主存与处理器之间加入一个小容量的存储器保存 CPU 最近一段时间内的历史访问数据,将在 CPU 发起访问的时候优先提供数据快速访问,这个介于 CPU 与主存储器之间的小容量高速存储空间我们称之为 Cache,即高速缓存。Cache 作为处理器与主存之间…

Codeforces Round 991 (Div. 3) F. Maximum modulo equality(区间gcd模板)

思路&#xff1a;我们由题意可以知道我们只需要维护区间gcd即可&#xff0c;因为差分一下后&#xff0c;维护的差分数组的区间gcd即为原数组所要求的值 线段树维护 #include<bits/stdc.h>using namespace std;typedef long long ll; typedef pair<ll, ll>PII; co…

树与图深度优先遍历——acwing

题目一&#xff1a;树的重心 846. 树的重心 - AcWing题库 分析 采用暴力枚举&#xff0c;试探每个点&#xff0c;除去之后&#xff0c;连通分量最大值是多少&#xff0c; 各个点的最大值找最小的 因为可以通过 dfs 来得到 根u以下点数&#xff0c;以及可以求各分树的点数&am…

消息中间件-Kafka3-kafkaJavaClient小例

消息中间件-Kafka3-kafkaJavaClient小例 Kafak Java Client private static final String KAFKA_TOPIC "kafak-test";private static String bootstrapServers "localhost:9092";private static AdminClient client null;static {Properties config n…

团队管理中如何做好目标管理

团队管理中的目标管理是确保团队高效运行的核心要素之一。 在目标管理中&#xff0c;清晰的目标设定、合理的资源分配、实时的跟踪与反馈机制是成功的关键。首先&#xff0c;设定SMART目标&#xff08;具体、可衡量、可达成、相关性强、时间限定&#xff09;能够有效聚焦团队的…

【QT】一个简单的串口通信小工具(QSerialPort实现)

目录 0.简介 1.展示结果 1&#xff09;UI界面&#xff1a; 2&#xff09;SSCOM&#xff08;模拟下位机收发&#xff09;&#xff1a; 3&#xff09;VSPD虚拟串口驱动&#xff08;连接上位机和下位机的串口&#xff09;&#xff1a; 4&#xff09;实际收发消息效果及视频演…