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

Unity中Shader指令优化(编译后指令解析)

文章目录

  • 前言
  • 一、我们先创建一个简单的Shader
  • 二、编译这个Shader,并且打开
    • 1、编译后注意事项
    • 2、编译平台 和 编译指令数
    • 3、顶点着色器用到的信息
    • 4、顶点着色器计算的核心部分
    • 5、片元着色器用到的信息
    • 6、片元着色器核心部分


前言

我们先读懂Shader编译后代码,才能对Shader进行合理的优化


一、我们先创建一个简单的Shader

Shader "MyShader/P2_3_6"
{
    Properties
    {
        
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };
            
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return fixed4(i.uv,1,1);
            }
            ENDCG
        }
    }
}



二、编译这个Shader,并且打开

在这里插入图片描述

  • 我们目前先只编译到 D3D 平台

这是编译后的代码(我们来逐步分析):

// Compiled shader for custom platforms

//
// 
// NOTE: This is *not* a valid shader file, the contents are provided just
// for information and for debugging purposes only.
// 
//
// Skipping shader variants that would not be included into build of current scene.

Shader "MyShader/P2_3_6" {
SubShader { 
 LOD 100
 Tags { "RenderType"="Opaque" }


 // Stats for Vertex shader:
 //        d3d11: 8 math
 Pass {
  Tags { "RenderType"="Opaque" }
  //
  //                              //
  //      Compiled programs       //
  //                              //
  //
//
Keywords: <none>
-- Hardware tier variant: Tier 1
-- Vertex shader for "d3d11":
// Stats: 8 math, 2 temp registers
Uses vertex data channel "Vertex"
Uses vertex data channel "TexCoord0"

Constant Buffer "UnityPerDraw" (176 bytes) on slot 0 {
  Matrix4x4 unity_ObjectToWorld at 0
}
Constant Buffer "UnityPerFrame" (368 bytes) on slot 1 {
  Matrix4x4 unity_MatrixVP at 272
}

Shader Disassembly:
//
// Generated by Microsoft (R) D3D Shader Disassembler
//
//
// Input signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// POSITION                 0   xyzw        0     NONE   float   xyz 
// TEXCOORD                 0   xy          1     NONE   float   xy  
//
//
// Output signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// TEXCOORD                 0   xy          0     NONE   float   xy  
// SV_POSITION              0   xyzw        1      POS   float   xyzw
//
      vs_4_0
      dcl_constantbuffer CB0[4], immediateIndexed
      dcl_constantbuffer CB1[21], immediateIndexed
      dcl_input v0.xyz
      dcl_input v1.xy
      dcl_output o0.xy
      dcl_output_siv o1.xyzw, position
      dcl_temps 2
   0: mov o0.xy, v1.xyxx
   1: mul r0.xyzw, v0.yyyy, cb0[1].xyzw
   2: mad r0.xyzw, cb0[0].xyzw, v0.xxxx, r0.xyzw
   3: mad r0.xyzw, cb0[2].xyzw, v0.zzzz, r0.xyzw
   4: add r0.xyzw, r0.xyzw, cb0[3].xyzw
   5: mul r1.xyzw, r0.yyyy, cb1[18].xyzw
   6: mad r1.xyzw, cb1[17].xyzw, r0.xxxx, r1.xyzw
   7: mad r1.xyzw, cb1[19].xyzw, r0.zzzz, r1.xyzw
   8: mad o1.xyzw, cb1[20].xyzw, r0.wwww, r1.xyzw
   9: ret 
// Approximately 0 instruction slots used


-- Hardware tier variant: Tier 1
-- Fragment shader for "d3d11":
Shader Disassembly:
//
// Generated by Microsoft (R) D3D Shader Disassembler
//
//
// Input signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// TEXCOORD                 0   xy          0     NONE   float   xy  
// SV_POSITION              0   xyzw        1      POS   float       
//
//
// Output signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// SV_Target                0   xyzw        0   TARGET   float   xyzw
//
      ps_4_0
      dcl_input_ps linear v0.xy
      dcl_output o0.xyzw
   0: mov o0.xy, v0.xyxx
   1: mov o0.zw, l(0,0,1.000000,1.000000)
   2: ret 
// Approximately 0 instruction slots used


 }
}
}

1、编译后注意事项

//
//
// NOTE: This is not a valid shader file, the contents are provided just
// for information and for debugging purposes only.
//
//

这不是一个有效的Shader,这个文本只是提供用于 Debug Shader 时使用

2、编译平台 和 编译指令数

// Stats for Vertex shader:
// d3d11: 8 math

代表编译后的平台是 DirectX 11,使用到了 8 条计算指令

3、顶点着色器用到的信息

Keywords:
– Hardware tier variant: Tier 1
– Vertex shader for “d3d11”:
// Stats: 8 math, 2 temp registers
Uses vertex data channel “Vertex”
Uses vertex data channel “TexCoord0”

  • 无关键字
  • 变体数:1
  • 顶点着色器 对应 编译平台 DirectX 11
  • 用到计算 指令 8条,临时寄存器 2 个

