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

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 : 代表 常量寄存器

unityunittpusemcoderagappatsdirectxmicrosoftdebugwordfixdebuggingideclip关键字cliurlcgi
  • 本文作者:李琛
  • 本文链接: https://wapzz.net/post-2244.html
  • 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。
本站部分内容来源于网络转载,仅供学习交流使用。如涉及版权问题,请及时联系我们,我们将第一时间处理。
文章很赞!支持一下吧 还没有人为TA充电
为TA充电
还没有人为TA充电
0
  • 支付宝打赏
    支付宝扫一扫
  • 微信打赏
    微信扫一扫
感谢支持
文章很赞!支持一下吧
关于作者
2.3W+
5
0
1
WAP站长官方

今日思考(1) — 算力对机器人的影响(基于文心一言的回答)

上一篇

软件测试/测试开发丨结对编程助手 GitHubCopilot

下一篇
  • 复制图片
按住ctrl可打开默认菜单