DXBC2HLSL Tool

141 篇文章 31 订阅
9 篇文章 1 订阅


目的

DXBC 可读性肯定没有 HLSL 强,而且我们在 Unity 中平常写的 Shader 多以 HLSL 的语法为主

由于之前有尝试将 DXBC 还原恢复到 HLSL

在此过程中,发现巨多的机械化的活:每一个 ASM API 都要去转为对应的 HLSL 代码
然后联合上下文的指令逻辑,猜测出 HLSL 的逻辑代码

我们写工具将 DXBC2HLSL 的最大目的就是减少上面说的:巨量的机械化的活


工作制作思路

  • 将 dcl_xxx 特殊处理:正则提取定义信息
  • 将 指令部分 使用简单的语义检查(逐字符 扫描 即可),并提取指令名,使用的参数(寄存器,什么类型的寄存器,或是常量,等),等
  • 最终将提取的定义信息,和指令信息 转换输出为对应的 HLSL 代码

效果演示


示例结果

请添加图片描述


准备好 DXBC VS/PS

原来的 DXBC VS

Shader hash 6e1ba2f7-6109162f-7a8af580-dc171056

vs_5_0
      dcl_globalFlags refactoringAllowed // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dcl-globalflags
      // Shader Constants (HLSL) https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-constants
      // How About Constant Buffers? https://developer.nvidia.com/content/how-about-constant-buffers
      dcl_constantbuffer cb0[66], immediateIndexed // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dcl-constantbuffer
      dcl_constantbuffer cb1[1], immediateIndexed
      dcl_constantbuffer cb2[15], dynamicIndexed
      dcl_input v0.xyz // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dcl-input
      dcl_input v1.xyz
      dcl_input v2.xyzw
      dcl_input v3.xy
      // dcl_input_sv https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dcl-input-sv
      // Semantics https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-semantics
      // jave.lin : sgv 的意思为:system generate value
      dcl_input_sgv v4.x, instanceid
      dcl_output_siv o0.xyzw, position // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dcl-output-siv
      dcl_output o1.xyz // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dcl-output
      dcl_output o2.xyz
      dcl_output o3.xyzw
      dcl_output o4.xy
      dcl_output o5.xyz
      dcl_temps 3 // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dcl-temps
   0: iadd r0.x, v4.x, cb1[0].x // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/iadd--sm4---asm-
   // jave.lin : 注意 dx93d 中不支持 位操作 https://www.gamedev.net/forums/topic/527821-bitwise-operation-in-hlsl/
   1: ishl r0.x, r0.x, l(3) // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/ishl--sm4---asm-
   2: mul r0.yzw, v0.yyyy, cb2[r0.x + 1].xxyz
   3: mad r0.yzw, cb2[r0.x + 0].xxyz, v0.xxxx, r0.yyzw
   4: mad r0.yzw, cb2[r0.x + 2].xxyz, v0.zzzz, r0.yyzw
   5: add r0.yzw, r0.yyzw, cb2[r0.x + 3].xxyz
   6: mul r1.xyzw, r0.zzzz, cb0[63].xyzw
   7: mad r1.xyzw, cb0[62].xyzw, r0.yyyy, r1.xyzw
   8: mad r1.xyzw, cb0[64].xyzw, r0.wwww, r1.xyzw
   9: mov o1.xyz, r0.yzwy
  10: add r1.xyzw, r1.xyzw, cb0[65].xyzw
  11: mov o0.xyzw, r1.xyzw
  12: dp3 r2.x, v1.xyzx, cb2[r0.x + 4].xyzx // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dp3---ps
  13: dp3 r2.y, v1.xyzx, cb2[r0.x + 5].xyzx
  14: dp3 r2.z, v1.xyzx, cb2[r0.x + 6].xyzx
  15: dp3 r0.y, r2.xyzx, r2.xyzx
  16: rsq r0.y, r0.y // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/rsq---vs
  17: mul o2.xyz, r0.yyyy, r2.xyzx
  18: mul r0.yzw, v2.yyyy, cb2[r0.x + 1].xxyz
  19: mad r0.yzw, cb2[r0.x + 0].xxyz, v2.xxxx, r0.yyzw
  20: mad r0.xyz, cb2[r0.x + 2].xyzx, v2.zzzz, r0.yzwy
  21: dp3 r0.w, r0.xyzx, r0.xyzx
  22: rsq r0.w, r0.w
  23: mul o3.xyz, r0.wwww, r0.xyzx
  24: mov o3.w, v2.w
  25: mov o4.xy, v3.xyxx
  26: mul r0.x, r1.y, cb0[10].x
  27: mul r0.w, r0.x, l(0.5000)
  28: mul r0.xz, r1.xxwx, l(0.5000, 0.0000, 0.5000, 0.0000)
  29: mov o5.z, r1.w
  30: add o5.xy, r0.zzzz, r0.xwxx
  31: ret

PS

Shader hash 8f0f7fc5-a32251a9-7c7b8456-dd4e6c69

