DXBC2HLSL Tool
时间:2022-09-07 09:30:00
文章目录
- 目的
- 工作制作思路
- 效果演示
-
- 示例结果
-
- 准备好 DXBC VS/PS
- 转换后的 VS/PS HLSL
- 扩展
- Project
目的
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
- Test_DXBC_2_HLSL_Tool_URP_Unity_2022.1.4f1