Constant Buffer “UnityPerDraw” (176 bytes) on slot 0 {
Matrix4x4 unity_ObjectToWorld at 0
}
Constant Buffer “UnityPerFrame” (368 bytes) on slot 1 {
Matrix4x4 unity_MatrixVP at 272
}

  • 这两个代表 常量缓存 ,存贮计算用到的 Unity 中定义的常量

4、顶点着色器计算的核心部分

Shader Disassembly:
//
// Generated by Microsoft (R) D3D Shader Disassembler
//
//
// Input signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// POSITION                 0   xyzw        0     NONE   float   xyz 
// TEXCOORD                 0   xy          1     NONE   float   xy  
//
//
// Output signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// TEXCOORD                 0   xy          0     NONE   float   xy  
// SV_POSITION              0   xyzw        1      POS   float   xyzw
//
      vs_4_0
      dcl_constantbuffer CB0[4], immediateIndexed
      dcl_constantbuffer CB1[21], immediateIndexed
      dcl_input v0.xyz
      dcl_input v1.xy
      dcl_output o0.xy
      dcl_output_siv o1.xyzw, position
      dcl_temps 2
   0: mov o0.xy, v1.xyxx
   1: mul r0.xyzw, v0.yyyy, cb0[1].xyzw
   2: mad r0.xyzw, cb0[0].xyzw, v0.xxxx, r0.xyzw
   3: mad r0.xyzw, cb0[2].xyzw, v0.zzzz, r0.xyzw
   4: add r0.xyzw, r0.xyzw, cb0[3].xyzw
   5: mul r1.xyzw, r0.yyyy, cb1[18].xyzw
   6: mad r1.xyzw, cb1[17].xyzw, r0.xxxx, r1.xyzw
   7: mad r1.xyzw, cb1[19].xyzw, r0.zzzz, r1.xyzw
   8: mad o1.xyzw, cb1[20].xyzw, r0.wwww, r1.xyzw
   9: ret 
// Approximately 0 instruction slots used
  • 我们先看一下顶点着色器的注释(重要):

在这里插入图片描述

  • 计算用到的指令

mov: 赋值运算
mul : 乘法
div : 除法
add : 加法 和 减法
mad: mul 和 add 的结合
ret : 返回

5、片元着色器用到的信息

– Hardware tier variant: Tier 1
– Fragment shader for “d3d11”:

  • 变体 1 个
  • 片元着色器编译平台 DirectX 11

6、片元着色器核心部分

Shader Disassembly:
//
// Generated by Microsoft (R) D3D Shader Disassembler
//
//
// Input signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// TEXCOORD                 0   xy          0     NONE   float   xy  
// SV_POSITION              0   xyzw        1      POS   float       
//
//
// Output signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// SV_Target                0   xyzw        0   TARGET   float   xyzw
//
      ps_4_0
      dcl_input_ps linear v0.xy
      dcl_output o0.xyzw
   0: mov o0.xy, v0.xyxx
   1: mov o0.zw, l(0,0,1.000000,1.000000)
   2: ret 
// Approximately 0 instruction slots used

  • 片元着色器部分的注释 和 顶点着色器 部分一样

  • ps_4_0 : 代表编译到的像素着色器(这里和片元着色器差不多,但是他两不一样)。在DirectX 平台下,这个代表编译到硬件 SM4.0

  • dcl_input_ps linear v0.xy:代表输入的变量,v 默认代表输入变量,0代表索引为0

  • dcl_output o0.xyzw:代表输出的变量,o默认代表输出变量,0代表索引为0

  • mov : 赋值

  • l :值类型

  • r : 代表 临时寄存器

  • cb : 代表 常量寄存器


http://www.kler.cn/a/153953.html

相关文章:

  • 计算机网络-mac地址与ip地址的区别总结
  • sqli—labs靶场 5-8关 (每日4关练习)持续更新!!!
  • 笔记01----Transformer高效语义分割解码器模块DEPICT(即插即用)
  • c++数字雨实现
  • DHTMLX-gantt组件显示不同的颜色
  • Redis知识分享(三)
  • J-LINK J-FLASH 下载STM32单片机程序使用教程
  • C++-火车编组
  • docker-compose脚本编写关键词详解
  • LeetCode | 100. 相同的树
  • SALib敏感性分析入门实践笔记
  • Leetcode算法系列| 3. 无重复字符的最长子串
  • 初识Linux(下).妈妈再也不用担心我Linux找不到门了
  • YOLOv8-Seg改进:SENetV2,squeeze和excitation全面升级,效果优于SENet | 2023年11月最新成果
  • Long-Context下LLM模型架构全面介绍
  • mybatis中<association> 和 <collection>
  • 【CTA认证】Android认证桌面首页必须能看到顶部状态栏
  • 使用 mtcnn 和 facenet 进行人脸识别
  • 解决woocommerce产品方面遇到的小问题记录
  • 面试 Java 基础八股文十问十答第二期
  • 探索 Web API:SpeechSynthesis 与文本语言转换技术
  • 深度学习回顾:七种网络
  • Leetcode 第 110 场双周赛 Problem D 2809. 使数组和小于等于 x 的最少时间(DP+贪心+正难则反)
  • okhttp导致的内存溢出(OOM)sun.security.ssl.SSLSocketImpl
  • K8S集群搭建redis集群的步骤
  • Go 语言中的结构体:定义、初始化与高级用法解析