ps_5_0
      dcl_globalFlags refactoringAllowed
      // Shader Constants (HLSL) https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-constants
      // How About Constant Buffers? https://developer.nvidia.com/content/how-about-constant-buffers
      dcl_constantbuffer cb0[295], dynamicIndexed
      dcl_sampler s0, mode_default // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dcl-sampler
      dcl_sampler s1, mode_default
      dcl_sampler s2, mode_default
      dcl_sampler s3, mode_comparison // https://docs.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_filter
      dcl_sampler s4, mode_default
      dcl_sampler s5, mode_default
      // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dcl-resource
      // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-to-type
      dcl_resource_texture2d (float,float,float,float) t0
      dcl_resource_texture2d (float,float,float,float) t1
      dcl_resource_texturecube (float,float,float,float) t2
      dcl_resource_texture2darray (float,float,float,float) t3
      dcl_resource_texture2d (float,float,float,float) t4
      dcl_resource_texture2d (float,float,float,float) t5
      dcl_input_ps linear v1.xyz
      dcl_input_ps linear v2.xyz
      dcl_input_ps linear v3.xyzw
      dcl_input_ps linear v4.xy
      dcl_input_ps linear v5.xyz
      dcl_output o0.xyzw
      dcl_temps 9 // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dcl-temps
   0: add r0.xyz, v1.xyzx, -cb0[179].xyzx
   1: dp3 r0.x, r0.xyzx, r0.xyzx
   2: add r1.xyz, v1.xyzx, -cb0[180].xyzx
   3: dp3 r0.y, r1.xyzx, r1.xyzx
   4: add r1.xyz, v1.xyzx, -cb0[181].xyzx
   5: dp3 r0.z, r1.xyzx, r1.xyzx
   // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/lt--sm4---asm-
   6: lt r0.xyz, r0.xyzx, cb0[182].xyzx
   // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/movc--sm4---asm-
   7: movc r0.z, r0.z, l(2), l(3)
   8: movc r0.y, r0.y, l(1), r0.z
   9: movc r0.x, r0.x, l(0), r0.y
   // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/itof--sm4---asm-
  10: itof r1.z, r0.x
  11: ishl r0.x, r0.x, l(2) // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/ishl--sm4---asm-
  12: mul r0.yzw, v1.yyyy, cb0[r0.x + 164].xxyz
  13: mad r0.yzw, cb0[r0.x + 163].xxyz, v1.xxxx, r0.yyzw
  14: mad r0.yzw, cb0[r0.x + 165].xxyz, v1.zzzz, r0.yyzw
  15: add r0.xyz, r0.yzwy, cb0[r0.x + 166].xyzx
  16: mad r2.xy, r0.xyxx, cb0[183].zwzz, l(0.5000, 0.5000, 0.0000, 0.0000)
  // https://github.com/Microsoft/DirectXShaderCompiler/blob/main/docs/DXIL.rst#round-pi
  17: round_ni r2.xy, r2.xyxx
  18: mad r0.xy, r0.xyxx, cb0[183].zwzz, -r2.xyxx
  // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/min---ps
  19: min r2.zw, r0.xxxy, l(0, 0, 0, 0)
  20: add r3.xy, -r0.xyxx, l(1.0000, 1.0000, 0.0000, 0.0000)
  21: mad r2.zw, -r2.zzzw, r2.zzzw, r3.xxxy
  22: mul r3.xy, r3.xyxx, l(0.1600, 0.1600, 0.0000, 0.0000)
  23: add r2.zw, r2.zzzw, l(0.0000, 0.0000, 1.0000, 1.0000)
  24: mul r4.xy, r2.zwzz, l(0.1600, 0.1600, 0.0000, 0.0000)
  25: mov r5.z, r4.x
  26: max r2.zw, r0.xxxy, l(0, 0, 0, 0)
  27: add r6.xyzw, r0.xxyy, l(0.5000, 1.0000, 0.5000, 1.0000)
  28: mad r2.zw, -r2.zzzw, r2.zzzw, r6.yyyw
  29: add r2.zw, r2.zzzw, l(0.0000, 0.0000, 1.0000, 1.0000)
  30: mul r7.xy, r2.zwzz, l(0.1600, 0.1600, 0.0000, 0.0000)
  31: mov r3.z, r7.x
  32: mul r8.xyzw, r6.xxzz, r6.xxzz
  33: mul r4.xw, r6.yyyw, l(0.1600, 0.0000, 0.0000, 0.1600)
  34: mad r0.xy, r8.xzxx, l(0.5000, 0.5000, 0.0000, 0.0000), -r0.xyxx
  35: mul r2.zw, r8.yyyw, l(0.0000, 0.0000, 0.0800, 0.0800)
  36: mul r5.xy, r0.xyxx, l(0.1600, 0.1600, 0.0000, 0.0000)
  37: mov r5.w, r4.x
  38: mov r3.w, r2.z
  39: mov r7.w, r2.w
  40: add r6.xyzw, r3.zwxz, r5.zwxz
  41: div r0.xyw, r3.xzxw, r6.zwzy
  42: mov r7.z, r3.y
  43: add r0.xyw, r0.xyxw, l(-2.5000, -0.5000, 0.0000, 1.5000)
  44: mul r3.xyz, r0.yxwy, cb0[183].xxxx
  45: mov r4.z, r5.y
  46: add r0.xyw, r4.zyzw, r7.zyzw
  47: div r4.xyz, r7.zywz, r0.xywx
  48: add r4.xyz, r4.xyzx, l(-2.5000, -0.5000, 1.5000, 0.0000)
  49: mul r4.xyz, r4.xyzx, cb0[183].yyyy
  50: mov r3.w, r4.x
  51: mad r1.xy, r2.xyxx, cb0[183].xyxx, r3.ywyy
  52: dp3 r1.w, v2.xyzx, v2.xyzx
  53: rsq r1.w, r1.w
  54: mul r5.xyz, r1.wwww, v2.xyzx
  55: dp3 r1.w, r5.xyzx, cb0[106].xyzx
  56: add r1.w, -r1.w, l(2.0000)
  57: mul r2.z, r1.w, l(0.5000)
  58: round_ni r2.z, r2.z
  59: mad r1.w, -r2.z, l(2.0000), r1.w
  60: max r1.w, r1.w, l(1.0000)
  61: mad r0.z, cb0[182].w, r1.w, r0.z
  // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/sample-c-lz--sm4---asm-
  // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-texture
  // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-sampler
  // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-to-samplecmplevelzero
  // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-to-samplecmp
  // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/texture2d-samplecmp
  // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/texture2d-samplecmplevelzero
  // float Object.SampleCmp(
  // SamplerComparisonState S,
  // float Location,
  // float CompareValue,
  // [int Offset]
  // );
  62: sample_c_lz(texture2darray)(float,float,float,float) r1.w, r1.xyzx, t3.xxxx, s3, r0.z
  63: mul r7.xyzw, r0.xxxy, r6.zwyz
  64: mad r1.xy, r2.xyxx, cb0[183].xyxx, r3.xwxx
  65: mad r8.xy, r2.xyxx, cb0[183].xyxx, r3.zwzz
  66: sample_c_lz(texture2darray)(float,float,float,float) r0.x, r1.xyzx, t3.xxxx, s3, r0.z
  67: mov r8.z, r1.z
  68: mul r0.x, r0.x, r7.y
  69: mad r0.x, r7.x, r1.w, r0.x
  70: sample_c_lz(texture2darray)(float,float,float,float) r1.x, r8.xyzx, t3.xxxx, s3, r0.z
  71: mad r0.x, r7.z, r1.x, r0.x
  72: mov r4.w, r3.y
  73: mad r8.xy, r2.xyxx, cb0[183].xyxx, r4.wyww
  74: mad r1.xy, r2.xyxx, cb0[183].xyxx, r4.wzww
  75: mov r3.yw, r4.yyyz
  76: sample_c_lz(texture2darray)(float,float,float,float) r1.w, r8.xyzx, t3.xxxx, s3, r0.z
  77: mad r0.x, r7.w, r1.w, r0.x
  78: mul r4.xyzw, r0.yyww, r6.xyzw
  79: mul r0.y, r0.w, r6.y
  80: mad r8.xy, r2.xyxx, cb0[183].xyxx, r3.xyxx
  81: sample_c_lz(texture2darray)(float,float,float,float) r0.w, r8.xyzx, t3.xxxx, s3, r0.z
  82: mad r0.x, r4.x, r0.w, r0.x
  83: mad r8.xy, r2.xyxx, cb0[183].xyxx, r3.zyzz
  84: sample_c_lz(texture2darray)(float,float,float,float) r0.w, r8.xyzx, t3.xxxx, s3, r0.z
  85: mov r1.z, r8.z
  86: mad r0.x, r4.y, r0.w, r0.x
  87: sample_c_lz(texture2darray)(float,float,float,float) r0.w, r1.xyzx, t3.xxxx, s3, r0.z
  88: mad r0.x, r4.z, r0.w, r0.x
  89: mad r1.xy, r2.xyxx, cb0[183].xyxx, r3.xwxx
  90: mad r2.xy, r2.xyxx, cb0[183].xyxx, r3.zwzz
  91: sample_c_lz(texture2darray)(float,float,float,float) r0.w, r1.xyzx, t3.xxxx, s3, r0.z
  92: mov r2.z, r1.z
  93: sample_c_lz(texture2darray)(float,float,float,float) r0.z, r2.xyzx, t3.xxxx, s3, r0.z
  94: mad r0.x, r4.w, r0.w, r0.x
  95: mad r0.x, r0.y, r0.z, r0.x
  96: mad r0.yz, cb0[155].xxyx, v1.yyyy, v1.xxzx
  97: mad r0.yz, r0.yyzy, cb0[156].xxyx, cb0[156].zzwz
  // https://zhuanlan.zhihu.com/p/346324622 - 搜索:sample_indexable
  98: sample_indexable(texture2d)(float,float,float,float) r0.y, r0.yzyy, t0.yxzw, s0
  99: mul r0.x, r0.y, r0.x
 100: mul r0.xyz, r0.xxxx, cb0[107].xyzx
 // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/sample-b--sm4---asm-
 // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-to-samplebias
 101: sample_b(texture2d)(float,float,float,float) r1.xyzw, v4.xyxx, t5.xyzw, s5, cb0[191].y
 102: mul r2.xy, r1.xxxx, cb0[293].ywyy
 103: sample_b(texture2d)(float,float,float,float) r3.xyzw, v4.xyxx, t4.xyzw, s4, cb0[191].y
 104: add r0.w, -r3.w, l(1.0000)
 105: mad r0.w, cb0[293].x, r0.w, r2.x
 106: mad r1.x, cb0[293].z, r3.w, r2.y
 107: max r1.x, r1.x, l(0.0885)
 108: add r2.x, -r0.w, l(1.0000)
 109: mul r2.xyz, r2.xxxx, r3.xyzx
 110: mul r4.xyz, r0.xyzx, r2.xyzx
 111: dp3 r2.w, v3.xyzx, v3.xyzx
 112: rsq r2.w, r2.w
 113: mul r6.xyz, r2.wwww, v3.xyzx
 114: mul r7.xyz, r5.zxyz, r6.yzxy
 115: mad r7.xyz, r5.yzxy, r6.zxyz, -r7.xyzx
 116: mul r7.xyz, r7.xyzx, v3.wwww
 117: mad r1.yw, r1.wwwy, l(0.0000, 2.0079, 0.0000, 2.0079), l(0.0000, -1.0079, 0.0000, -1.0079)
 118: mul r7.xyz, r7.xyzx, r1.wwww
 119: mad r6.xyz, r1.yyyy, r6.xyzx, r7.xyzx
 // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dp2--sm4---asm-
 120: dp2 r1.y, r1.ywyy, r1.ywyy
 121: min r1.y, r1.y, l(1.0000)
 122: add r1.y, -r1.y, l(1.0000)
 123: sqrt r1.y, r1.y
 124: mad r5.xyz, r1.yyyy, r5.xyzx, r6.xyzx
 125: dp3_sat r1.y, r5.xyzx, cb0[106].xyzx
 126: mul r4.xyz, r1.yyyy, r4.xyzx
 127: add r3.xyz, r3.xyzx, l(-0.0400, -0.0400, -0.0400, 0.0000)
 128: max r1.w, r3.w, cb0[294].x
 129: mad r3.xyz, r0.wwww, r3.xyzx, l(0.0400, 0.0400, 0.0400, 0.0000)
 130: add r6.xyz, -v1.xyzx, cb0[9].xyzx
 131: dp3 r0.w, r6.xyzx, r6.xyzx
 132: rsq r2.w, r0.w
 133: mad r0.w, -r0.w, r2.w, cb0[151].x
 134: max r0.w, r0.w, l(0)
 135: mul r0.w, r0.w, cb0[151].w
 136: mul r0.w, r0.w, l(-1.4427)
 137: exp r0.w, r0.w
 138: mad r7.xyz, r6.xyzx, r2.wwww, cb0[106].xyzx
 139: mul r6.xyz, r2.wwww, r6.xyzx
 140: dp3 r2.w, r7.xyzx, r7.xyzx
 141: rsq r2.w, r2.w
 142: mul r7.xyz, r2.wwww, r7.xyzx
 143: dp3_sat r2.w, cb0[106].xyzx, r7.xyzx
 144: dp3_sat r3.w, r5.xyzx, r7.xyzx
 145: add r2.w, -r2.w, l(1.0000)
 146: mul r4.w, r2.w, r2.w
 147: mul r4.w, r4.w, r4.w
 148: mul r5.w, r2.w, r4.w
 149: mad r2.w, -r4.w, r2.w, l(1.0000)
 150: mad r7.xyz, r3.xyzx, r2.wwww, r5.wwww
 151: mul r0.xyz, r0.xyzx, r7.xyzx
 152: dp3 r2.w, r5.xyzx, r6.xyzx
 153: mad r4.w, -r1.x, r1.x, l(1.0000)
 154: mul r5.w, r1.x, r1.x
 155: mad r6.w, abs(r2.w), r4.w, r5.w
 156: mad r4.w, r1.y, r4.w, r5.w
 157: mul r4.w, abs(r2.w), r4.w
 158: mad r4.w, r1.y, r6.w, r4.w
 159: max r4.w, r4.w, l(0.0001)
 160: mul r6.w, r5.w, r5.w
 161: mad r6.w, r3.w, r6.w, -r3.w
 162: mad r3.w, r6.w, r3.w, l(1.0000)
 163: max r3.w, r3.w, l(0.0001)
 164: div r3.w, r5.w, r3.w
 165: mad r5.w, r5.w, l(-16.0000), l(-1.0000)
 166: exp r5.w, r5.w
 167: mul r1.y, r1.y, r3.w
 168: div r1.y, r1.y, r4.w
 169: mul r1.y, r3.w, r1.y
 170: mul r1.y, r1.y, l(0.5000)
 171: mad r0.xyz, r1.yyyy, r0.xyzx, r4.xyzx
 172: dp3 r1.y, -r6.xyzx, r5.xyzx
 173: add r1.y, r1.y, r1.y
 174: mad r4.xyz, r5.xyzx, -r1.yyyy, -r6.xyzx
 175: sample_l(texturecube)(float,float,float,float) r5.xyz, r5.xyzx, t2.xyzw, s2, l(6.0000)
 176: mul r2.xyz, r2.xyzx, r5.xyzx
 177: dp3 r1.y, r6.xyzx, cb0[106].xyzx
 178: mov_sat r1.y, -r1.y
 // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/log---ps
 179: log r1.y, r1.y
 180: mul r1.y, r1.y, cb0[152].w
 181: exp r1.y, r1.y
 182: mad r5.xy, -r1.xxxx, l(0.7500, 0.7000, 0.0000, 0.0000), l(0.9000, 1.7000, 0.0000, 0.0000)
 183: mul r3.w, r1.x, r5.y
 184: mad r6.xyzw, r1.xxxx, l(-1.0000, -0.0275, -0.2600, 0.0109), l(1.0000, 0.0455, 1.0417, -0.0417)
 185: mul r1.x, r3.w, l(6.0000)
 // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/sample-l--sm4---asm-
 186: sample_l(texturecube)(float,float,float,float) r4.xyz, r4.xyzx, t2.xyzw, s2, r1.x
 187: add r1.x, -abs(r2.w), l(1.0000)
 188: mul r3.w, r1.x, r1.x
 189: mul r3.w, r3.w, r3.w
 190: mul r1.x, r1.x, r3.w
 191: min r1.x, r1.x, r5.x
 192: mad r1.x, r1.x, r6.x, r6.y
 193: mad r5.xy, r1.xxxx, l(-1.0417, 1.0417, 0.0000, 0.0000), r6.zwzz
 194: mad r3.xyz, r3.xyzx, r5.xxxx, r5.yyyy
 195: mul r3.xyz, r4.xyzx, r3.xyzx
 196: div r4.xy, v5.xyxx, v5.zzzz
 197: sample_indexable(texture2d)(float,float,float,float) r1.x, r4.xyxx, t1.xyzw, s1
 198: min r1.x, r1.z, r1.x
 199: mul r2.xyz, r1.xxxx, r2.xyzx
 200: add r1.z, r1.x, abs(r2.w)
 201: log r1.z, abs(r1.z)
 202: mul r1.z, r1.z, r5.w
 203: exp r1.z, r1.z
 204: add r1.z, r1.z, l(-1.0000)
 205: add_sat r1.x, r1.x, r1.z
 206: mad r2.xyz, r3.xyzx, r1.xxxx, r2.xyzx
 207: mad r0.xyz, r2.xyzx, cb0[157].xyzx, r0.xyzx
 208: add r2.xyz, -cb0[150].xyzx, cb0[152].xyzx
 209: mad r1.xyz, r1.yyyy, r2.xyzx, cb0[150].xyzx
 210: add r1.xyz, -r0.xyzx, r1.xyzx
 211: add r2.x, v1.y, -cb0[151].y
 212: max r2.x, r2.x, l(0)
 213: mul r2.x, r2.x, cb0[151].z
 214: mul r2.x, r2.x, l(-1.4427)
 215: exp r2.x, r2.x
 216: mul r2.x, r2.x, cb0[150].w
 217: mul r0.w, r0.w, r2.x
 218: mad r0.xyz, r0.wwww, r1.xyzx, r0.xyzx
 219: mul o0.xyz, r1.wwww, r0.xyzx
 220: mov o0.w, r1.w
 221: ret

