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 优化是非常有必要的

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全(零基础)自学

一、网络安全基础知识 1.计算机基础知识 了解了计算机的硬件、软件、操作系统和网络结构等基础知识&#xff0c;可以帮助您更好地理解网络安全的概念和技术。 2.网络基础知识 了解了网络的结构、协议、服务和安全问题&#xff0c;可以帮助您更好地解决网络安全的原理和技术…

新的恶意软件 WikiLoader 针对意大利组织

研究人员发现了一种新的恶意软件&#xff0c;名为 WikiLoader 恶意软件。之所以这样命名&#xff0c;是因为它向维基百科发出请求&#xff0c;希望得到内容中包含 "The Free "字符串的响应。 WikiLoader 恶意软件的主要目标是意大利企业及组织。 WikiLoader 是一种…

首页和图表的定制

首页就是刚刚那些在静态资源扫描文件下叫 index.html 的文件 头像

wolfSSL5.6.3 虚拟机ubuntu下编译运行记录(踩坑填坑)

网上相关教程很多(包括wolfSSL提供的手册上也是如此大而化之的描述)&#xff0c;大多类似如下步骤&#xff1a; ./configure //如果有特殊的要求的话可以在后面接上对应的语句&#xff0c;比如安装目录、打开或关闭哪些功能等等 make make install 然后结束&#xff0c;大体…

OpenMMLab MMDetectionV3.1.0-SAM(环境安装、模型测试、训练以及模型后处理工具)

OpenMMLab Playground 概况 当前通用目标检测的研究方向正在朝着大型多模态模型发展。除了图像输入之外&#xff0c;最近的研究成果还结合了文本模式来提高性能。添加文本模态后&#xff0c;通用检测算法的一些非常好的属性开始出现&#xff0c;例如&#xff1a; 可以利用大量…

UniPro助力金融企业数字化转型 强化项目协作与跟踪

根据一份来自Standish Group的研究报告&#xff08;"CHAOS Report"&#xff09;&#xff0c;该报告对美国各行业的项目进行了调查&#xff0c;结果显示仅有不到一半&#xff08;约44%&#xff09;的项目能够成功按时完成&#xff0c;并达到预期的业务目标。其中&…

短视频矩阵营销系统技术开发者开发笔记分享

一、开发短视频seo抖音矩阵系统需要遵循以下步骤&#xff1a; 1. 确定系统需求&#xff1a;根据客户的需求&#xff0c;确定系统的功能和特点&#xff0c;例如用户注册登录、视频上传、视频浏览、评论点赞等。 2. 设计系统架构&#xff1a;根据系统需求&#xff0c;设计系统的…

【uniapp】【Vue3】 超简单全局自定义弹窗组件Modal

Element-Plus 自动引入&#xff0c;Icon图标不显示 //这样写是不会显示的 <el-icon size"20"><view /> </el-icon>// 应该这样写 <el-icon size"20"><i-ep-view/> </el-icon>// 或 <i-ep-view/>这个名字怎么去…

Jenkins 自动化部署实例讲解,另附安装教程!

【2023】Jenkins入门与安装_jenkins最新版本_丶重明的博客-CSDN博客 也可以结合这个互补看 前言 你平常在做自己的项目时&#xff0c;是否有过部署项目太麻烦的想法&#xff1f;如果你是单体项目&#xff0c;可能没什么感触&#xff0c;但如果你是微服务项目&#xff0c;相…

改进的智能优化算法定性分析:收敛行为分析(Analysis of the convergence behavior )

目录 一、智能优化算法改进收敛行为分析运行结果 二、收敛性分析 三、GWO1在F1收敛性运行结果 四、改进灰狼算法GWO1 五、代码获取 一、智能优化算法改进收敛行为分析运行结果 本文以改进的灰狼算法 GWO1 为例&#xff0c;在 CEC2005 测试函数上进行定性分析实验。 F1:…

SpringBoot之Actuator基本使用

SpringBoot之Actuator基本使用 引入分类常用接口含义healthbeansconditionsheapdumpmappingsthreaddumploggersmetrics 引入 <!-- actuator start--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…

大麦订单生成器 大麦订单购买截图生成

后台一键生成链接&#xff0c;独立后台管理 教程&#xff1a;修改数据库config/Conn.php 不会可以看源码里有教程 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

企业邮箱费用详解!了解企业邮箱的费用及其相关信息

对于需要可靠的邮箱平台的企业来说&#xff0c;企业邮箱可能是最好的解决方案。有许多供应商提供企业邮箱服务&#xff0c;他们通常每月都有相应的费用。 在考虑企业邮箱的成本时&#xff0c;有几件事要记住。首先&#xff0c;您应该考虑使用邮箱服务的用户数量&#xff0c;因为…

✅1本期刊发生变动,EI期刊目录更新!

【SciencePub学术】继上次更新后一个月&#xff0c;爱思唯尔&#xff08;Elsevier&#xff09;官网更新了EI Compendex收录期刊目录。本次更新EI期刊目录中&#xff0c;Serials&#xff08;连续出版/核心收录&#xff09;列表共收录期刊名称5347个&#xff0c;与上次更新相比&a…

java快速生成数据库表文档(HTML、DOC、MD)

在企业级开发中、我们经常会有编写数据库表结构文档的时间付出&#xff0c;关于数据库表结构文档状态&#xff1a;要么没有、要么有、但都是手写、后期运维开发&#xff0c;需要手动进行维护到文档中&#xff0c;很是繁琐&#xff0c;这里推荐一个开源项目&#xff1a;screw gi…

leetcode743. 网络延迟时间 floyd

https://leetcode.cn/problems/network-delay-time/ 有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 ui 是源节点&#xff0c;vi 是目标节点&#xff0c; wi 是一个信…

成都链安:7月区块链安全事件爆发式增长,导致损失超4.11亿美元

7月&#xff0c;各类安全事件数量及造成的损失较6月爆发式增长。7月发生较典型安全事件超36起&#xff0c;各类安全事件造成的损失总金额约4.11亿美元&#xff08;虚拟货币案件涉案金额除外&#xff09;&#xff0c;较6月上涨约321%。Rug Pull导致损失约2065万美元&#xff0c;…

Python模块psycopg2连接postgresql

目录 1. 基础语法 2. 基础用法 3. 多条SQL 4. 事务SQL 1. 基础语法 语法 psycopg2.connect(dsn #指定连接参数。可以使用参数形式或 DSN 形式指定。host #指定连接数据库的主机名。dbname #指定数据库名。user #指定连接数据库使用的用户名。…

探寻AI大模型平台之巅——文心千帆

目录 前言1. 何为文心千帆2. 核心亮点2.1 第三方大模型2.2 Prompt模板2.3 安全可靠 3. 一站式服务3.1 数据管理3.2 数据标注3.3 数据处理3.4 数据训练3.5 模型纳管3.5.1 模型评估3.5.2 模型压缩 3.6 服务发布 总结 前言 众多AI大模型不断涌现&#xff0c;一时不知如何挑选&…

Java 线程的生命周期和状态(实践加深理解)

一、常规回答&#xff08;八股文&#xff09; 线程的生命周期一共分为有6个状态&#xff0c;在某个时刻中&#xff0c;一个线程只会处在6个状态中的其中一种。 第1&#xff1a;初始状态&#xff08;NEW&#xff09; 当前的线程已经被创建了出来&#xff0c;但是还没有通过调用…