当前位置: 首页 > news >正文

Unity Shader - if 和 keyword 的指令比较

文章目录

  • 环境
  • TestingIf4Sample
    • unity shaderlab 中的 TestingIf4Sample.shader
    • graphics analyzer 中的 TestingIf4Sample.glsl
  • TestingKW4Sample
    • unity shaderlab 中的 TestingKW4Sample.shader
    • graphics analyzer 中的 TestingKW4Sample.glsl
  • 比较


环境

Unity : 2020.3.37f1
Pipeline : BRP


TestingIf4Sample

下面是 shaderlab 和 arm mobile studio 中的 graphics analyzer 的 glsl 代码


unity shaderlab 中的 TestingIf4Sample.shader

// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)Shader "TestingIf4Sample"
{Properties{_A_Tex ("A Texture", 2D) = "white" {}_B_Tex ("B Texture", 2D) = "white" {}_USE_TEX_A ("Using Tex A", Float) = 1.0}SubShader{Tags{"Queue"="Geometry""RenderType"="Opaque"}Pass{Name "Default"CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0#include "UnityCG.cginc"struct appdata_t{float4 vertex   : POSITION;float2 texcoord : TEXCOORD0;};struct v2f{float4 vertex   : SV_POSITION;float2 texcoord  : TEXCOORD0;};sampler2D _A_Tex;sampler2D _B_Tex;fixed _USE_TEX_A;v2f vert(appdata_t v){v2f OUT;float4 vPosition = UnityObjectToClipPos(v.vertex);OUT.vertex = vPosition;OUT.texcoord = v.texcoord.xy;return OUT;}fixed4 frag(v2f IN) : SV_Target{return _USE_TEX_A == 1.0 ? tex2D(_A_Tex, IN.texcoord) : tex2D(_B_Tex, IN.texcoord);}ENDCG}}
}

graphics analyzer 中的 TestingIf4Sample.glsl

VS

#version 320 esprecision highp float;
precision highp int;
#define HLSLCC_ENABLE_UNIFORM_BUFFERS 1
#if HLSLCC_ENABLE_UNIFORM_BUFFERS
#define UNITY_UNIFORM
#else
#define UNITY_UNIFORM uniform
#endif
#define UNITY_SUPPORTS_UNIFORM_LOCATION 1
#if UNITY_SUPPORTS_UNIFORM_LOCATION
#define UNITY_LOCATION(x) layout(location = x)
#define UNITY_BINDING(x) layout(binding = x, std140)
#else
#define UNITY_LOCATION(x)
#define UNITY_BINDING(x) layout(std140)
#endif
uniform 	mediump float _USE_TEX_A;
UNITY_LOCATION(0) uniform mediump sampler2D _A_Tex;
UNITY_LOCATION(1) uniform mediump sampler2D _B_Tex;
in highp vec2 vs_TEXCOORD0;
layout(location = 0) out mediump vec4 SV_Target0;
vec4 u_xlat0;
bool u_xlatb0;
vec4 u_xlat1;
vec4 u_xlat2;
void main()
{
#ifdef UNITY_ADRENO_ES3u_xlatb0 = !!(_USE_TEX_A==1.0);
#elseu_xlatb0 = _USE_TEX_A==1.0;
#endifu_xlat1 = texture(_A_Tex, vs_TEXCOORD0.xy);u_xlat2 = texture(_B_Tex, vs_TEXCOORD0.xy);u_xlat0 = (bool(u_xlatb0)) ? u_xlat1 : u_xlat2;SV_Target0 = u_xlat0;return;
}

FS

#version 320 esprecision highp float;
precision highp int;
#define HLSLCC_ENABLE_UNIFORM_BUFFERS 1
#if HLSLCC_ENABLE_UNIFORM_BUFFERS
#define UNITY_UNIFORM
#else
#define UNITY_UNIFORM uniform
#endif
#define UNITY_SUPPORTS_UNIFORM_LOCATION 1
#if UNITY_SUPPORTS_UNIFORM_LOCATION
#define UNITY_LOCATION(x) layout(location = x)
#define UNITY_BINDING(x) layout(binding = x, std140)
#else
#define UNITY_LOCATION(x)
#define UNITY_BINDING(x) layout(std140)
#endif
uniform 	mediump float _USE_TEX_A;
UNITY_LOCATION(0) uniform mediump sampler2D _A_Tex;
UNITY_LOCATION(1) uniform mediump sampler2D _B_Tex;
in highp vec2 vs_TEXCOORD0;
layout(location = 0) out mediump vec4 SV_Target0;
vec4 u_xlat0;
bool u_xlatb0;
vec4 u_xlat1;
vec4 u_xlat2;
void main()
{
#ifdef UNITY_ADRENO_ES3u_xlatb0 = !!(_USE_TEX_A==1.0);
#elseu_xlatb0 = _USE_TEX_A==1.0;
#endifu_xlat1 = texture(_A_Tex, vs_TEXCOORD0.xy);u_xlat2 = texture(_B_Tex, vs_TEXCOORD0.xy);u_xlat0 = (bool(u_xlatb0)) ? u_xlat1 : u_xlat2;SV_Target0 = u_xlat0;return;
}

TestingKW4Sample


下面是 shaderlab 和 glsl


unity shaderlab 中的 TestingKW4Sample.shader

// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)Shader "TestingKW4Sample"
{Properties{_A_Tex ("A Texture", 2D) = "white" {}_B_Tex ("B Texture", 2D) = "white" {}[Toggle(_USE_TEX_A)]_USE_TEX_A ("Using Tex A", Float) = 1.0}SubShader{Tags{"Queue"="Geometry""RenderType"="Opaque"}Pass{Name "Default"CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0#pragma multi_compile _ _USE_TEX_A#include "UnityCG.cginc"struct appdata_t{float4 vertex   : POSITION;float2 texcoord : TEXCOORD0;};struct v2f{float4 vertex   : SV_POSITION;float2 texcoord  : TEXCOORD0;};sampler2D _A_Tex;sampler2D _B_Tex;v2f vert(appdata_t v){v2f OUT;float4 vPosition = UnityObjectToClipPos(v.vertex);OUT.vertex = vPosition;OUT.texcoord = v.texcoord.xy;return OUT;}fixed4 frag(v2f IN) : SV_Target{#ifdef _USE_TEX_Areturn tex2D(_A_Tex, IN.texcoord);#elsereturn tex2D(_B_Tex, IN.texcoord);#endif}ENDCG}}
}

graphics analyzer 中的 TestingKW4Sample.glsl

VS: 和上面的一样,就不复制上来的
主要看 FS:

#version 320 esprecision highp float;
precision highp int;
#define UNITY_SUPPORTS_UNIFORM_LOCATION 1
#if UNITY_SUPPORTS_UNIFORM_LOCATION
#define UNITY_LOCATION(x) layout(location = x)
#define UNITY_BINDING(x) layout(binding = x, std140)
#else
#define UNITY_LOCATION(x)
#define UNITY_BINDING(x) layout(std140)
#endif
UNITY_LOCATION(0) uniform mediump sampler2D _A_Tex;
in highp vec2 vs_TEXCOORD0;
layout(location = 0) out mediump vec4 SV_Target0;
mediump vec4 u_xlat16_0;
void main()
{u_xlat16_0 = texture(_A_Tex, vs_TEXCOORD0.xy);SV_Target0 = u_xlat16_0;return;
}

比较

if 是指令实打实存在的
kw 原理是 macro 的 define,是在预编辑级别的分支,因此指令少一些也很正常

if 的推荐使用 记得是 if … else … 中 cycles 在 < 4 cycles 的,可以使用 if
否则还是使用 kw 的写法
下面的示例是 texture 的 sample,也就是 T unit 的采样

我印象中记得: (到时我再补回来,或是看到的大佬可以指导一下、分享一下资料)

  • register op: 1 cycles
  • sfu : 4~6 (忘记了)
  • texture sample : 300+ cyles

因此 T unit 优化是非常有必要的

在这里插入图片描述

相关文章:

Unity Shader - if 和 keyword 的指令比较

文章目录 环境TestingIf4Sampleunity shaderlab 中的 TestingIf4Sample.shadergraphics analyzer 中的 TestingIf4Sample.glsl TestingKW4Sampleunity shaderlab 中的 TestingKW4Sample.shadergraphics analyzer 中的 TestingKW4Sample.glsl 比较 环境 Unity : 2020.3.37f1 Pi…...

【C++入门到精通】C++入门 —— 类和对象(了解类和对象)

目录 一、类和对象的历史由来 二、面向过程和面向对象的初步认识 三、类 1.引子 2.类的定义 3.类的访问限定符及封装 ⭕访问限定符 &#x1f6a9;访问限定符解释说明 &#x1f6a9;struct 与 class 的区别 1. 默认访问级别&#xff1a; 2. 继承权限&#xff08;默认的…...

DRS 迁移本地mysql 到华为云

准备工作&#xff1a; 源端的IP地址&#xff08;公网&#xff09;&#xff0c;用户明和密码。如果通过公网迁移&#xff0c;需要在安全组放通drs访问源端数据库的3306端口。目标端的IP地址&#xff0c;用户名和密码。 创建DRS迁移任务 创建迁移任务 登录华为云控制台。单击管…...

腾讯云 Cloud Studio 实战训练营——快速构建React完成点餐H5页面

目录 ​编辑 一、前言 1、什么是腾讯云 Cloud Studio 2、本文实验介绍 二、前期准备工作 1、注册 Cloud Studio 2、初始化工作空间 三、开发一个简版的点餐系统页面 1、安装依赖 1.1、安装 antd-mobile 1.2、安装 less 和 less-loader 1.3、暴露 webpack 配置文件 …...

在 React 中,props(属性)用于在组件之间传递数据

在 React 中&#xff0c;props&#xff08;属性&#xff09;用于在组件之间传递数据。它是父组件向子组件传递信息的一种方式&#xff0c;通过 props&#xff0c;父组件可以向子组件传递数据、回调函数、配置项等。 注意&#xff1a; props 是只读的&#xff0c;它的值由父组件…...

Unity实现camera数据注入RMP推送或轻量级RTSP服务模块

技术背景 随着技术的不断进步和应用的不断深化&#xff0c;Unity3D VR应用的前景非常广阔&#xff0c;它广泛应用于教育、医疗、军事、工业设计、虚拟数字人等多个领域。 教育领域&#xff1a;Unity3D VR技术可以用来创建虚拟现实教室&#xff0c;让学生能够身临其境地体验课…...

CVPR2023新作:3D感知的AI换脸算法

Title: 3D-Aware Face Swapping (3D感知的人脸交换) Affiliation: 上海交通大学人工智能研究所 Authors: Yixuan Li, Chao Ma, Yichao Yan, Wenhan Zhu, Xiaokang Yang Keywords: Face swapping, 3D human faces, Generative Adversarial Network, geometry Summary: (1):…...

Android安卓实战项目(4)---提供给阿尔兹海默症患者的APP(源码在文末)

Android安卓实战项目&#xff08;4&#xff09;—提供给阿尔兹海默症患者的APP&#xff08;源码在文末&#xff09; 一.项目运行介绍 1.大致浏览 &#xff08;1&#xff09;开机界面 &#xff08;2&#xff09;主界面 &#xff08;3&#xff09;Read Instructions界面 &…...

详解Mybatis之自动映射 自定义映射问题

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 Mybatis版本&#xff1a;3.5.6 文章目录 一、Mybatis中的自动映射是什么&#xff1f;二、Mybatis中的自定义映射是什么&#xff1f;三、为什…...

shiro的优点

shiro是一个强大的java安全框架&#xff0c;它的优点有以下&#xff1a; shiro就是权限管理&#xff1a;包括两部分&#xff1a;身份验证、授权 一、它提供了身份验证、授权、密码和会话管理等功能&#xff0c;可以满足各种应用程序的安全需求。 身份认证就是&#xff1a;验证是…...

使用分布式HTTP代理爬虫实现数据抓取与分析的案例研究

在当今信息爆炸的时代&#xff0c;数据已经成为企业决策和发展的核心资源。然而&#xff0c;要获取大规模的数据并进行有效的分析是一项艰巨的任务。为了解决这一难题&#xff0c;我们进行了一项案例研究&#xff0c;通过使用分布式HTTP代理爬虫&#xff0c;实现数据抓取与分析…...

Linux操作系统运维常用集合

目录 1、服务器磁盘查询、管理常见命令&#xff1a; 2、Centos系统挂载移动硬盘或U盘 3、Linux系统磁盘管理方式 4、Linux系统下挂载磁盘格式详解 1、服务器磁盘查询、管理常见命令&#xff1a; lsblk      查看分区和磁盘df -h   …...

UE4/5C++多线程插件制作(十四、MTPAbandonable)

目录 MTPAbandonable h实现 cpp实现 MTPMarco.h 首先是异步任务的宏定义部分:...

集装箱装卸作业相关的知识-Part1

1.角件 Corner Fitting of Container or called Corner Casting. there are eigth of it of one container. 国家标准|GB/T 1835-2006https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcnoD35857F2200FA115CAA217A114F5EF12 中国的国标&#xff1a;GB/T 1835-2006《系列1集…...

BurpSuite超详细安装教程-功能概述-配置-使用教程---(附下载链接)

一、介绍 BurpSuite是渗透测试、漏洞挖掘以及Web应用程序测试的最佳工具之一&#xff0c;是一款用于攻击web 应用程序的集成攻击测试平台&#xff0c;可以进行抓包、重放、爆破&#xff0c;包含许多工具&#xff0c;能处理对应的HTTP消息、持久性、认证、代理、日志、警报。 二…...

不同局域网下使用Python自带HTTP服务进行文件共享「端口映射」

文章目录 1. 前言2. 视频教程3. 本地文件服务器搭建3.1 python的安装和设置3.2 cpolar的安装和注册 4. 本地文件服务器的发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用&#xff0c;不仅在商业和办公场景有…...

产业大数据应用:洞察企业全维数据,提升企业监、管、服水平

​在数字经济时代&#xff0c;数据已经成为重要的生产要素&#xff0c;数字化改革风生水起&#xff0c;在新一代科技革命、产业革命的背景下&#xff0c;产业大数据服务应运而生&#xff0c;为区域产业发展主导部门提供了企业洞察、监测、评估工具。能够助力区域全面了解企业经…...

【爬虫逆向案例】某名片网站 js 逆向 —— data解密

声明&#xff1a;本文只作学习研究&#xff0c;禁止用于非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01; 【爬虫逆向案例】某名片网站js逆向—— data解密 1、前言2、步骤3、号外 1、前言 相信各位小伙伴在写爬虫的…...

RocketMq 事务消息原理

Rocketmq 事务消息API使用 使用TransactionMQProducer类。 实现TransactionListener 接口覆盖其方法executeLocalTransaction和checkLocalTransaction 即可。 其中executeLocalTransaction 执行本地方法和checkLocalTransaction 事务状态回查。 玩法 简历一张本地事务表&…...

day41-Verify Account Ui(短信验证码小格子输入效果)

50 天学习 50 个项目 - HTMLCSS and JavaScript day41-Verify Account Ui&#xff08;短信验证码小格子输入效果&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name&qu…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

ui框架-文件列表展示

ui框架-文件列表展示 介绍 UI框架的文件列表展示组件&#xff0c;可以展示文件夹&#xff0c;支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项&#xff0c;适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...