转换后的 VS/PS HLSL

VS

// ==== START HEADER COMMENTS ====
// THIS FILE IS AUTO-GENERATE by - jave.lin_dxbc2hlsl_tool
// Generate DateTime : 2022/7/8 10:50:56
// Shader Hash : 6e1ba2f7-6109162f-7a8af580-dc171056
// Shader Type : vs
// Shader Mode : vs_5_0
// ==== END HEADER COMMENTS ====

// CBuffers
// Usage : immediateIndexed
cbuffer cb0 : register(b0)
{
	float4 cb0_v0;
	float4 cb0_v1;
	float4 cb0_v2;
	float4 cb0_v3;
	float4 cb0_v4;
	float4 cb0_v5;
	float4 cb0_v6;
	float4 cb0_v7;
	float4 cb0_v8;
	float4 cb0_v9;
	float4 cb0_v10;
	float4 cb0_v11;
	float4 cb0_v12;
	float4 cb0_v13;
	float4 cb0_v14;
	float4 cb0_v15;
	float4 cb0_v16;
	float4 cb0_v17;
	float4 cb0_v18;
	float4 cb0_v19;
	float4 cb0_v20;
	float4 cb0_v21;
	float4 cb0_v22;
	float4 cb0_v23;
	float4 cb0_v24;
	float4 cb0_v25;
	float4 cb0_v26;
	float4 cb0_v27;
	float4 cb0_v28;
	float4 cb0_v29;
	float4 cb0_v30;
	float4 cb0_v31;
	float4 cb0_v32;
	float4 cb0_v33;
	float4 cb0_v34;
	float4 cb0_v35;
	float4 cb0_v36;
	float4 cb0_v37;
	float4 cb0_v38;
	float4 cb0_v39;
	float4 cb0_v40;
	float4 cb0_v41;
	float4 cb0_v42;
	float4 cb0_v43;
	float4 cb0_v44;
	float4 cb0_v45;
	float4 cb0_v46;
	float4 cb0_v47;
	float4 cb0_v48;
	float4 cb0_v49;
	float4 cb0_v50;
	float4 cb0_v51;
	float4 cb0_v52;
	float4 cb0_v53;
	float4 cb0_v54;
	float4 cb0_v55;
	float4 cb0_v56;
	float4 cb0_v57;
	float4 cb0_v58;
	float4 cb0_v59;
	float4 cb0_v60;
	float4 cb0_v61;
	float4 cb0_v62;
	float4 cb0_v63;
	float4 cb0_v64;
	float4 cb0_v65;
};
// Usage : immediateIndexed
cbuffer cb1 : register(b1)
{
	float4 cb1_v0;
};
// Usage : dynamic_indexed
cbuffer cb2 : register(b2)
{
	float4 cb2_v0;
	float4 cb2_v1;
	float4 cb2_v2;
	float4 cb2_v3;
	float4 cb2_v4;
	float4 cb2_v5;
	float4 cb2_v6;
	float4 cb2_v7;
	float4 cb2_v8;
	float4 cb2_v9;
	float4 cb2_v10;
	float4 cb2_v11;
	float4 cb2_v12;
	float4 cb2_v13;
	float4 cb2_v14;
};

