什么是l和v1以及它拥有什么类型的值?

问题描述 投票:0回答:1

下面的代码是从英特尔GPA工具生成的,我一直在研究这些HLSL代码,我无法理解代码中使用的寄存器是什么以及它拥有什么值?我们如何知道寄存器中的值是什么值?

dcl_constantbuffer CB2[16], immediateIndexed
dcl_constantbuffer CB12[13], immediateIndexed
dcl_sampler s6, mode_default
dcl_resource_texture2d (float,float,float,float) t6
dcl_input_ps linear v1.xy
dcl_output o0.xyzw
dcl_temps 6
mov r0.x, cb2[15].z
mov r0.yw, l(0,0,0,0)
add r0.xy, r0.xyxx, v1.xyxx
mad r1.xy, r0.xyxx, l(2.000000, -2.000000, 0.000000, 0.000000), l(-1.000000, 1.000000, 0.000000, 0.000000)
sample_l r2.xyzw, r0.xyxx, t6.xyzw, s6, l(0.000000)
mul r1.xy, r1.xyxx, cb12[0].xyxx
mov r1.z, l(1.000000)
mul r1.xyz, r2.xxxx, r1.xyzx
mov r0.z, -cb2[15].z
add r0.xy, r0.zwzz, v1.xyxx
mad r0.zw, r0.xxxy, l(0.000000, 0.000000, 2.000000, -2.000000), l(0.000000, 0.000000, -1.000000, 1.000000)
sample_l r2.xyzw, r0.xyxx, t6.xyzw, s6, l(0.000000)
mul r0.xy, r0.zwzz, cb12[0].xyxx
mov r0.z, l(1.000000)
mul r0.xyz, r2.xxxx, r0.xyzx
mad r2.xy, v1.xyxx, l(2.000000, -2.000000, 0.000000, 0.000000), l(-1.000000, 1.000000, 0.000000, 0.000000)
mul r2.xy, r2.xyxx, cb12[0].xyxx
sample_l r3.xyzw, v1.xyxx, t6.xyzw, s6, l(0.000000)
mov r2.z, l(1.000000)
mad r3.yzw, r2.xxyz, r3.xxxx, -r0.xxyz
dp3 r0.w, r3.yzwy, r3.yzwy
sqrt r0.w, r0.w
mad r3.yzw, r2.xxyz, r3.xxxx, -r1.xxyz
dp3 r1.w, r3.yzwy, r3.yzwy
sqrt r1.w, r1.w
lt r0.w, r0.w, r1.w
movc r0.xyz, r0.wwww, r0.xyzx, r1.xyzx
mad r0.xyz, -r2.xyzx, r3.xxxx, r0.xyzx
dp3 r0.x, r0.xyzx, r0.xyzx
sqrt r0.x, r0.x
mov r1.y, cb2[15].w
mov r1.xz, l(0,0,0,0)
add r0.yz, r1.xxyx, v1.xxyx
mad r1.xy, r0.yzyy, l(2.000000, -2.000000, 0.000000, 0.000000), l(-1.000000, 1.000000, 0.000000, 0.000000)
sample_l r4.xyzw, r0.yzyy, t6.xyzw, s6, l(0.000000)
mul r5.xy, r1.xyxx, cb12[0].xyxx
mov r5.z, l(1.000000)
mul r0.yzw, r4.xxxx, r5.xxyz
mad r3.yzw, r2.xxyz, r3.xxxx, -r0.yyzw
dp3 r1.x, r3.yzwy, r3.yzwy
sqrt r1.x, r1.x
mov r1.w, -cb2[15].w
add r1.yz, r1.zzwz, v1.xxyx
mad r3.yz, r1.yyzy, l(0.000000, 2.000000, -2.000000, 0.000000), l(0.000000, -1.000000, 1.000000, 0.000000)
sample_l r4.xyzw, r1.yzyy, t6.xyzw, s6, l(0.000000)
mul r5.xy, r3.yzyy, cb12[0].xyxx
mov r5.z, l(1.000000)
mul r1.yzw, r4.xxxx, r5.xxyz
mad r3.yzw, r2.xxyz, r3.xxxx, -r1.yyzw
dp3 r2.w, r3.yzwy, r3.yzwy
sqrt r2.w, r2.w
lt r1.x, r1.x, r2.w
movc r0.yzw, r1.xxxx, r0.yyzw, r1.yyzw
mad r0.yzw, -r2.xxyz, r3.xxxx, r0.yyzw
dp3 r0.y, r0.yzwy, r0.yzwy
sqrt r0.y, r0.y
lt r0.xy, r0.xyxx, cb12[12].wwww
and r0.x, r0.y, r0.x
and o0.xyzw, r0.xxxx, l(0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000)
ret

我们可以看到l在上面的代码中被多次使用,括号中的值不同

mad r1.xy, r0.xyxx, l(2.000000, -2.000000, 0.000000, 0.000000), l(-1.000000, 1.000000, 0.000000, 0.000000)

and o0.xyzw, r0.xxxx, l(0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000)

我知道和操作,但我如何获得这些价值观和最终输出可能是我对此非常新的请原谅如果它接近非常愚蠢的提前感谢

unity3d graphics 3d glsl hlsl
1个回答
0
投票

读取着色器字节码实际上并不是一件容易的事,对于这样一个复杂的着色器,它需要一点耐心。为了更深入地理解,我建议您阅读documentation,以便轻松查找运算符或寄存器。

对你的问题:

  • v1代表输入颜色寄存器(docs),因为有组件xy并且声明了纹理我会假设它描述了传递给着色器的某种纹理坐标
  • l(...)似乎是常量的简短形式,我没有找到任何关于此的文档,但它很可能是内联常量所以mad r1.xy, r0.xyxx, l(2.000000, -2.000000, 0.000000, 0.000000), l(-1.000000, 1.000000, 0.000000, 0.000000) => r1.xy = r0.xy * float2(2,-2) + float2(-1, 1)
  • and o0.xyzw, r0.xxxx, l(0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000)有点特别需要理解。它和寄存器是分段的,上面有两行是lt,这意味着现在r0.x0xFFFFFFFF(true)或0x00000000(false)形式的布尔值。通过和0x3f800000(它是1.0的浮点表示),它实际上将布尔值转换为1.0或0.0的浮点数。因此,关于r0的布尔值,着色器的输出在每个通道中为1.0或0.0。
© www.soinside.com 2019 - 2024. All rights reserved.