DXBC2HLSL Tool


目的

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

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值