// VS_INPUT
struct VS_INPUT
{
	float4 v0; // use channel : xyz
	float4 v1; // use channel : xyz
	float4 v2; // use channel : xyzw
	float4 v3; // use channel : xy
	float4 v4 : SV_InstanceID; // use channel : x
};

// VS_OUTPUT
struct VS_OUTPUT
{
	float4 v0 : SV_Position; // use channel : xyzw
	float4 v1; // use channel : xyz
	float4 v2; // use channel : xyz
	float4 v3; // use channel : xyzw
	float4 v4; // use channel : xy
	float4 v5; // use channel : xyz
};

// Temps Registers
float4 r0;
float4 r1;
float4 r2;

// Main func body - instruction list
VS_OUTPUT main(VS_INPUT IN)
{
	VS_OUTPUT OUT;
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/iadd--sm4---asm-
	r0.x = IN.v4.x + cb1[0].x;
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/ishl--sm4---asm-
	// jave.lin : 注意 dx93d 中不支持 位操作 https://www.gamedev.net/forums/topic/527821-bitwise-operation-in-hlsl/
	r0.x = int(r0.x) << int(3);
	r0.yzw = IN.v0.yyy * cb2[r0.x + 1].xyz;
	r0.yzw = cb2[r0.x + 0].xyz * IN.v0.xxx + r0.yzw;
	r0.yzw = cb2[r0.x + 2].xyz * IN.v0.zzz + r0.yzw;
	r0.yzw = r0.yzw + cb2[r0.x + 3].xyz;
	r1.xyzw = r0.zzzz * cb0[63].xyzw;
	r1.xyzw = cb0[62].xyzw * r0.yyyy + r1.xyzw;
	r1.xyzw = cb0[64].xyzw * r0.wwww + r1.xyzw;
	OUT.o1.xyz = r0.yzw;
	r1.xyzw = r1.xyzw + cb0[65].xyzw;
	OUT.o0.xyzw = r1.xyzw;
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dp3---ps
	r2.x = dot(IN.v1.xyz, cb2[r0.x + 4].xyz);
	r2.y = dot(IN.v1.xyz, cb2[r0.x + 5].xyz);
	r2.z = dot(IN.v1.xyz, cb2[r0.x + 6].xyz);
	r0.y = dot(r2.xyz, r2.xyz);
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/rsq---vs
	r0.y = 1.0 / r0.y;
	OUT.o2.xyz = r0.yyy * r2.xyz;
	r0.yzw = IN.v2.yyy * cb2[r0.x + 1].xyz;
	r0.yzw = cb2[r0.x + 0].xyz * IN.v2.xxx + r0.yzw;
	r0.xyz = cb2[r0.x + 2].xyz * IN.v2.zzz + r0.yzw;
	r0.w = dot(r0.xyz, r0.xyz);
	r0.w = 1.0 / r0.w;
	OUT.o3.xyz = r0.www * r0.xyz;
	OUT.o3.w = IN.v2.w;
	OUT.o4.xy = IN.v3.xy;
	r0.x = r1.y * cb0[10].x;
	r0.w = r0.x * float(0.5);
	r0.xz = r1.xw * float4(0.5, 0, 0.5, 0).xz;
	OUT.o5.z = r1.w;
	OUT.o5.xy = r0.zz + r0.xw;
	return OUT;
}

