DXBC2HLSL Tool-程序员宅基地

技术标签: unity  工具集收藏  DXBC  HLSL  DXBC2HLSL  unity-shader  


目的

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/linjf520/article/details/125673533

智能推荐

navicat导入 sqlserver备份文件(bak文件)步骤_sql server nacvcat 导入bak-程序员宅基地

文章浏览阅读4.4w次,点赞3次,收藏23次。点击选择sqlserver备份,然后下面空白区右键选择(从文件还原),选择你的bak备份文件当作为设备操作如下操作生成的sql预览为:use master;RESTORE DATABASE [CardStore]FROM [CardStore]WITH FILE = 1, REPLACE,--MOVE 'CardStore' TO 'D:\Progra..._sql server nacvcat 导入bak

使用DEM和矢量数据绘制地图_高程数据和矢量数据在同一张地图上显示-程序员宅基地

文章浏览阅读2.2k次。要生成一副图片地图,可以使用ArcGIS、QGIS等工具,也可以使用代码实现。我这里介绍的当然是用代码实现,而且是利用开源软件。毕竟桌面版GIS工具的介绍太多了,大家的地图都做的很漂亮。用代码渲染地图就不得不提到GDAL和Mapnik。GDAL是处理GIS数据最常用的库,这里我们就要用到gdaldem处理DEM数据。Mapnik是渲染地图的最基本工具,我们要使用它来生成地图。要绘制一个地图首先需要定义清楚绘制什么样的地图,是地形图还是街道图还是卫星影像图,然后根据地图内容的需求将需要的各种类型空间数据准_高程数据和矢量数据在同一张地图上显示

自相关函数确定延迟量matlab,基于MATLAB的自相关函数基音检测的优化-程序员宅基地

文章浏览阅读1k次。系统软件与软件工程本栏目责任编辑:谢媛媛Computer Knowledge and Technology 电脑知识与技术第5卷第36期(2009年12月)基于MATLAB 的自相关函数基音检测的优化王丽(青海师范大学物理系语音与图像研究室,青海西宁810008)摘要:基音是语音信号的一个重要参数,它是指发浊音时声带振动所引起的周期性。基音的提取是语音处理中的重要任务。目前对基音的检测方法有很多,...

iOS_逆向_使用Cycript_cycript chooe-程序员宅基地

文章浏览阅读1k次。在cydia搜索 MTerminal,并安装在cydia搜索 Cycript,并安装未完待续_cycript chooe

一、T100接口开发基础_t100标准接口-程序员宅基地

文章浏览阅读1.7k次。T100接口开发基础_t100标准接口

css文字图标(阿里图标)使用及引入方式_阿里巴巴如何往字体图标中新加样式-程序员宅基地

文章浏览阅读2k次,点赞5次,收藏16次。css文字图标(阿里图标)几种使用及引入方式_阿里巴巴如何往字体图标中新加样式

随便推点

server精简版代理意外终止 sql_MSSQLSERVER 服务意外终止 错误ID:19019 和 错误ID:7034...-程序员宅基地

文章浏览阅读741次。1、查询SQL中的所有表: Select TABLE_NAME FROM 数据库名称.INFORMATION_SCHEMA.TABLES Where TABLE_TYPE='BASE TABLE' 执行之后,就可以看到数据库中所有属于自己建的表的名称 2、查询SQL中所有表及列: Select dbo.sysobjects.name as Table_name, dbo.syscolumns.na..._sql 19019

maven常用的依赖配置,tomcat和jetty双配置_jetty maven依赖-程序员宅基地

文章浏览阅读817次。4.0.0 com.lrlz lrlz-platform 0.0.1-SNAPSHOT pom nexus-releases Local Nexus Repository http://oa.lrlz.com:8081/nexus/content/repositories/releases thirdp_jetty maven依赖

BigData_A_A_03-YARN-资源管理和任务调度(2)共同好友(spark)_不做你共同好友资源分享-程序员宅基地

文章浏览阅读206次。楔子最近看了hadoop求共同好友,也了解一些spark基本编程,感觉 思路 一致,可以试试sparkdemo是否是直接好友,因为存在这种情况,他俩是直接好友,但是他俩同时也是别人的间接好友,这种情况排除,因此两次flatMap,第二次就是为了排除第一次 中包含的他俩是直接好友的情况,但是这种存在一个问题,排除使用的是集合的操作,如果数据量大,可能有问题。import java.uti..._不做你共同好友资源分享

CSDN Apollo课程_apollo学校课程为什么找不到-程序员宅基地

文章浏览阅读390次。【无人驾驶及Apollo开源平台技术教程】无人驾驶及无人驾驶平台Apollo开源技术视频培训课程,通过展望无人驾驶行业,介绍Apollo自动驾驶开源平台的发展历程以及Apollo自动驾驶核心技术模块,让更多对自动驾驶感兴趣的开发者了解自动驾驶的核心技术模块,更快更好地使用Apollo开源代码。https://edu.csdn.net/course/play/8301/171021【Apollo控制在环仿真技术分享】在百度 Apollo 无人驾驶开源平台中,5.0发布了基于学习的动力学模型和控_apollo学校课程为什么找不到

Java解析csv文件_java template.csv-程序员宅基地

文章浏览阅读7.8k次。背景:产品希望能让客户上传csv格式的文件,Java后端解析文件并将记录更新到mysql数据库。上网搜了下api,于是找到了opencsv-2.3.jar这个jar包,pom依赖如下:&lt;!-- https://mvnrepository.com/artifact/net.sf.opencsv/opencsv --&gt;&lt;dependency&gt; &lt;groupId&..._java template.csv

android wear 处理器,联发科推Android Wear平台可穿戴处理器-程序员宅基地

文章浏览阅读83次。据外媒VR-Zone报道,联发科日前发布了全新的低功耗处理器MT2601,专门为谷歌AndroidWear平台打造。联发科推AndroidWear平台可穿戴处理器(图片来自AndroidCaotic)据悉,MT2601支持AndroidWear操作系统,是一套为可穿戴设备提供的完整的解决方案。设备厂商可以借助该解决方案将软硬件整合到可穿戴设备上,实现AndroidWear操作系统的各种功..._mt2601 adobe

推荐文章

热门文章

相关标签