Unity Shader - if 和 keyword 的指令比较

news2024/11/17 6:37:18

文章目录

  • 环境
  • 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 es

precision 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_ES3
    u_xlatb0 = !!(_USE_TEX_A==1.0);
#else
    u_xlatb0 = _USE_TEX_A==1.0;
#endif
    u_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 es

precision 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_ES3
    u_xlatb0 = !!(_USE_TEX_A==1.0);
#else
    u_xlatb0 = _USE_TEX_A==1.0;
#endif
    u_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_A
                    return tex2D(_A_Tex, IN.texcoord);
                #else
                    return tex2D(_B_Tex, IN.texcoord);
                #endif
            }
        ENDCG
        }
    }
}


graphics analyzer 中的 TestingKW4Sample.glsl

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

#version 320 es

precision 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.coloradmin.cn/o/799093.html

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

相关文章

gin框架内容(三)--中间件

gin框架内容&#xff08;三&#xff09;--中间件 Gin框架允许开发者在处理请求的过程中&#xff0c;加入用户自己的函数。这个函数就叫中间件&#xff0c;中间件适合处理一些公共的业务逻辑&#xff0c;比如登录认证、权限校验、数据分页、记录日志、耗时统计等 即比如&#x…

虚拟个家用服务器集群(2):PVE 系统安装启动

风无痕 July 26,2023 前言 很多人想建个人博客类的网站&#xff0c;这就需要网站服务器&#xff1b;需要管理手机、电脑中积累的照片&#xff0c;每张照片可都是人生一个片段的记录&#xff0c;需要管理微信中收发的各种文档等等&#xff0c;这就需要一台 NAS 即 Network Att…

【JMeter】JMeter添加插件

目录 一、前言 二、插件管理器 三、推荐插件 1.Custom Thread Groups &#xff08;1&#xff09;Ultmate Thread Group &#xff08;2&#xff09;Stepping Thread Group 2.3 Basic Graph 资料获取方法 一、前言 ​ 在我们的工作中&#xff0c;我们可以利用一些插件来帮…

【机器学习】西瓜书学习心得及课后习题参考答案—第3章线性模型

过了一遍第三章&#xff0c;大致理解了内容&#xff0c;认识了线性回归模型&#xff0c;对数几率回归模型&#xff0c;线性判别分析方法&#xff0c;以及多分类学习&#xff0c;其中有很多数学推理过程以参考他人现有思想为主&#xff0c;没有亲手去推。 术语学习 线性模型 l…

网站构建说明

一、网站中的web构建 HTML 4.01CSS 的使用 &#xff08;样式表&#xff09;XHTMLXML 和 XSLT客户端脚本服务器端脚本通过 SQL 管理数据Web 的未来 HTML 4.01 通过 HTML 4.01&#xff0c;所有的格式化信息可以被移出 HTML 文档&#xff0c;转而放入一个独立的样式表中。 层叠样…

linux实现运行java分包部署

1.打好包之后 找到bin文件夹下的 startup.sh文件 2.cd 进入bin文件夹下 3.执行 sh startup.sh 运行命令 4.如果出现此错误 是Windows和Linux的.sh脚本文件格式不同&#xff0c;如果在脚本中有空行&#xff0c;脚本是在Windows下进行编辑之后上传到linux上去执行的话&#xff0c…

httpclient 小案例(未完待续)

为了调用微信小程序接口&#xff0c;我们可以使用httpclient 导入依赖&#xff1a; java通过编码方式里发http请求&#xff0c;步骤&#xff1a; 创建http client 对象创建http请求对象&#xff08;get或post&#xff09;调用http client excute方法 httpGet请求方法 Test…

Pandas时序数据分析实践—概述

时序数据&#xff0c;作为一种时间上有序的数据形式&#xff0c;无疑是我们日常生活中最常见的数据类型之一。它记录了事件、现象或者过程随时间的变化&#xff0c;是对于许多实际场景的忠实反映。而在众多时序数据的应用领域中&#xff0c;跑步训练记录莫过于是一项令人着迷的…

美容店预约小程序制作教程详解

现在&#xff0c;制作一个专属于美容店的预约小程序不再需要编程经验&#xff0c;通过乔拓云网提供的后台管理系统&#xff0c;你可以轻松地完成整个制作过程。下面&#xff0c;我将为你详细介绍如何DIY一个美容店预约小程序。 首先&#xff0c;登录乔拓云网的后台管理系统&…