PS

// ==== START HEADER COMMENTS ====
// THIS FILE IS AUTO-GENERATE by - jave.lin_dxbc2hlsl_tool
// Generate DateTime : 2022/7/8 10:51:07
// Shader Hash : 8f0f7fc5-a32251a9-7c7b8456-dd4e6c69
// Shader Type : ps
// Shader Mode : ps_5_0
// ==== END HEADER COMMENTS ====

// CBuffers
// Usage : dynamic_indexed
cbuffer cb0 : register(b0)
{
	float4 cb0_v0;
	float4 cb0_v1;
	float4 cb0_v2;
	float4 cb0_v3;
	float4 cb0_v4;
	float4 cb0_v5;
	float4 cb0_v6;
	float4 cb0_v7;
	float4 cb0_v8;
	float4 cb0_v9;
	float4 cb0_v10;
	float4 cb0_v11;
	float4 cb0_v12;
	float4 cb0_v13;
	float4 cb0_v14;
	float4 cb0_v15;
	float4 cb0_v16;
	float4 cb0_v17;
	float4 cb0_v18;
	float4 cb0_v19;
	float4 cb0_v20;
	float4 cb0_v21;
	float4 cb0_v22;
	float4 cb0_v23;
	float4 cb0_v24;
	float4 cb0_v25;
	float4 cb0_v26;
	float4 cb0_v27;
	float4 cb0_v28;
	float4 cb0_v29;
	float4 cb0_v30;
	float4 cb0_v31;
	float4 cb0_v32;
	float4 cb0_v33;
	float4 cb0_v34;
	float4 cb0_v35;
	float4 cb0_v36;
	float4 cb0_v37;
	float4 cb0_v38;
	float4 cb0_v39;
	float4 cb0_v40;
	float4 cb0_v41;
	float4 cb0_v42;
	float4 cb0_v43;
	float4 cb0_v44;
	float4 cb0_v45;
	float4 cb0_v46;
	float4 cb0_v47;
	float4 cb0_v48;
	float4 cb0_v49;
	float4 cb0_v50;
	float4 cb0_v51;
	float4 cb0_v52;
	float4 cb0_v53;
	float4 cb0_v54;
	float4 cb0_v55;
	float4 cb0_v56;
	float4 cb0_v57;
	float4 cb0_v58;
	float4 cb0_v59;
	float4 cb0_v60;
	float4 cb0_v61;
	float4 cb0_v62;
	float4 cb0_v63;
	float4 cb0_v64;
	float4 cb0_v65;
	float4 cb0_v66;
	float4 cb0_v67;
	float4 cb0_v68;
	float4 cb0_v69;
	float4 cb0_v70;
	float4 cb0_v71;
	float4 cb0_v72;
	float4 cb0_v73;
	float4 cb0_v74;
	float4 cb0_v75;
	float4 cb0_v76;
	float4 cb0_v77;
	float4 cb0_v78;
	float4 cb0_v79;
	float4 cb0_v80;
	float4 cb0_v81;
	float4 cb0_v82;
	float4 cb0_v83;
	float4 cb0_v84;
	float4 cb0_v85;
	float4 cb0_v86;
	float4 cb0_v87;
	float4 cb0_v88;
	float4 cb0_v89;
	float4 cb0_v90;
	float4 cb0_v91;
	float4 cb0_v92;
	float4 cb0_v93;
	float4 cb0_v94;
	float4 cb0_v95;
	float4 cb0_v96;
	float4 cb0_v97;
	float4 cb0_v98;
	float4 cb0_v99;
	float4 cb0_v100;
	float4 cb0_v101;
	float4 cb0_v102;
	float4 cb0_v103;
	float4 cb0_v104;
	float4 cb0_v105;
	float4 cb0_v106;
	float4 cb0_v107;
	float4 cb0_v108;
	float4 cb0_v109;
	float4 cb0_v110;
	float4 cb0_v111;
	float4 cb0_v112;
	float4 cb0_v113;
	float4 cb0_v114;
	float4 cb0_v115;
	float4 cb0_v116;
	float4 cb0_v117;
	float4 cb0_v118;
	float4 cb0_v119;
	float4 cb0_v120;
	float4 cb0_v121;
	float4 cb0_v122;
	float4 cb0_v123;
	float4 cb0_v124;
	float4 cb0_v125;
	float4 cb0_v126;
	float4 cb0_v127;
	float4 cb0_v128;
	float4 cb0_v129;
	float4 cb0_v130;
	float4 cb0_v131;
	float4 cb0_v132;
	float4 cb0_v133;
	float4 cb0_v134;
	float4 cb0_v135;
	float4 cb0_v136;
	float4 cb0_v137;
	float4 cb0_v138;
	float4 cb0_v139;
	float4 cb0_v140;
	float4 cb0_v141;
	float4 cb0_v142;
	float4 cb0_v143;
	float4 cb0_v144;
	float4 cb0_v145;
	float4 cb0_v146;
	float4 cb0_v147;
	float4 cb0_v148;
	float4 cb0_v149;
	float4 cb0_v150;
	float4 cb0_v151;
	float4 cb0_v152;
	float4 cb0_v153;
	float4 cb0_v154;
	float4 cb0_v155;
	float4 cb0_v156;
	float4 cb0_v157;
	float4 cb0_v158;
	float4 cb0_v159;
	float4 cb0_v160;
	float4 cb0_v161;
	float4 cb0_v162;
	float4 cb0_v163;
	float4 cb0_v164;
	float4 cb0_v165;
	float4 cb0_v166;
	float4 cb0_v167;
	float4 cb0_v168;
	float4 cb0_v169;
	float4 cb0_v170;
	float4 cb0_v171;
	float4 cb0_v172;
	float4 cb0_v173;
	float4 cb0_v174;
	float4 cb0_v175;
	float4 cb0_v176;
	float4 cb0_v177;
	float4 cb0_v178;
	float4 cb0_v179;
	float4 cb0_v180;
	float4 cb0_v181;
	float4 cb0_v182;
	float4 cb0_v183;
	float4 cb0_v184;
	float4 cb0_v185;
	float4 cb0_v186;
	float4 cb0_v187;
	float4 cb0_v188;
	float4 cb0_v189;
	float4 cb0_v190;
	float4 cb0_v191;
	float4 cb0_v192;
	float4 cb0_v193;
	float4 cb0_v194;
	float4 cb0_v195;
	float4 cb0_v196;
	float4 cb0_v197;
	float4 cb0_v198;
	float4 cb0_v199;
	float4 cb0_v200;
	float4 cb0_v201;
	float4 cb0_v202;
	float4 cb0_v203;
	float4 cb0_v204;
	float4 cb0_v205;
	float4 cb0_v206;
	float4 cb0_v207;
	float4 cb0_v208;
	float4 cb0_v209;
	float4 cb0_v210;
	float4 cb0_v211;
	float4 cb0_v212;
	float4 cb0_v213;
	float4 cb0_v214;
	float4 cb0_v215;
	float4 cb0_v216;
	float4 cb0_v217;
	float4 cb0_v218;
	float4 cb0_v219;
	float4 cb0_v220;
	float4 cb0_v221;
	float4 cb0_v222;
	float4 cb0_v223;
	float4 cb0_v224;
	float4 cb0_v225;
	float4 cb0_v226;
	float4 cb0_v227;
	float4 cb0_v228;
	float4 cb0_v229;
	float4 cb0_v230;
	float4 cb0_v231;
	float4 cb0_v232;
	float4 cb0_v233;
	float4 cb0_v234;
	float4 cb0_v235;
	float4 cb0_v236;
	float4 cb0_v237;
	float4 cb0_v238;
	float4 cb0_v239;
	float4 cb0_v240;
	float4 cb0_v241;
	float4 cb0_v242;
	float4 cb0_v243;
	float4 cb0_v244;
	float4 cb0_v245;
	float4 cb0_v246;
	float4 cb0_v247;
	float4 cb0_v248;
	float4 cb0_v249;
	float4 cb0_v250;
	float4 cb0_v251;
	float4 cb0_v252;
	float4 cb0_v253;
	float4 cb0_v254;
	float4 cb0_v255;
	float4 cb0_v256;
	float4 cb0_v257;
	float4 cb0_v258;
	float4 cb0_v259;
	float4 cb0_v260;
	float4 cb0_v261;
	float4 cb0_v262;
	float4 cb0_v263;
	float4 cb0_v264;
	float4 cb0_v265;
	float4 cb0_v266;
	float4 cb0_v267;
	float4 cb0_v268;
	float4 cb0_v269;
	float4 cb0_v270;
	float4 cb0_v271;
	float4 cb0_v272;
	float4 cb0_v273;
	float4 cb0_v274;
	float4 cb0_v275;
	float4 cb0_v276;
	float4 cb0_v277;
	float4 cb0_v278;
	float4 cb0_v279;
	float4 cb0_v280;
	float4 cb0_v281;
	float4 cb0_v282;
	float4 cb0_v283;
	float4 cb0_v284;
	float4 cb0_v285;
	float4 cb0_v286;
	float4 cb0_v287;
	float4 cb0_v288;
	float4 cb0_v289;
	float4 cb0_v290;
	float4 cb0_v291;
	float4 cb0_v292;
	float4 cb0_v293;
	float4 cb0_v294;
};

