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.类的访问限定符及封装 ⭕访问限定符 🚩访问限定符解释说明 🚩struct 与 class 的区别 1. 默认访问级别: 2. 继承权限(默认的…...
DRS 迁移本地mysql 到华为云
准备工作: 源端的IP地址(公网),用户明和密码。如果通过公网迁移,需要在安全组放通drs访问源端数据库的3306端口。目标端的IP地址,用户名和密码。 创建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 中,props(属性)用于在组件之间传递数据。它是父组件向子组件传递信息的一种方式,通过 props,父组件可以向子组件传递数据、回调函数、配置项等。 注意: props 是只读的,它的值由父组件…...
Unity实现camera数据注入RMP推送或轻量级RTSP服务模块
技术背景 随着技术的不断进步和应用的不断深化,Unity3D VR应用的前景非常广阔,它广泛应用于教育、医疗、军事、工业设计、虚拟数字人等多个领域。 教育领域:Unity3D VR技术可以用来创建虚拟现实教室,让学生能够身临其境地体验课…...
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安卓实战项目(4)—提供给阿尔兹海默症患者的APP(源码在文末) 一.项目运行介绍 1.大致浏览 (1)开机界面 (2)主界面 (3)Read Instructions界面 &…...
详解Mybatis之自动映射 自定义映射问题
编译软件:IntelliJ IDEA 2019.2.4 x64 操作系统:win10 x64 位 家庭版 Maven版本:apache-maven-3.6.3 Mybatis版本:3.5.6 文章目录 一、Mybatis中的自动映射是什么?二、Mybatis中的自定义映射是什么?三、为什…...
shiro的优点
shiro是一个强大的java安全框架,它的优点有以下: shiro就是权限管理:包括两部分:身份验证、授权 一、它提供了身份验证、授权、密码和会话管理等功能,可以满足各种应用程序的安全需求。 身份认证就是:验证是…...
使用分布式HTTP代理爬虫实现数据抓取与分析的案例研究
在当今信息爆炸的时代,数据已经成为企业决策和发展的核心资源。然而,要获取大规模的数据并进行有效的分析是一项艰巨的任务。为了解决这一难题,我们进行了一项案例研究,通过使用分布式HTTP代理爬虫,实现数据抓取与分析…...
Linux操作系统运维常用集合
目录 1、服务器磁盘查询、管理常见命令: 2、Centos系统挂载移动硬盘或U盘 3、Linux系统磁盘管理方式 4、Linux系统下挂载磁盘格式详解 1、服务器磁盘查询、管理常见命令: 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 中国的国标:GB/T 1835-2006《系列1集…...
BurpSuite超详细安装教程-功能概述-配置-使用教程---(附下载链接)
一、介绍 BurpSuite是渗透测试、漏洞挖掘以及Web应用程序测试的最佳工具之一,是一款用于攻击web 应用程序的集成攻击测试平台,可以进行抓包、重放、爆破,包含许多工具,能处理对应的HTTP消息、持久性、认证、代理、日志、警报。 二…...
不同局域网下使用Python自带HTTP服务进行文件共享「端口映射」
文章目录 1. 前言2. 视频教程3. 本地文件服务器搭建3.1 python的安装和设置3.2 cpolar的安装和注册 4. 本地文件服务器的发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用,不仅在商业和办公场景有…...
产业大数据应用:洞察企业全维数据,提升企业监、管、服水平
在数字经济时代,数据已经成为重要的生产要素,数字化改革风生水起,在新一代科技革命、产业革命的背景下,产业大数据服务应运而生,为区域产业发展主导部门提供了企业洞察、监测、评估工具。能够助力区域全面了解企业经…...
【爬虫逆向案例】某名片网站 js 逆向 —— data解密
声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! 【爬虫逆向案例】某名片网站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(短信验证码小格子输入效果) 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name&qu…...
TRO组团和解中,快至1天谈好
以下案件组团和解中26-cv-269026-cv-315226-cv-046726-cv-287026-cv-192826-cv-180626-cv-304226-cv-2867...
Cursor AI 开发环境配置:告别依赖冲突,用 Conda 虚拟环境管理你的数据科学项目
Cursor AI 开发环境配置:告别依赖冲突,用 Conda 虚拟环境管理你的数据科学项目 在数据科学和机器学习项目的开发过程中,依赖管理一直是个令人头疼的问题。想象一下这样的场景:你正在开发一个基于TensorFlow 2.4的项目,…...
别再只测电压了!解锁杰理AC632蓝牙芯片ADC的隐藏玩法:电池检测与低功耗设计
杰理AC632蓝牙芯片ADC实战:电池检测与低功耗设计全解析 在蓝牙耳机、智能穿戴等电池供电设备的开发中,精准的电池电量监测和低功耗设计往往是决定产品成败的关键因素。杰理AC632作为一款广泛应用于消费电子领域的蓝牙芯片,其内置的ADC功能为开…...
除了重启,Win11任务栏卡死的深层原因与预防指南(附长期稳定运行配置建议)
Win11任务栏卡死的底层逻辑分析与系统健壮性优化指南 当Windows 11的任务栏突然失去响应,大多数用户的第一反应是重启资源管理器——这确实能快速解决问题,但就像用止痛药缓解头痛而不探究病因一样,治标不治本。作为一位经历过数十次类似故障…...
HardSourceWebpackPlugin插件生态:ExcludeModulePlugin和ParallelModulePlugin深度解析
HardSourceWebpackPlugin插件生态:ExcludeModulePlugin和ParallelModulePlugin深度解析 【免费下载链接】hard-source-webpack-plugin 项目地址: https://gitcode.com/gh_mirrors/ha/hard-source-webpack-plugin HardSourceWebpackPlugin是Webpack生态中一款…...
ai结对编程,让快马帮你自动生成openclaw多轮对话任务规划应用骨架
最近在开发一个基于OpenClaw的多轮对话任务规划应用时,发现这类项目往往需要处理大量重复性代码框架搭建工作。比如要同时兼顾意图识别、状态管理、API调用和结果生成等多个模块,光是初始化项目结构就得花上大半天。好在尝试了InsCode(快马)平台的AI辅助…...
OpenClaw浏览器自动化:Qwen3-14b_int4_awq实现智能爬虫
OpenClaw浏览器自动化:Qwen3-14b_int4_awq实现智能爬虫 1. 为什么需要智能爬虫? 上周我需要从几十个电商页面抓取产品参数,传统爬虫遇到三个致命问题:动态加载内容无法解析、反爬机制频繁拦截、非结构化数据难以提取。当我尝试用…...
新手零失败指南:基于快马ai详解android studio安装配置与第一个app运行
新手零失败指南:基于快马AI详解Android Studio安装配置与第一个APP运行 作为一个刚接触安卓开发的新手,第一次安装Android Studio时确实容易被各种概念和步骤搞晕。最近我在InsCode(快马)平台上发现他们的AI指导特别适合新手,能一步步拆解复…...
实战即用:通过快马ai快速构建配置完备的flask web api项目
最近在做一个前后端分离的小项目,需要快速搭建一个轻量级的Web API服务。之前每次新建项目都要手动配置Python环境、安装依赖,特别容易出错。这次尝试用InsCode(快马)平台来生成配置好的Flask项目,整个过程意外地顺畅。 环境配置一步到位 传统…...
炉石传说脚本终极指南:3小时变8分钟的智能游戏体验
炉石传说脚本终极指南:3小时变8分钟的智能游戏体验 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 还在为炉石传说每日任务耗费大量时间而烦…...