高阶C语言|C语言文件管理--输入输出流

文件管理 一、为什么使用文件二、什么是文件2.1程序文件2.2数据文件2.3文件名 三、文件的打开和关闭3.1文件指针3.2文件的打开和关闭 四、文件的顺序读写4.1顺序读写函数介绍4.1.1fgetc4.1.2fputc4.1.3fgets4.1.4fputs4.1.5fscanf4.1.6fprintf4.1.7fread4.1.8fwrite 4.2对比一组…

pg三种插件验证

sr_plan 创建extension, 他会创建保留执行计划的表 创建表并插入数据 开启sr_plan.write_mode, 允许sr_plan收集SQL和执行计划 查看QUERY 1的执行计划 PostgreSQL支持merge join、GroupAggregate(通过INDEX SCAN),所以这个CASE,非常快,并不需要b对所有数据进行聚合。查看…

linux 动态库so相关操作

1. 查看库版本号 一般在文件名上有版本号&#xff0c;若文件名上没有版本号&#xff0c;使用如下命令查看&#xff1a; readelf -d libstdc.so 2. 查看库内函数 a) nm -d libstdc.so | grep 内容 b) objdump -tT libstdc.so | grep 内容 c) readelf -s libstdc.so | grep…

第十章:重新审视扩张卷积:一种用于弱监督和半监督语义分割的简单方法

0.摘要 尽管取得了显著的进展&#xff0c;弱监督分割方法仍然不如完全监督方法。我们观察到性能差距主要来自于它们在从图像级别监督中学习生成高质量的密集目标定位图的能力有限。为了缓解这样的差距&#xff0c;我们重新审视了扩张卷积[1]并揭示了它如何以一种新颖的方式被用…

HTML编码-Form-ifram

字符编码&#xff1a; 主要有两类&#xff1a; 一类为非Unicode编码&#xff1b;一类是Unicode编码&#xff1b; 常见编码种类&#xff1a; 1、ASCII码&#xff1a; ASCII&#xff08;American Standard Code for Information Interchange&#xff0c;美国信息交换标准代码&a…

25.6 matlab里面的10中优化方法介绍——模拟退火算法(matlab程序)

1.简述 相信没有相关物理知识背景的小伙伴看到“退火”二字是一脸懵逼的...固体的退火过程指的是将固体加热至足够高的温度&#xff0c;再使其慢慢冷却的过程。在加热过程中&#xff0c;原本有序排列的内部粒子开始无序运动&#xff0c;此时固体的内能不断增大&#xff1b;而在…

【GEC6818开发板简介】

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

计算机网络 day13 TCP拥塞控制 - tcpdump - DHCP协议 - DHCP服务器搭建 - DNS域名解析系统 - DNS域名解析过程

目录 TCP的流控机制 -- 拥塞控制 参考文章&#xff1a;什么是TCP拥塞控制算法&#xff1f; - 知乎 (zhihu.com) 拥塞控制主要是四个算法&#xff1a; 主机如何知道数据在传输的过程中&#xff0c;知道中间的网络堵塞了&#xff1f; TCP/IP协议栈 tcpdump抓包工具的学习使用…

AtcoderABC231场

A - Water PressureA - Water Pressure 题目大意 假设水压仅取决于深度&#xff0c;在深度为x米时&#xff0c;水压为x/100兆帕斯卡。 现在给定一个深度D米&#xff0c;需要计算在该深度下的水压是多少兆帕斯卡。 思路分析 直接将输入的深度除以100得到水压结果。 时间复杂…

【无标题】自定义类型:位段,枚举,联合

自定义类型&#xff1a;位段&#xff0c;枚举&#xff0c;联合 1. 位段1.1 什么是位段1.2 位段的内存分配1.3 位段的跨平台问题 2. 枚举2.1 枚举类型的定义2.2 枚举类型的优点2.3 枚举的使用 3. 联合&#xff08;共用体&#xff09;3.1 联合类型的定义3.2联合的特点3.2.1 相关面…

使用 ChatGPT 进行研究的先进技术

在这篇文章中&#xff0c;您将探索改进您研究的先进技术。尤其&#xff0c; 分析和解释研究数据进行文献综述并找出研究差距废话不多说直接开始吧&#xff01;&#xff01;&#xff01; 分析和解释研究数据 一家小企业主希望分析客户满意度数据以改善客户服务。他们使用包含 10…