// Samplers
Sampler s0; // default
Sampler s1; // default
Sampler s2; // default
Sampler s3; // comparison
Sampler s4; // default
Sampler s5; // default

// Resources
Texture2D t0; // float_float_float_float
Texture2D t1; // float_float_float_float
TextureCube t2; // float_float_float_float
Texture2DArray t3; // float_float_float_float
Texture2D t4; // float_float_float_float
Texture2D t5; // float_float_float_float

// PS_INPUT
struct PS_INPUT
{
	linear float4 v1; // use channel : xyz
	linear float4 v2; // use channel : xyz
	linear float4 v3; // use channel : xyzw
	linear float4 v4; // use channel : xy
	linear float4 v5; // use channel : xyz
};

// PS_OUTPUT
struct PS_OUTPUT
{
	float4 v0; // use channel : xyzw
};

// Temps Registers
float4 r0;
float4 r1;
float4 r2;
float4 r3;
float4 r4;
float4 r5;
float4 r6;
float4 r7;
float4 r8;

// Main func body - instruction list
PS_OUTPUT main(PS_INPUT IN)
{
	PS_OUTPUT OUT;
	r0.xyz = IN.v1.xyz + -cb0[179].xyz;
	r0.x = dot(r0.xyz, r0.xyz);
	r1.xyz = IN.v1.xyz + -cb0[180].xyz;
	r0.y = dot(r1.xyz, r1.xyz);
	r1.xyz = IN.v1.xyz + -cb0[181].xyz;
	r0.z = dot(r1.xyz, r1.xyz);
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/lt--sm4---asm-
	r0.xyz = step(r0.xyz, cb0[182].xyz);
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/movc--sm4---asm-
	r0.z = r0.z ? 2 : 3;
	r0.y = r0.y ? 1 : r0.z;
	r0.x = r0.x ? 0 : r0.y;
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/itof--sm4---asm-
	r1.z = float(r0.x);
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/ishl--sm4---asm-
	r0.x = int(r0.x) << int(2);
	r0.yzw = IN.v1.yyy * cb0[r0.x + 164].xyz;
	r0.yzw = cb0[r0.x + 163].xyz * IN.v1.xxx + r0.yzw;
	r0.yzw = cb0[r0.x + 165].xyz * IN.v1.zzz + r0.yzw;
	r0.xyz = r0.yzw + cb0[r0.x + 166].xyz;
	r2.xy = r0.xy * cb0[183].zw + float4(0.5, 0.5, 0, 0).xy;
	// https://github.com/Microsoft/DirectXShaderCompiler/blob/main/docs/DXIL.rst#round-pi
	r2.xy = round(r2.xy);
	r0.xy = r0.xy * cb0[183].zw + -r2.xy;
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/min---ps
	r2.zw = min(r0.xy, int4(0, 0, 0, 0).zw);
	r3.xy = -r0.xy + float4(1, 1, 0, 0).xy;
	r2.zw = -r2.zw * r2.zw + r3.xy;
	r3.xy = r3.xy * float4(0.16, 0.16, 0, 0).xy;
	r2.zw = r2.zw + float4(0, 0, 1, 1).zw;
	r4.xy = r2.zw * float4(0.16, 0.16, 0, 0).xy;
	r5.z = r4.x;
	r2.zw = max(r0.xy, int4(0, 0, 0, 0).zw);
	r6.xyzw = r0.xxyy + float4(0.5, 1, 0.5, 1).xyzw;
	r2.zw = -r2.zw * r2.zw + r6.yw;
	r2.zw = r2.zw + float4(0, 0, 1, 1).zw;
	r7.xy = r2.zw * float4(0.16, 0.16, 0, 0).xy;
	r3.z = r7.x;
	r8.xyzw = r6.xxzz * r6.xxzz;
	r4.xw = r6.yw * float4(0.16, 0, 0, 0.16).xw;
	r0.xy = r8.xz * float4(0.5, 0.5, 0, 0).xy + -r0.xy;
	r2.zw = r8.yw * float4(0, 0, 0.08, 0.08).zw;
	r5.xy = r0.xy * float4(0.16, 0.16, 0, 0).xy;
	r5.w = r4.x;
	r3.w = r2.z;
	r7.w = r2.w;
	r6.xyzw = r3.zwxz + r5.zwxz;
	r0.xyw = r3.xzw / r6.zwy;
	r7.z = r3.y;
	r0.xyw = r0.xyw + float4(-2.5, -0.5, 0, 1.5).xyw;
	r3.xyz = r0.yxw * cb0[183].xxx;
	r4.z = r5.y;
	r0.xyw = r4.zyw + r7.zyw;
	r4.xyz = r7.zyw / r0.xyw;
	r4.xyz = r4.xyz + float4(-2.5, -0.5, 1.5, 0).xyz;
	r4.xyz = r4.xyz * cb0[183].yyy;
	r3.w = r4.x;
	r1.xy = r2.xy * cb0[183].xy + r3.yw;
	r1.w = dot(IN.v2.xyz, IN.v2.xyz);
	r1.w = 1.0 / r1.w;
	r5.xyz = r1.www * IN.v2.xyz;
	r1.w = dot(r5.xyz, cb0[106].xyz);
	r1.w = -r1.w + float(2);
	r2.z = r1.w * float(0.5);
	r2.z = round(r2.z);
	r1.w = -r2.z * float(2) + r1.w;
	r1.w = max(r1.w, float(1));
	r0.z = cb0[182].w * r1.w + r0.z;
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/sample-c-lz--sm4---asm-
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-texture
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-sampler
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-to-samplecmplevelzero
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-to-samplecmp
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/texture2d-samplecmp
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/texture2d-samplecmplevelzero
	// float Object.SampleCmp(
	// SamplerComparisonState S,
	// float Location,
	// float CompareValue,
	// [int Offset]
	// );
	r1.w = t3.SampleCmp(s3, r1.xyz, r0.z, 0); // texture2darray
	r7.xyzw = r0.xxxy * r6.zwyz;
	r1.xy = r2.xy * cb0[183].xy + r3.xw;
	r8.xy = r2.xy * cb0[183].xy + r3.zw;
	r0.x = t3.SampleCmp(s3, r1.xyz, r0.z, 0); // texture2darray
	r8.z = r1.z;
	r0.x = r0.x * r7.y;
	r0.x = r7.x * r1.w + r0.x;
	r1.x = t3.SampleCmp(s3, r8.xyz, r0.z, 0); // texture2darray
	r0.x = r7.z * r1.x + r0.x;
	r4.w = r3.y;
	r8.xy = r2.xy * cb0[183].xy + r4.wy;
	r1.xy = r2.xy * cb0[183].xy + r4.wz;
	r3.yw = r4.yz;
	r1.w = t3.SampleCmp(s3, r8.xyz, r0.z, 0); // texture2darray
	r0.x = r7.w * r1.w + r0.x;
	r4.xyzw = r0.yyww * r6.xyzw;
	r0.y = r0.w * r6.y;
	r8.xy = r2.xy * cb0[183].xy + r3.xy;
	r0.w = t3.SampleCmp(s3, r8.xyz, r0.z, 0); // texture2darray
	r0.x = r4.x * r0.w + r0.x;
	r8.xy = r2.xy * cb0[183].xy + r3.zy;
	r0.w = t3.SampleCmp(s3, r8.xyz, r0.z, 0); // texture2darray
	r1.z = r8.z;
	r0.x = r4.y * r0.w + r0.x;
	r0.w = t3.SampleCmp(s3, r1.xyz, r0.z, 0); // texture2darray
	r0.x = r4.z * r0.w + r0.x;
	r1.xy = r2.xy * cb0[183].xy + r3.xw;
	r2.xy = r2.xy * cb0[183].xy + r3.zw;
	r0.w = t3.SampleCmp(s3, r1.xyz, r0.z, 0); // texture2darray
	r2.z = r1.z;
	r0.z = t3.SampleCmp(s3, r2.xyz, r0.z, 0); // texture2darray
	r0.x = r4.w * r0.w + r0.x;
	r0.x = r0.y * r0.z + r0.x;
	r0.yz = cb0[155].xy * IN.v1.yy + IN.v1.xz;
	r0.yz = r0.yz * cb0[156].xy + cb0[156].zw;
	// https://zhuanlan.zhihu.com/p/346324622 - 搜索:sample_indexable
	r0.y = t0.Sample(s0, r0.yz); // texture2d
	r0.x = r0.y * r0.x;
	r0.xyz = r0.xxx * cb0[107].xyz;
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/sample-b--sm4---asm-
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-to-samplebias
	r1.xyzw = t5.Sample(s5, IN.v4.xy, cb0[191].y); // texture2d
	r2.xy = r1.xx * cb0[293].yw;
	r3.xyzw = t4.Sample(s4, IN.v4.xy, cb0[191].y); // texture2d
	r0.w = -r3.w + float(1);
	r0.w = cb0[293].x * r0.w + r2.x;
	r1.x = cb0[293].z * r3.w + r2.y;
	r1.x = max(r1.x, float(0.0885));
	r2.x = -r0.w + float(1);
	r2.xyz = r2.xxx * r3.xyz;
	r4.xyz = r0.xyz * r2.xyz;
	r2.w = dot(IN.v3.xyz, IN.v3.xyz);
	r2.w = 1.0 / r2.w;
	r6.xyz = r2.www * IN.v3.xyz;
	r7.xyz = r5.zxy * r6.yzx;
	r7.xyz = r5.yzx * r6.zxy + -r7.xyz;
	r7.xyz = r7.xyz * IN.v3.www;
	r1.yw = r1.wy * float4(0, 2.0079, 0, 2.0079).yw + float4(0, -1.0079, 0, -1.0079).yw;
	r7.xyz = r7.xyz * r1.www;
	r6.xyz = r1.yyy * r6.xyz + r7.xyz;
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dp2--sm4---asm-
	r1.y = dot(r1.yw, r1.yw);
	r1.y = min(r1.y, float(1));
	r1.y = -r1.y + float(1);
	r1.y = sqrt(r1.y);
	r5.xyz = r1.yyy * r5.xyz + r6.xyz;
	r1.y = saturate(dot(r5.xyz, cb0[106].xyz));
	r4.xyz = r1.yyy * r4.xyz;
	r3.xyz = r3.xyz + float4(-0.04, -0.04, -0.04, 0).xyz;
	r1.w = max(r3.w, cb0[294].x);
	r3.xyz = r0.www * r3.xyz + float4(0.04, 0.04, 0.04, 0).xyz;
	r6.xyz = IN.v1.xyz + cb0[9].xyz;
	r0.w = dot(r6.xyz, r6.xyz);
	r2.w = 1.0 / r0.w;
	r0.w = -r0.w * r2.w + cb0[151].x;
	r0.w = max(r0.w, 0);
	r0.w = r0.w * cb0[151].w;
	r0.w = r0.w * float(-1.4427);
	r0.w = pow(float4(2, 2, 2, 2).w, r0.w);
	r7.xyz = r6.xyz * r2.www + cb0[106].xyz;
	r6.xyz = r2.www * r6.xyz;
	r2.w = dot(r7.xyz, r7.xyz);
	r2.w = 1.0 / r2.w;
	r7.xyz = r2.www * r7.xyz;
	r2.w = saturate(dot(cb0[106].xyz, r7.xyz));
	r3.w = saturate(dot(r5.xyz, r7.xyz));
	r2.w = -r2.w + float(1);
	r4.w = r2.w * r2.w;
	r4.w = r4.w * r4.w;
	r5.w = r2.w * r4.w;
	r2.w = -r4.w * r2.w + float(1);
	r7.xyz = r3.xyz * r2.www + r5.www;
	r0.xyz = r0.xyz * r7.xyz;
	r2.w = dot(r5.xyz, r6.xyz);
	r4.w = -r1.x * r1.x + float(1);
	r5.w = r1.x * r1.x;
	r6.w = abs(r2.w) * r4.w + r5.w;
	r4.w = r1.y * r4.w + r5.w;
	r4.w = abs(r2.w) * r4.w;
	r4.w = r1.y * r6.w + r4.w;
	r4.w = max(r4.w, float(0.0001));
	r6.w = r5.w * r5.w;
	r6.w = r3.w * r6.w + -r3.w;
	r3.w = r6.w * r3.w + float(1);
	r3.w = max(r3.w, float(0.0001));
	r3.w = r5.w / r3.w;
	r5.w = r5.w * float(-16) + float(-1);
	r5.w = pow(float4(2, 2, 2, 2).w, r5.w);
	r1.y = r1.y * r3.w;
	r1.y = r1.y / r4.w;
	r1.y = r3.w * r1.y;
	r1.y = r1.y * float(0.5);
	r0.xyz = r1.yyy * r0.xyz + r4.xyz;
	r1.y = dot(-r6.xyz, r5.xyz);
	r1.y = r1.y + r1.y;
	r4.xyz = r5.xyz * -r1.yyy + -r6.xyz;
	r2.xyz = r2.xyz * r5.xyz;
	r1.y = dot(r6.xyz, cb0[106].xyz);
	r1.y = saturate(-r1.y);
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/log---ps
	r1.y = log(r1.y);
	r1.y = r1.y * cb0[152].w;
	r1.y = pow(float4(2, 2, 2, 2).y, r1.y);
	r5.xy = -r1.xx * float4(0.75, 0.7, 0, 0).xy + float4(0.9, 1.7, 0, 0).xy;
	r3.w = r1.x * r5.y;
	r6.xyzw = r1.xxxx * float4(-1, -0.0275, -0.26, 0.0109).xyzw + float4(1, 0.0455, 1.0417, -0.0417).xyzw;
	r1.x = r3.w * float(6);
	// https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/sample-l--sm4---asm-
	r4.xyz = t2.Sample(s2, r4.xyz, r1.x); // texturecube
	r1.x = -abs(r2.w) + float(1);
	r3.w = r1.x * r1.x;
	r3.w = r3.w * r3.w;
	r1.x = r1.x * r3.w;
	r1.x = min(r1.x, r5.x);
	r1.x = r1.x * r6.x + r6.y;
	r5.xy = r1.xx * float4(-1.0417, 1.0417, 0, 0).xy + r6.zw;
	r3.xyz = r3.xyz * r5.xxx + r5.yyy;
	r3.xyz = r4.xyz * r3.xyz;
	r4.xy = IN.v5.xy / IN.v5.zz;
	r1.x = t1.Sample(s1, r4.xy); // texture2d
	r1.x = min(r1.z, r1.x);
	r2.xyz = r1.xxx * r2.xyz;
	r1.z = r1.x + abs(r2.w);
	r1.z = log(abs(r1.z));
	r1.z = r1.z * r5.w;
	r1.z = pow(float4(2, 2, 2, 2).z, r1.z);
	r1.z = r1.z + float(-1);
	r1.x = saturate(r1.x + r1.z);
	r2.xyz = r3.xyz * r1.xxx + r2.xyz;
	r0.xyz = r2.xyz * cb0[157].xyz + r0.xyz;
	r2.xyz = -cb0[150].xyz + cb0[152].xyz;
	r1.xyz = r1.yyy * r2.xyz + cb0[150].xyz;
	r1.xyz = -r0.xyz + r1.xyz;
	r2.x = IN.v1.y + -cb0[151].y;
	r2.x = max(r2.x, 0);
	r2.x = r2.x * cb0[151].z;
	r2.x = r2.x * float(-1.4427);
	r2.x = pow(float4(2, 2, 2, 2).x, r2.x);
	r2.x = r2.x * cb0[150].w;
	r0.w = r0.w * r2.x;
	r0.xyz = r0.www * r1.xyz + r0.xyz;
	OUT.o0.xyz = r1.www * r0.xyz;
	OUT.o0.w = r1.w;
	return OUT;
}


扩展

(后续有空回来再整)

  • 指令中所有的参数部分使用到分量根据指令,或是结果寄存器使用的分量来适合
  • 提取、输出DXBC的注释
  • 可以输出每一个转换后的HLSL对应的DXBC(放在 HLSL 代码上一句),便于检测转换无误
  • 自动检测出 mul(pos, matrix) 或是 mul(matrix, pos) 的语句转换
  • 自动检测出 normalize 的语句转换

整个工具写下来,貌似没有发现如何能将 shader 中的 meta 数据提取 RenderDoc, GPA 中有些游戏的 shader 可以提取到,有些不行

不过能提取到的,都可以直接再 RenderDoc 或是 GPA 中提取到 HLSL 也就不需要我写的这个工具处理了

所以我这个工具最终还是为了只提供了 DXBC,然后一键转换 HLSL,减少一部分的代码机械化的转换


Project

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值