晶羽科技-解读点评影视小说作品

微信
手机版

爱,死亡,机器人第二,《爱·死亡·机器人》第二季

2023-11-12 03:18 作者:岑岑 围观:

DXBC简介

DXBC指令是D3D着色器语言使用的指令。HLSL高级着色语言经过编译器编译后,会生成相应的DXBC指令。DXBC指令可以理解为GPU需要实际执行的指令。

OpenGL或者其他GPU厂商,他们提供的指令其实和DXBC差不多,唯一的区别就是有些特殊指令是硬件不支持的。虽然编译器在大多数情况下可以帮助我们优化代码,但不能保证代码在某些情况下是最优的方式,因为编译器特别智能。了解DXBC指令可以帮助我们在编写Shader时写出更可靠、更优秀的代码。

另外,了解DXBC指令可以帮助我们在某些情况下逆转其他游戏的一些物质效果。

2开始准备

DXBC指令其实非常简单易学。它的套路可以说非常单一,大部分指令可以总结如下:

以下是片段着色器的编译结果。

我们这次测试的基本着色器如下

为了便于复制:

传递{ HLSLPROGRAM # pragma vert # pragma fragment frag # include & # 34;packages/com . unity . render-pipelines . universal/shader library/core . hlsl & # 34;结构属性{ float 4 POSITION OS:POSITION;};struct varying s { float 4 POSITION HCS:SV _ POSITION;};CBUFFER _ START(UnityPerMaterial)half 4 _ base color;CBUFFER _ END varying s vert(Attributes IN){ varying s OUT;out . position HCS = transformobjecttohcip(in . positionos . XYZ);退了出来;} half 4 frag():SV _ Target { return _ base color;} ENDHLSL3芯片元阶段分析

挂载RenderDoc后,找到相应的RenderPass。

目前,着色器仅包含顶点和面片着色器。先说PS阶段,PS阶段代码如下:

Ps _ 4 _ 0 DCL _ constant buffer CB0 [1],立即索引DCL _ output 0 . xyzw 0:movo 0 . xyzw,CB0 [0]。xyzw1:从外部传入的变量:

ps_4_0

本节包含由像素着色器版本4_0(即当前HLSL寄存器版本为4.0)实现的输入和输出寄存器的参考信息。

dcl_constantbuffer cb0[1]

声明着色器常量缓冲区意味着声明寄存器cb0的常量缓冲区,其中包含1个元素。可以使用文本索引来访问这些元素。

即时索引

使用文本值来索引缓冲区。

输出返回

Dcl_output声明着色器输出寄存器。

这类寄存器,O0。XYZ吴,o1和o2,是输出寄存器,这个寄存器的意义应该是猜测整个DXBC。

Mov指令

使用句型:mov dst,src

Dst是目标寄存器。

Src是一个源寄存器。即移动源寄存器和目标寄存器中的数据。0: mov o0.xyzw,cb0[0]。xyzw这里,常量缓冲区中的数据被移动到目标缓冲区。

Ret指令

对于main函数,此指令将停止着色器的执行。

顶点阶段

4顶点阶段分析

vs _ 4 _ 0 DCL _ constant buffer cb0[77],immediate indexed DCL _ constant buffer cb1[4],immediate indexed DCL _ input v 0 . XYZ DCL _ output _ SIV o0 . xyzw,position dcl_temps 2 0: mul r0.xyzw,v0.yyyy,cb1[1]。xyzw 1: mad r0.xyzw,cb1[0]。xyzw,v0.xxxx,r0.xyzw 2: mad r0.xyzw,cb1[2]。xyzw,v0.zzzz,r0.xyzw 3:添加r0.xyzw,r0.xyzw,cb1[3]。xyzw 4: mul r1.xyzw,r0.yyyy,cb0[74]。xyzw 5: mad r1.xyzw,cb0[73]。xyzw,r0.xxxx,r1.xyzw 6: mad r1.xyzw,cb0[75]。xyzw,r0.zzzz,R1。xyzw7: mado0。xyzw,CB0 [76]。xyzw,r0。R1。xyzw8: retdcl _ input指令。

声明着色器输入寄存器语法:dcl_input vN[。mask][,插值模式]N是标识寄存器编号的整数。[.mask]是可选的组件掩码(。xyzw),它指定要使用的已注册组件。Dcl_input v0.xyz这里对应的是着色器中的float 4 POSITION OS:POSITION;Dcl_output_siv指令

声明一个包含系统值参数的输出寄存器。语法:dcl_output_siv oN[。掩码],系统值。

所以dcl_output_siv o0.xyzw,这里的position代表Varyings下的positionHCS。

然后是一系列的矩阵变换,从model 空到齐次裁剪空,分别乘以MVP矩阵,单位写成out。position HCS = transformeobjecttohcip(in。position OS . XYZ);把这句话拆开,如下

上面这句话相当于下面三句话。

其中,optimize Projection Matrix(GL state _ Matrix _ Projection)是文件UniversalRenderPipelineCore.cs下ShaderPropertyId类传入的矩阵,用于根据平台进行特殊处理。

公共静态类ShaderPropertyId {...公共静态只读int viewMatrix = Shader。property toid(& # 34;unity _ MatrixV & # 34);公共静态只读int projectionMatrix = Shader。property toid(& # 34;glstate _ matrix _ projection & # 34);...}dcl_temps指令

声明临时寄存器。

语法:dcl_temps N N是临时寄存器的数量,每个寄存器都有一个32位四分量值空。临时和可索引临时寄存器的总数必须小于或等于4096。Dcl_temps 2在这里声明了两个临时寄存器r0-r1。我们接下来需要它。Mul指令

语法mul dst、src0和src1dst是目标寄存器。Src0是源寄存器。Src1是源寄存器。即dest . x = src 0 . x * src 1 . x;Mul r0.xyzw,v0.yyyy,cb1[1]。xyzw这个指令的意思是:r0.xyzw = * v0.yyyy * CB1 [1]。xyzwmad。

乘加源。语法:mad dst、src0、src1和src2dst是目标寄存器。Src0是源寄存器。Src1是源寄存器。Src2是源寄存器。示例:dest . x = src 0 . x * src 1 . x+src 2 . x;Madr0.xyzw,cb1 [0]。xyzw,v0.xxxx,r0.xyzw这条指令的意思是:r0.xyzw = cb1 [0]。xyzw * v0.xxxx+r0.xyzw加法指令。

添加两个向量。语法:add dst,src0和src1dst是目标寄存器。Src0是源寄存器。Src1是源寄存器。例如:dest . x = src 0 . x+src 1 . x;添加r0.xyzw,r0.xyzw,cb1[3]。xyzw这个指令的意思是:r0.xyzw = r0.xyzw+cb1[3]。xyzw分析。

0: mulr0.xyzw,v0.yyyy,cb1 [1]。xyzw1: madr0.xyzw,cb1 [0]。xyzw,v0.xxxx,r0.xyzw2: madr0.xyzw,cb1 [2]。xyzw,v0。

0: r0.xyzw = v0.yyyy * cb1[1]。xyzw1: r0.xyzw = cb1[0]。xyzw * v 0 . xxxx+r0 . xyzw 2:r0 . xyzw = cb1[2]。xyzw * v 0 . zzzz+r0 . xyzw 3:r0 . xyzw = r0 . xyzw+cb1[3]。这里的xyzw只是原始着色器中的一系列矩阵变换,但DXBC会默认用Vector4替换HLSL,包括矢量。从推导可以看出,这里的cb1[4]是一个M矩阵。怎么来的?

根据dcl_constantbuffer cb1,**cb1[4]**是从外部传入的参数类型。我只计算Shader中的M矩阵,编译后如下图所示。由此可以推断cb1[4]是unity_ObjectToWorld,CB1 [1]-CB1 [3]分别对应M矩阵的每一列。Unity_ObjectToWorld是4×44×44×4的矩阵,positionOS是4×14×14×1的矩阵(Unity中使用列向量,矩阵乘左),所以一切都很清楚。回想一下矩阵乘法,当两个矩阵A和B相乘时,需要满足A的列数等于B的行数,一个矩阵的行元素乘以每一列,然后相加作为新矩阵的行元素。继续看下面:

4: mul r1.xyzw,r0.yyyy,cb0[74]。xyzw 5: mad r1.xyzw,cb0[73]。xyzw,r0.xxxx,r1.xyzw 6: mad r1.xyzw,cb0[75]。xyzw,r0.zzzz,R1。xyzw7: mado0。xyzw,CB0 [76]。xyzw,r0。R1。xyzw等等,范围CB [73]-[76]代表VP矩阵Unity _ Matrix的VP范围CB [61]-[64],V矩阵UNITY_MATRIX_P的范围CB [57]-[60]代表P矩阵的最终输出ret,这个帧裁剪分析的基本着色器已经结束。

接下来的分析,如果有地图和其他类型的输入分析。

相关文章