当前位置: 首页 > 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 优化是非常有必要的

在这里插入图片描述

http://www.lryc.cn/news/96688.html

相关文章:

  • 【C++入门到精通】C++入门 —— 类和对象(了解类和对象)
  • DRS 迁移本地mysql 到华为云
  • 腾讯云 Cloud Studio 实战训练营——快速构建React完成点餐H5页面
  • 在 React 中,props(属性)用于在组件之间传递数据
  • Unity实现camera数据注入RMP推送或轻量级RTSP服务模块
  • CVPR2023新作:3D感知的AI换脸算法
  • Android安卓实战项目(4)---提供给阿尔兹海默症患者的APP(源码在文末)
  • 详解Mybatis之自动映射 自定义映射问题
  • shiro的优点
  • 使用分布式HTTP代理爬虫实现数据抓取与分析的案例研究
  • Linux操作系统运维常用集合
  • UE4/5C++多线程插件制作(十四、MTPAbandonable)
  • 集装箱装卸作业相关的知识-Part1
  • BurpSuite超详细安装教程-功能概述-配置-使用教程---(附下载链接)
  • 不同局域网下使用Python自带HTTP服务进行文件共享「端口映射」
  • 产业大数据应用:洞察企业全维数据,提升企业监、管、服水平
  • 【爬虫逆向案例】某名片网站 js 逆向 —— data解密
  • RocketMq 事务消息原理
  • day41-Verify Account Ui(短信验证码小格子输入效果)
  • C. Maximum Set
  • 基于springboot+vue学生宿舍报修公寓管理系统
  • 缓存和数据库一致性问题分析
  • 用Rust生成Ant-Design Table Columns | 京东云技术团队
  • java.lang.ClassNotFoundException: sun.misc.BASE64Decoder
  • Unity进阶--对象池数据场景管理器笔记
  • 【Seata】微服务集成seata
  • 解决react,<img>src使用require方法引入图片不显示问题
  • 从小白到大神之路之学习运维第67天-------Tomcat应用服务 WEB服务
  • 图解SQL基础知识,小白也能看懂的SQL文章
  • 自动驾驶感知系统-毫米波雷达