Anatomy of Nvidia's Voxel Cone Tracing Code (VXGI)

Here is diffuse cone tracing code.

  1 //
  2  Generated by Microsoft (R) HLSL Shader Compiler 10.0.10011.16384
  3  Buffer Definitions: 
  4  cbuffer AbstractTracingCB
  5  {
  6    struct VxgiAbstractTracingConstants
  7    {
  8 
  9        float4 rOpacityTextureSize;    // Offset:    0
 10        float4 rEmittanceTextureSize;  // Offset:   16
 11        float4 ClipmapAnchor;          // Offset:   32
 12        float4 SceneBoundaryLower;     // Offset:   48
 13        float4 SceneBoundaryUpper;     // Offset:   64
 14        float4 ClipmapCenter;          // Offset:   80
 15        float4 TracingToroidalOffset;  // Offset:   96
 16        float EmittancePackingStride;  // Offset:  112
 17        float FinestVoxelSize;         // Offset:  116
 18        float StackTextureSize;        // Offset:  120
 19        float rNearestLevel0Boundary;  // Offset:  124
 20        float MaxMipmapLevel;          // Offset:  128
 21        float rEmittanceStorageScale;  // Offset:  132
 22        float rClipmapSizeWorld;       // Offset:  136
 23        uint Use6DOpacity;             // Offset:  140
 24    } g_VxgiAbstractTracingCB;         // Offset:    0 Size:   144
 25  }
 26  cbuffer TranslationCB
 27  {
 28    float4 g_VxgiTranslationParameters[13];// Offset:    0 Size:   208
 29    float4 g_VxgiTranslationParameters2[13];// Offset:  208 Size:   208
 30  }
 31  cbuffer cBuiltinTracingParameters
 32  {
 33    struct GBufferParameters
 34    {
 35 
 36        row_major float4x4 viewProjMatrix;// Offset:    0
 37        row_major float4x4 viewProjMatrixInv;// Offset:   64
 38        row_major float4x4 viewMatrix; // Offset:  128
 39        float4 cameraPosition;         // Offset:  192
 40        float4 uvToView;               // Offset:  208
 41        float2 gbufferSize;            // Offset:  224
 42        float2 gbufferSizeInv;         // Offset:  232
 43        float2 viewportOrigin;         // Offset:  240
 44        float2 viewportSize;           // Offset:  248
 45        float2 viewportSizeInv;        // Offset:  256
 46        float2 firstSamplePosition;    // Offset:  264
 47        float projectionA;             // Offset:  272
 48        float projectionB;             // Offset:  276
 49        float depthScale;              // Offset:  280
 50        float depthBias;               // Offset:  284
 51        float normalScale;             // Offset:  288
 52        float normalBias;              // Offset:  292
 53        float radiusToScreen;          // Offset:  296
 54    } g_GBuffer;                       // Offset:    0 Size:   300
 55 
 56    struct GBufferParameters
 57    {
 58 
 59        row_major float4x4 viewProjMatrix;// Offset:  304
 60        row_major float4x4 viewProjMatrixInv;// Offset:  368
 61        row_major float4x4 viewMatrix; // Offset:  432
 62        float4 cameraPosition;         // Offset:  496
 63        float4 uvToView;               // Offset:  512
 64        float2 gbufferSize;            // Offset:  528
 65        float2 gbufferSizeInv;         // Offset:  536
 66        float2 viewportOrigin;         // Offset:  544
 67        float2 viewportSize;           // Offset:  552
 68        float2 viewportSizeInv;        // Offset:  560
 69        float2 firstSamplePosition;    // Offset:  568
 70        float projectionA;             // Offset:  576
 71        float projectionB;             // Offset:  580
 72        float depthScale;              // Offset:  584
 73        float depthBias;               // Offset:  588
 74        float normalScale;             // Offset:  592
 75        float normalBias;              // Offset:  596
 76        float radiusToScreen;          // Offset:  600
 77    } g_PreviousGBuffer;               // Offset:  304 Size:   300 [unused]
 78    row_major float4x4 g_ReprojectionMatrix;// Offset:  608 Size:    64 [unused]
 79    float4 g_AmbientColor;             // Offset:  672 Size:    16
 80    float4 g_DownsampleScale;          // Offset:  688 Size:    16
 81    float4 g_DebugParams;              // Offset:  704 Size:    16 [unused]
 82    float4 g_EnvironmentMapTint;       // Offset:  720 Size:    16
 83    float4 g_RefinementGridResolution; // Offset:  736 Size:    16 [unused]
 84    float4 g_BackgroundColor;          // Offset:  752 Size:    16 [unused]
 85    int2 g_PixelToSave;                // Offset:  768 Size:     8 [unused]
 86    int2 g_RandomOffset;               // Offset:  776 Size:     8
 87    float2 g_GridOrigin;               // Offset:  784 Size:     8 [unused]
 88    float g_ConeFactor;                // Offset:  792 Size:     4
 89    float g_TracingStep;               // Offset:  796 Size:     4
 90    float g_OpacityCorrectionFactor;   // Offset:  800 Size:     4
 91    int g_MaxSamples;                  // Offset:  804 Size:     4
 92    int g_NumCones;                    // Offset:  808 Size:     4 [unused]
 93    float g_rNumCones;                 // Offset:  812 Size:     4
 94    float g_EmittanceScale;            // Offset:  816 Size:     4
 95    float g_EnvironmentMapResolution;  // Offset:  820 Size:     4
 96    float g_MaxEnvironmentMapMipLevel; // Offset:  824 Size:     4
 97    float g_NormalOffsetFactor;        // Offset:  828 Size:     4
 98    float g_AmbientAttenuationFactor;  // Offset:  832 Size:     4
 99    uint g_FlipOpacityDirections;      // Offset:  836 Size:     4
100    float g_InitialOffsetBias;         // Offset:  840 Size:     4
101    float g_InitialOffsetDistanceFactor;// Offset:  844 Size:     4
102    uint g_EnableSpecularRandomOffsets;// Offset:  848 Size:     4 [unused]
103    uint g_NumDiscontinuityLevels;     // Offset:  852 Size:     4 [unused]
104    float g_TemporalReprojectionWeight;// Offset:  856 Size:     4 [unused]
105    float g_TangentJitterScale;        // Offset:  860 Size:     4 [unused]
106    float g_DepthDeltaSign;            // Offset:  864 Size:     4 [unused]
107    float g_ReprojectionDepthWeightScale;// Offset:  868 Size:     4 [unused]
108    float g_ReprojectionNormalWeightExponent;// Offset:  872 Size:     4 [unused]
109    float g_InterpolationWeightThreshold;// Offset:  876 Size:     4 [unused]
110    uint g_EnableRefinement;           // Offset:  880 Size:     4 [unused]
111    float g_AmbientScale;              // Offset:  884 Size:     4
112    float g_AmbientBias;               // Offset:  888 Size:     4
113    float g_AmbientPower;              // Offset:  892 Size:     4
114    float g_AmbientDistanceDarkening;  // Offset:  896 Size:     4
115    int g_AltSettingsStencilMask;      // Offset:  900 Size:     4
116    int g_AltSettingsStencilRefValue;  // Offset:  904 Size:     4
117    float g_AltInitialOffsetBias;      // Offset:  908 Size:     4
118    float g_AltInitialOffsetDistanceFactor;// Offset:  912 Size:     4
119    float g_AltNormalOffsetFactor;     // Offset:  916 Size:     4
120    float g_AltTracingStep;            // Offset:  920 Size:     4
121    float g_SSAO_SurfaceBias;          // Offset:  924 Size:     4 [unused]
122    float g_SSAO_RadiusWorld;          // Offset:  928 Size:     4 [unused]
123    float g_SSAO_rBackgroundViewDepth; // Offset:  932 Size:     4 [unused]
124    float g_SSAO_CoarseAO;             // Offset:  936 Size:     4 [unused]
125    float g_SSAO_PowerExponent;        // Offset:  940 Size:     4 [unused]
126  }
127  Resource Bindings:
128  Name                                 Type  Format         Dim Slot Elements
129  ------------------------------ ---------- ------- ----------- ---- --------
130  s_VoxelTextureSampler             sampler      NA          NA    0        1
131  s_EnvironmentMapSampler           sampler      NA          NA   11        1
132  g_DepthBuffer                     texture  float4          2d    0        1
133  g_TargetFlatNormal                texture  float4          2d    3        1
134  g_TargetStencil                   texture   uint2          2d    4        1
135  t_OpacityMap_Pos                  texture  float4          3d    6        1
136  t_OpacityMap_Neg                  texture  float4          3d    7        1
137  t_ConeDirectionMap                texture  float4     2darray   10        1
138  t_EnvironmentMap                  texture  float4        cube   11        1
139  t_EmittanceEven                   texture  float4          3d   12        1
140  t_EmittanceOdd                    texture  float4          3d   15        1
141  AbstractTracingCB                 cbuffer      NA          NA    0        1
142  TranslationCB                     cbuffer      NA          NA    1        1
143  cBuiltinTracingParameters         cbuffer      NA          NA    2        1
144  Input signature:
145  Name                 Index   Mask Register SysValue  Format   Used
146  -------------------- ----- ------ -------- -------- ------- ------
147  TEXCOORD                 0   xy          0     NONE   float       
148  INSTANCEID               0     z         0     NONE   float     z 
149  RAY                      0   xyzw        1     NONE   float       
150  SV_Position              0   xyzw        2      POS   float   xy  
151  Output signature:
152  Name                 Index   Mask Register SysValue  Format   Used
153  -------------------- ----- ------ -------- -------- ------- ------
154  SV_Target                0   xyzw        0   TARGET   float   xyzw
155  SV_Target                1   xyzw        1   TARGET   float   xyzw
156  SV_Target                2   xyzw        2   TARGET   float   xyzw
157 
158 0x00000000: ps_5_0
159 0x00000008: dcl_globalFlags refactoringAllowed
160 0x0000000C: dcl_constantbuffer cb0[9], immediateIndexed
161 0x0000001C: dcl_constantbuffer cb1[26], dynamicIndexed
162 0x0000002C: dcl_constantbuffer cb2[58], immediateIndexed
163 0x0000003C: dcl_sampler s_VoxelTextureSampler, mode_default
164 0x00000048: dcl_sampler s_EnvironmentMapSampler, mode_default
165 0x00000054: dcl_resource_texture2d (float,float,float,float) g_DepthBuffer
166 0x00000064: dcl_resource_texture2d (float,float,float,float) g_TargetFlatNormal
167 0x00000074: dcl_resource_texture2d (uint,uint,uint,uint) g_TargetStencil
168 0x00000084: dcl_resource_texture3d (float,float,float,float) t_OpacityMap_Pos
169 0x00000094: dcl_resource_texture3d (float,float,float,float) t_OpacityMap_Neg
170 0x000000A4: dcl_resource_texture2darray (float,float,float,float) t_ConeDirectionMap
171 0x000000B4: dcl_resource_texturecube (float,float,float,float) t_EnvironmentMap
172 0x000000C4: dcl_resource_texture3d (float,float,float,float) t_EmittanceEven
173 0x000000D4: dcl_resource_texture3d (float,float,float,float) t_EmittanceOdd
174 0x000000E4: dcl_input_ps linear v0.z
175 0x000000F0: dcl_input_ps_siv linear noperspective v2.xy, position
176 0x00000100: dcl_output o0.xyzw
177 0x0000010C: dcl_output o1.xyzw
178 0x00000118: dcl_output o2.xyzw
179 0x00000124: dcl_temps 19
180 
181 0x0000012C: lt r0.xy, l(1.000000, 1.000000, 0.000000, 0.000000), g_DownsampleScale.xyxx
182 0x00000158: and r0.x, r0.y, r0.x
183 0x00000174: round_ni r0.yz, v2.xxyx
184 0x00000188: itof r1.xy, g_RandomOffset.zwzz
185 0x000001A0: add r1.xy, r0.yzyy, r1.xyxx
186 0x000001BC: mul r1.xy, r1.xyxx, g_DownsampleScale.zwzz
187 0x000001DC: frc r1.xy, r1.xyxx
188 0x000001F0: mul r1.xy, r1.xyxx, g_DownsampleScale.xyxx
189 0x00000210: round_ni r1.xy, r1.xyxx
190 0x00000224: add r0.w, -r1.x, g_DownsampleScale.x
191 0x00000248: mad r0.w, r0.z, g_DownsampleScale.y, r0.w
192 0x00000270: mad r1.x, r0.y, g_DownsampleScale.x, r1.y
193 0x00000298: add r0.w, r0.w, firstSamplePosition.w
194 0x000002B8: add r1.x, r1.x, firstSamplePosition.z
195 0x000002D8: add r1.y, r0.w, l(-1.000000)
196 0x000002F4: movc r0.xw, r0.xxxx, r1.xxxy, v2.xxxy
197 0x00000318: ftoi r1.xy, r0.xwxx
198 0x0000032C: mov r1.zw, l(0,0,0,0)
199 
200 // load depth and normal
201 // r2 = {depth, normal.x, normal.y, normal.z}
202 0x0000034C: ld_indexable(texture2d)(float,float,float,float) r2.x, r1.xyww, g_DepthBuffer.xyzw
203 0x00000370: ld_indexable(texture2d)(float,float,float,float) r2.yzw, r1.xyww, g_TargetFlatNormal.wxyz
204 0x00000394: mad r2.x, r2.x, depthScale, depthBias
205 0x000003C0: mad r2.yzw, r2.yyzw, normalScale.xxxx, normalBias.yyyy
206 0x000003EC: dp3 r3.x, r2.yzwy, r2.yzwy
207 0x00000408: sqrt r3.x, r3.x
208 0x0000041C: div r2.yzw, r2.yyzw, r3.xxxx                             // normalize
209 0x00000438: ge r3.x, l(0.000000), r3.x
210 0x00000454: movc r2.yzw, r3.xxxx, l(0,0,0,0), r2.yyzw
211 
212 // convert screen position to world space
213 // r3.xyz = world space position
214 // r0.xw  = {screenX, screenY} [-1,1]
215 0x00000484: add r0.xw, r0.xxxw, -viewportOrigin.xxxy
216 0x000004A8: mul r0.xw, r0.xxxw, viewportSizeInv.xxxy
217 0x000004C8: mad r0.x, r0.x, l(2.000000), l(-1.000000)
218 0x000004EC: mad r0.w, -r0.w, l(2.000000), l(1.000000)
219 0x00000514: mul r3.xyzw, r0.wwww, viewProjMatrixInv.xyzw
220 0x00000534: mad r3.xyzw, r0.xxxx, viewProjMatrixInv.xyzw, r3.xyzw
221 0x0000055C: mad r3.xyzw, r2.xxxx, viewProjMatrixInv.xyzw, r3.xyzw
222 0x00000584: add r3.xyzw, r3.xyzw, viewProjMatrixInv.xyzw
223 0x000005A4: div r3.xyz, r3.xyzx, r3.wwww
224 
225 // calculate distance from clipmap center
226 0x000005C0: add r4.xyz, r3.xyzx, -ClipmapAnchor.xyzx
227 0x000005E4: max r0.x, |r4.z|, |r4.y|
228 0x00000608: max r0.x, r0.x, |r4.x|                 // r0.x = max distance from clipmap center
229 0x00000628: add r0.w, -r0.x, ClipmapAnchor.w
230 0x0000064C: mul r0.w, r0.w, rClipmapSizeWorld.z    // r0.w = (ClipmapAnchor.w - r0.x) * rClipmapSizeWorld
231 0x0000066C: mul_sat r0.w, r0.w, l(4.000000)        // r0.w = saturate(4 * (ClipmapAnchor.w - r0.x) * rClipmapSizeWorld)
232 // r0.x = max distance
233 // r0.w = saturate(4 * (ClipmapAnchor.w - r0.x) * rClipmapSizeWorld)
234 // r4 = offset from clipmap center
235 
236 // check if normal and depth is valid
237 // r2.x = is valid
238 0x00000688: and r4.xyz, r2.yzwy, l(0x7f800000, 0x7f800000, 0x7f800000, 0)   // fetch exponent part
239 0x000006B0: ieq r5.xyz, r4.xyzx, l(0, 0, 0, 0)
240 0x000006D8: and r2.x, r5.y, r5.x
241 0x000006F4: and r2.x, r5.z, r2.x                                            // check if all exponent part is 0
242 0x00000710: ieq r4.xyz, r4.xyzx, l(0x7f800000, 0x7f800000, 0x7f800000, 0)
243 0x00000738: or r3.w, r4.y, r4.x
244 0x00000754: or r3.w, r4.z, r3.w
245 0x00000770: or r2.x, r2.x, r3.w
246 0x0000078C: not r2.x, r2.x
247 0x000007A0: ne r3.w, r0.w, l(0.000000)
248 0x000007BC: and r2.x, r2.x, r3.w
249 
250 // calculate indirect diffuse light
251 0x000007D8: if_nz r2.x
252 // normalize normal
253 0x000007E4:   ftou r4.z, v0.z                     // r4.z = instance id
254 0x000007F8:   dp3 r2.x, r2.yzwy, r2.yzwy          // r2.x = dot(normal, normal)
255 0x00000814:   rsq r2.x, r2.x                      // r2.x = 1 / length(normal)
256 0x00000828:   mul r5.xyz, r2.xxxx, r2.yzwy        // r5.xyz = normalize(normal)
257 
258 // calculate local coordinate system
259 // r5 = normal
260 // r6 = tangent
261 // r7 = bitangent
262 0x00000844:   mov r6.xyz, |r5.xyzx|                          // r6.xyz = |normalize(normal)|
263 0x0000085C:   max r3.w, r6.z, r6.y
264 0x00000878:   max r3.w, r3.w, r6.x                           // r3.w = max3(normalize(normal))
265 0x00000894:   mad r7.xyz, -r2.zyyz, r2.xxxx, -r5.zzyz        // r7.xyz = -r2.zyy / |normal| - r5.zzy
266 0x000008C0:   lt r8.xyz, l(0.000000, 0.000000, 0.000000, 0.000000), r5.xyzx
267 0x000008E8:   lt r9.xyz, r5.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000)
268 0x00000910:   iadd r8.xyz, -r8.xyzx, r9.xyzx
269 0x00000930:   itof r8.xyz, r8.xyzx
270 0x00000944:   eq r9.xy, r6.xyxx, r3.wwww
271 0x00000960:   mul r7.xyz, r7.xyzx, r8.xyzx
272 0x0000097C:   mov r6.w, r7.y
273 0x00000990:   mov r7.w, r6.z
274 0x000009A4:   movc r6.yzw, r9.yyyy, r6.yywy, r7.wwwz
275 0x000009C8:   mov r7.yz, r6.xxxx
276 0x000009DC:   movc r6.xyz, r9.xxxx, r7.xyzx, r6.yzwy
277 0x00000A00:   dp3 r3.w, r6.xyzx, r6.xyzx
278 0x00000A1C:   rsq r3.w, r3.w
279 0x00000A30:   mul r6.xyz, r3.wwww, r6.xyzx                       // r6.xyz = normalize(r6.xyz)
280 0x00000A4C:   mul r7.xyz, r5.yzxy, r6.zxyz
281 0x00000A68:   mad r7.xyz, r6.yzxy, r5.zxyz, -r7.xyzx             // r7.xyz = cross(r6.xyz, r5.xyz)
282 0x00000A90:   ftoi r0.yz, r0.yyzy
283 0x00000AA4:   iadd r0.yz, r0.yyzy, g_RandomOffset.zzwz
284 0x00000AC4:   and r4.xy, r0.yzyy, l(3, 3, 0, 0)                  // r4.xy is useless because color is the same
285 0x00000AEC:   mov r4.w, l(0)                                     // r4.w = 0
286 
287 // get cone direction from texture (what a stupid way!)
288 // r4.xyz = normalized cone direction in world space
289 0x00000B00:   ld_indexable(texture2darray)(float,float,float,float) r4.xyzw, r4.xyzw, t_ConeDirectionMap.xyzw // r4.z = instance id = cone index, r4.xy is useless 
290 0x00000B24:   mul r5.xyz, r5.xyzx, r4.yyyy                       // r5.xyz = r5.xyz * r4.y
291 0x00000B40:   mad r5.xyz, r4.xxxx, r6.xyzx, r5.xyzx              // r5.xyz = r4.x * r6.xyz + r5.xyz * r4.y
292 0x00000B64:   mad r4.xyz, r4.zzzz, r7.xyzx, r5.xyzx              // r4.xyz = r4.x * r6.xyz + r4.y * r5.xyz + r4.z * r7.xyz
293 0x00000B88:   dp3 r0.y, r4.xyzx, r4.xyzx
294 0x00000BA4:   rsq r0.y, r0.y
295 0x00000BB8:   mul r4.xyz, r0.yyyy, r4.xyzx                       // r4.xyz = normalized cone direction
296 0x00000BD4:   dp2 r0.x, rNearestLevel0Boundary.wwww, r0.xxxx     // r0.x = 0, rNearestLevel0Boundary = 0
297 0x00000BF4:   max r0.x, r0.x, l(1.000000)                        // r0.x = 1
298 0x00000C10:   mul r0.y, r4.w, r0.x                               // r0.y = 0
299 
300 // set cone tracing parameter
301 // r1 = {g_InitialOffsetBias, g_InitialOffsetDistanceFactor, g_NormalOffsetFactor, g_TracingStep}
302 //    = {2, 1, 0.5, 0.5}
303 0x00000C2C:   if_nz g_AltSettingsStencilMask
304 0x00000C3C:     ld_indexable(texture2d)(uint,uint,uint,uint) r0.z, r1.xyzw, g_TargetStencil.xzyw
305 0x00000C60:     and r0.z, r0.z, g_AltSettingsStencilMask
306 0x00000C80:     ieq r0.z, r0.z, g_AltSettingsStencilRefValue
307 0x00000CA0:     mov r1.xy, (g_InitialOffsetBias,g_InitialOffsetDistanceFactor,g_InitialOffsetBias,g_InitialOffsetBias)
308 0x00000CB8:     mov r1.z, g_NormalOffsetFactor
309 0x00000CD0:     mov r1.w, g_TracingStep
310 0x00000CE8:     movc r1.x, r0.z, g_AltInitialOffsetBias, r1.x
311 0x00000D10:     movc r1.yzw, r0.zzzz, (g_AltInitialOffsetDistanceFactor,g_AltInitialOffsetDistanceFactor,g_AltNormalOffsetFactor,g_AltTracingStep), r1.yyzw
312 0x00000D38:   else 
313 0x00000D3C:     mov r1.xy, (g_InitialOffsetBias,g_InitialOffsetDistanceFactor,g_InitialOffsetBias,g_InitialOffsetBias)
314 0x00000D54:     mov r1.z, g_NormalOffsetFactor
315 0x00000D6C:     mov r1.w, g_TracingStep
316 0x00000D84:   endif 
317 
318 // compute initial offset
319 // g_AmbientAttenuationFactor = 0.04
320 // g_InitialOffsetBias = 2
321 // g_InitialOffsetDistanceFactor = 1
322 // g_TracingStep = 0.5
323 // g_NormalOffsetFactor = 0.5
324 // r0.xy = {3,0}
325 0x00000D88:   log r0.z, r0.x                                // r0.x = 1
326 0x00000D9C:   mul r0.z, r0.z, g_AmbientDistanceDarkening
327 0x00000DBC:   exp r0.z, r0.z
328 0x00000DD0:   mul r0.z, r0.z, g_AmbientAttenuationFactor    // r0.z = g_AmbientAttenuationFactor * r0.x ^ g_AmbientDistanceDarkening = 0.04 * r0.x ^ -0.25 = 0.04
329 0x00000DF0:   itof r3.w, g_MaxSamples                       // g_MaxSamples = 128
330 0x00000E08:   mad r0.x, r0.x, r1.y, r1.x                    // r0.x = r0.x * g_InitialOffsetDistanceFactor + g_InitialOffsetBias = 3
331 0x00000E2C:   mad r0.x, r0.y, g_TracingStep, r0.x           // r0.x = r0.y * g_TracingStep + r0.x = 3
332 // r0.z = AO scale
333 
334 // offset 3*FinestVoxelSize from surface point
335 0x00000E54:   mad r2.xyz, r2.yzwy, r2.xxxx, -r4.xyzx        // r2.xyz = normalize(normal) - r4.xyz
336 0x00000E7C:   mad r1.xyz, r1.zzzz, r2.xyzx, r4.xyzx         // r1.xyz = g_NormalOffsetFactor * r2.xyz + r4.xyz = 0.5 * (normal + direction)
337 0x00000EA0:   dp3 r0.y, r1.xyzx, r1.xyzx
338 0x00000EBC:   rsq r0.y, r0.y
339 0x00000ED0:   mul r1.xyz, r0.yyyy, r1.xyzx                  // r1.xyz = normalize(r1.xyz)
340 0x00000EEC:   mul r0.y, r0.x, FinestVoxelSize.y             // r0.y = r0.x * FinestVoxelSize = 3 * 8 = 24
341 0x00000F0C:   mad r1.xyz, r1.xyzx, r0.yyyy, r3.xyzx         // r1.xyz = r1.xyz * 24 + world position
342 0x00000F30:   mul r0.y, rEmittanceStorageScale.y, g_EmittanceScale // r0.y = 1.0 * 0.52
343 // r1.xyz = start trace position = position + 3 * FinestVoxelSize * 0.5 * (normal + direction)
344 
345 // set cone tracing step
346 // g_ConeFactor = 2 * sin a
347 // d' = d * (2 + 2*sin a) / (2 - 2*sin a) = d * (2 + g_ConeFactor) / (2 - g_ConeFactor)
348 0x00000F54:   add r2.x, -g_ConeFactor, l(2.000000)           // r2.x = 2 - g_ConeFactor = 2 - 0.87 = 1.13
349 0x00000F78:   add r2.y, g_ConeFactor, l(2.000000)            // r2.y = 2 + g_ConeFactor = 2.87
350 0x00000F98:   div r2.y, r2.y, r2.x
351 0x00000FB4:   add r2.y, r2.y, l(-1.000000)                   // r2.y = (2 + g_ConeFactor) / (2 - g_ConeFactor) -1 = 1.53
352 0x00000FD0:   add r2.z, MaxMipmapLevel.x, l(1.000000)        // r2.z = MaxMipmapLevel + 1 = 10
353 0x00000FF0:   mul r2.w, FinestVoxelSize.y, FinestVoxelSize.y // r2.w = FinestVoxelSize * FinestVoxelSize = 64
354 // r2 = {2 - g_ConeFactor, step factor, MaxMipmapLevel + 1, FinestVoxelSize * FinestVoxelSize}
355 //    = {1.13, 1.53, 10, 64}
356 
357 // initialize indirect color data
358 0x00001014:   movc r3.xyz, g_FlipOpacityDirections.yyyy, -r4.xyzx, r4.xyzx    // r3.xyz = cone tracing direction
359 0x00001040:   lt r5.xyz, l(0.000000, 0.000000, 0.000000, 0.000000), r4.xyzx
360 0x00001068:   and r4.w, r5.x, l(0x40400000)
361 0x00001084:   movc r5.xy, r5.yzyy, l(4.000000,5.000000,0,0), l(1.000000,2.000000,0,0)
362 0x000010C0:   mul r6.x, r4.w, EmittancePackingStride.x
363 0x000010E0:   mul r5.xy, r5.xyxx, EmittancePackingStride.xxxx
364 0x00001100:   mov r6.yz, l(0,0,0,0)
365 0x00001120:   mov r5.zw, l(0,0,0,0)
366 0x00001140:   mov r8.xyz, r1.xyzx                                    // r8.xyz = start trace position in world space
367 0x00001154:   mov r4.w, Use6DOpacity.w
368 0x0000116C:   mov r6.w, l(1.000000)
369 0x00001180:   mov r7.xyzw, l(0,0,0,1.000000)
370 0x000011A0:   mov r8.w, l(1.000000)
371 0x000011B4:   mov r9.z, r0.x                                         // r9.z = 3, distance in voxel count
372 0x000011C8:   mov r9.xyw, l(0,1.000000,0,0)
373 // r6.w = 1       = latest transparency
374 // r7 = {0,0,0,1} = {indirect color.rgb, last step transparency}
375 // r8.w = 1       = last two step transparency
376 // r9 = {0,1,3,0}
377 
378 // cone trace loop
379 // r8.xyz = sample position in world space
380 0x000011E8:   loop 
381 0x000011EC:     ge r10.x, r9.w, r3.w                                 // if(iteration >= 128) break;
382 0x00001208:     breakc_nz r10.x
383 
384 0x00001214:     add r10.xyz, r8.xyzx, -ClipmapAnchor.xyzx            // r10.xyz = offset from clipmap center
385 0x00001238:     max r10.y, |r10.z|, |r10.y|
386 0x0000125C:     max r10.x, r10.y, |r10.x|                            // r10.x = distance from clipmap center = max(r10.xyz)
387 0x0000127C:     dp2 r10.y, rNearestLevel0Boundary.wwww, r10.xxxx     // rNearestLevel0Boundary = 0
388 0x0000129C:     max r10.y, r10.y, l(1.000000)                        // r10.y = 1
389 // r10.y = 1
390 
391 // calculate sample level
392 // r9.z  = distance measured by voxel count
393 // r10.y = 1
394 // r11.x = level
395 0x000012B8:     mul r10.z, r9.z, g_ConeFactor                        // r10.z = r9.z * g_ConeFactor = r9.z * 0.87
396 0x000012D8:     lt r10.w, r10.z, r10.y                               // if (r10.z < 1)
397 0x000012F4:     movc r10.z, r10.w, r10.y, r10.z                      //    r10.z = 1
398 0x00001318:     log r11.x, r10.z                                     // r11.x = level
399 0x0000132C:     ge r11.y, r11.x, r2.z                                // if(level > MaxMipmapLevel + 1)
400 0x00001348:     if_nz r11.y                                          //      break
401 0x00001354:       break 
402 0x00001358:     endif
403 // r10.z = diameter measured by voxel count
404 // r10.w = is diameter less that 1 voxel
405 
406 // r10.x = max axis distance from clipmap center - distance from ray origin
407 0x0000135C:     add r10.x, -r10.x, ClipmapAnchor.w                   // r10.x = 8128 - manhattan distance
408 0x00001380:     mul r11.y, r10.z, FinestVoxelSize.y                  // r11.y = diameter in world coordinate
409 0x000013A0:     mad r10.x, -r10.z, FinestVoxelSize.y, r10.x          // r10.x = max axis distance from clipmap center - diameter
410 0x000013CC:     lt r11.z, r10.x, l(0.000000)                         // if (max axis distance < diameter)
411 0x000013E8:     if_nz r11.z                                          //      break
412 0x000013F4:       break 
413 0x000013F8:     endif 
414 
415 // check if sample position is out of scene bounding box
416 0x000013FC:     mad r12.xyz, r10.zzzz, FinestVoxelSize.yyyy, r8.xyzx // r12.xyz = sample position + diameter
417 0x00001424:     lt r12.xyz, r12.xyzx, SceneBoundaryLower.xyzx
418 0x00001444:     or r11.z, r12.y, r12.x
419 0x00001460:     or r11.z, r12.z, r11.z
420 0x0000147C:     mad r12.xyz, -r10.zzzz, FinestVoxelSize.yyyy, r8.xyzx
421 0x000014A8:     lt r12.xyz, SceneBoundaryUpper.xyzx, r12.xyzx
422 0x000014C8:     or r11.w, r12.y, r12.x
423 0x000014E4:     or r11.w, r12.z, r11.w
424 0x00001500:     or r11.z, r11.w, r11.z
425 0x0000151C:     if_nz r11.z                                          // if out of box, break
426 0x00001528:       break 
427 0x0000152C:     endif 
428 
429 // calculate weight for lower and higher levels
430 // r6.w  = transparency for environment map
431 // r9.z  = distance measured by voxel count
432 // r10.x = manhattan distance from clipmap center - distance from ray origin
433 // r11.x = level
434 // r9.x  = old AO
435 // r10.w = is diameter less that one voxel
436 0x00001530:     mad r11.z, r9.z, l(2.000000), r10.y                  // r11.z = distance in voxels * 2 + 1
437 0x00001554:     div r11.z, r11.z, r2.x                               // r11.z /= 2 - g_ConeFactor
438 0x00001570:     add r10.y, r9.z, r10.y                               // r10.y = r9.z + 1
439 0x0000158C:     max r10.y, r10.y, r11.z                              // r10.y = max(distance + 1, (distance * 2 + 1)/(2 - g_ConeFactor))
440 0x000015A8:     add r10.y, -r9.z, r10.y                              // r10.y = max(distance + 1, (distance * 2 + 1)/(2 - g_ConeFactor)) - distance
441 0x000015C8:     mul r11.z, r2.y, r9.z                                // r11.z = step in voxels = distance * step factor
442 0x000015E4:     movc r10.y, r10.w, r10.y, r11.z                      // r10.y = is diameter less that one voxel ? r10.y : original step in voxels
443 0x00001608:     mul r10.w, r1.w, r10.y                               // r10.w = g_TracingStep * original step in voxels = step in voxels
444 0x00001624:     mul r11.z, r0.z, -r9.z                               // r11.z = 0.04 * -distance measured by voxel count
445 0x00001644:     mul r11.z, r11.z, l(1.442695)                        // r11.z = 0.04 * -distance measured by voxel count * 1.442695
446 0x00001660:     exp r11.z, r11.z                                     // r11.z = new weight = 2 ^ (0.04 * -distance measured by voxel count * 1.442695)
447 0x00001674:     add r11.w, r9.y, -r11.z                              // r11.w = delta weight = old weight - new weight = r9.y - 2 ^ (0.04 * -distance measured by voxel count * 1.442695)
448 0x00001694:     mad r11.w, r11.w, r6.w, r9.x                         // r11.w = AO = delta weight * transparency for env map + old AO
449 0x000016B8:     div_sat r10.x, r10.x, r11.y                          // r11.y = distance in world coordinate
450 0x000016D4:     round_ni r12.x, r11.x                                // r12.x = floor(level)
451 0x000016E8:     add r12.y, r11.x, -r12.x                             // r12.y = level - floor(level) = weight for upper level
452 0x00001708:     add r12.z, -r12.y, l(1.000000)                       // r12.z = 1 - r12.y = weight for lower level
453 0x00001728:     mul r12.z, r10.x, r12.z                              // r12.z = weight for lower level * r10.x
454 0x00001744:     lt r11.x, MaxMipmapLevel.x, r11.x                    // r11.x = MaxMipmapLevel < level
455 0x00001764:     mul r10.x, r10.x, r12.y                              // r10.x = weight for upper level
456 0x00001780:     movc r10.x, r11.x, l(0), r10.x                       // r10.x = (level > MaxMipmapLevel) ? 0 : r10.x
457 0x000017A4:     ftoi r11.x, r12.x                                    // r11.x = int(floor(level))
458 // r10.y = original step in voxels
459 // r10.w = step in voxels
460 //       = g_TracingStep * (max(distance + 1, (distance * 2 + 1)/(2 - g_ConeFactor)) - distance), if diameter less that one voxel
461 //       = g_TracingStep * ((2 + g_ConeFactor) / (2 - g_ConeFactor)-1) * distance
462 // r11.z = new weight = 2 ^ (0.04 * -distance measured by voxel count * 1.442695)
463 // r11.w = AO
464 //       = old AO + (old weight - new weight) * transparency for env map
465 //       = old AO + (old weight - new weight) * transparency for env map
466 
467 // calculate clipmap address
468 // r11.x = lower level
469 // r8.xyz = sample position
470 0x000017B8:     add r13.xyz, r8.xyzx, -ClipmapCenter.xyzx            // r13.xyz = sample position - clipmap center
471 0x000017DC:     mad r14.xyz, r13.xyzx, g_VxgiTranslationParameters[r11.x].xxxx, l(0.500000, 0.500000, 0.500000, 0.000000) // r14.xyz = 0.5
472 0x00001814:     add r14.xyz, r14.xyzx, g_VxgiTranslationParameters2[r11.x].xyzx                                           // r14.xyz = r14.xyz + g_VxgiTranslationParameters2[level]
473 0x0000183C:     frc r14.xyz, r14.xyzx
474 0x00001850:     mul r15.xy, r14.xyxx, g_VxgiTranslationParameters[r11.x].yyyy                                             // r15.xy = r14.xy * clip map resolution
475 0x00001874:     mad r15.z, r14.z, g_VxgiTranslationParameters[r11.x].y, g_VxgiTranslationParameters[r11.x].z              // r15.z = r14.z * clip map resolution + clip map offset
476 0x000018A8:     mul r15.xyz, r15.xyzx, rOpacityTextureSize.xyzx                                                           // r15.xyz = texture coordinate
477 0x000018C8:     mad r16.xy, r14.xyxx, g_VxgiTranslationParameters[r11.x].yyyy, l(1.000000, 0.000000, 0.000000, 0.000000)
478 0x00001900:     mad r16.z, r14.z, g_VxgiTranslationParameters[r11.x].y, g_VxgiTranslationParameters[r11.x].w
479 0x00001934:     mul r14.xyz, r16.xyzx, rEmittanceTextureSize.xyzx
480 0x00001954:     add r12.y, r12.x, l(1.000000)
481 0x00001970:     ftoi r12.y, r12.y
482 
483 0x00001984:     mad r13.xyz, r13.xyzx, g_VxgiTranslationParameters[r12.y].xxxx, l(0.500000, 0.500000, 0.500000, 0.000000)
484 0x000019BC:     add r13.xyz, r13.xyzx, g_VxgiTranslationParameters2[r12.y].xyzx
485 0x000019E4:     frc r13.xyz, r13.xyzx
486 0x000019F8:     mul r16.xy, r13.xyxx, g_VxgiTranslationParameters[r12.y].yyyy
487 0x00001A1C:     mad r16.z, r13.z, g_VxgiTranslationParameters[r12.y].y, g_VxgiTranslationParameters[r12.y].z
488 0x00001A50:     mul r16.xyz, r16.xyzx, rOpacityTextureSize.xyzx
489 0x00001A70:     mad r17.xy, r13.xyxx, g_VxgiTranslationParameters[r12.y].yyyy, l(1.000000, 0.000000, 0.000000, 0.000000)
490 0x00001AA8:     mad r17.z, r13.z, g_VxgiTranslationParameters[r12.y].y, g_VxgiTranslationParameters[r12.y].w
491 0x00001ADC:     mul r13.xyz, r17.xyzx, rEmittanceTextureSize.xyzx
492 
493 // sample lower opacity clipmap
494 // r3.xyz = cone tracing direction
495 // r12.y = low opacity
496 // r15.y = is occupied
497 0x00001AFC:     sample_l_indexable(texture3d)(float,float,float,float) r17.xyzw, r15.xyzx, t_OpacityMap_Pos.xyzw, s_VoxelTextureSampler, l(0.000000)
498 0x00001B30:     if_nz r4.w         // if(Use6DOpacity)
499 0x00001B3C:       sample_l_indexable(texture3d)(float,float,float,float) r15.xyz, r15.xyzx, t_OpacityMap_Neg.xyzw, s_VoxelTextureSampler, l(0.000000)
500 0x00001B70:       mul_sat r18.xyz, -r3.xyzx, r17.xyzx                                  // r18.xyz = -1 * cone direction.xyz * opacity_pos.xyz
501 0x00001B90:       add r12.y, r18.y, r18.x
502 0x00001BAC:       add r12.y, r18.z, r12.y                                              // r12.y = r18.x + r18.y + r18.z
503 0x00001BC8:       mul_sat r15.xyz, r3.xyzx, r15.xyzx                                   // r15.xyz = cone direction.xyz * opacity_neg.xyz
504 0x00001BE4:       add r12.w, r15.y, r15.x
505 0x00001C00:       add r12.w, r15.z, r12.w                                              // r12.w = r15.x + r15.y + r15.z
506 0x00001C1C:       min r12.yw, r12.yyyw, l(0.000000, 1.000000, 0.000000, 1.000000)      // r12.yw = min(r12.yw, 1)
507 0x00001C44:       add r12.y, r12.w, r12.y
508 0x00001C60:     else 
509 0x00001C64:       mul_sat r15.xyz, |r4.xyzx|, r17.xyzx
510 0x00001C84:       add r12.w, r15.y, r15.x
511 0x00001CA0:       add r12.w, r15.z, r12.w                                              // r12.w = dot(|direction.xyz|, opacity.xyz)
512 0x00001CBC:       min r12.y, r12.w, l(1.000000)                                        // r12.y = lower opacity
513 0x00001CD8:     endif 
514 0x00001CDC:     ne r15.y, r17.w, l(0.000000)                                           // r15.y = if lower voxel is occupied
515 
516 // sample higher opacity clipmap
517 // r12.w = high opacity
518 // r15.x = is occupied
519 0x00001CF8:     sample_l_indexable(texture3d)(float,float,float,float) r17.xyzw, r16.xyzx, t_OpacityMap_Pos.xyzw, s_VoxelTextureSampler, l(0.000000)
520 0x00001D2C:     if_nz r4.w         // if(Use6DOpacity)
521 0x00001D38:       sample_l_indexable(texture3d)(float,float,float,float) r16.xyz, r16.xyzx, t_OpacityMap_Neg.xyzw, s_VoxelTextureSampler, l(0.000000)
522 0x00001D6C:       mul_sat r18.xyz, -r3.xyzx, r17.xyzx
523 0x00001D8C:       add r12.w, r18.y, r18.x
524 0x00001DA8:       add r12.w, r18.z, r12.w
525 0x00001DC4:       min r12.w, r12.w, l(1.000000)
526 0x00001DE0:       mul_sat r16.xyz, r3.xyzx, r16.xyzx
527 0x00001DFC:       add r13.w, r16.y, r16.x
528 0x00001E18:       add r13.w, r16.z, r13.w
529 0x00001E34:       min r13.w, r13.w, l(1.000000)
530 0x00001E50:       add r12.w, r12.w, r13.w
531 0x00001E6C:     else 
532 0x00001E70:       mul_sat r16.xyz, |r4.xyzx|, r17.xyzx
533 0x00001E90:       add r13.w, r16.y, r16.x
534 0x00001EAC:       add r13.w, r16.z, r13.w
535 0x00001EC8:       min r12.w, r13.w, l(1.000000)                                        // r12.w = higher opacity
536 0x00001EE4:     endif 
537 0x00001EE8:     ne r15.x, r17.w, l(0.000000)                                           // r15.x = if higher voxel is occupied
538 
539 // interpolate opacity
540 // r12.x = floor(level)
541 // r12.y = low opacity
542 // r12.z = low weight
543 // r12.w = high opacity
544 // r10.x = high weight
545 0x00001F04:     mul r12.w, r10.x, r12.w                                                // r12.w = higher opacity * weight
546 0x00001F20:     mad_sat r12.y, r12.y, r12.z, r12.w                                     // r12.y = interpolated opacity
547 0x00001F44:     add r12.x, r12.x, r12.x                                                // r12.x = floor(level) * 2
548 0x00001F60:     exp r12.x, r12.x                                                       // r12.x = 2 ^ (floor(level) * 2)
549 0x00001F74:     mul r12.x, r2.w, r12.x                                                 // r12.x = r12.x * FinestVoxelSize * FinestVoxelSize = r12.x * 64
550 0x00001F90:     mul r10.x, r10.x, r12.x                                                // r10.x = 2 ^ (floor(level) * 2) * 64 * high weight
551 0x00001FAC:     mul r15.w, r12.z, r12.x                                                // r15.w = 2 ^ (floor(level) * 2) * 64 * low weight
552 0x00001FC8:     mul r15.z, r10.x, l(4.000000)                                          // r15.z = 2 ^ (floor(level) * 2) * 64 * high weight * 4
553 0x00001FE4:     and r10.x, r11.x, l(1)                                                 // r10.x = is lower level odd ?
554 0x00002000:     movc r15.xyzw, r10.xxxx, r15.xyzw, r15.yxwz                            // r15.xyzw = is odd ? r15.xyzw : r15.yxwz
555 // r15 = {is even occupied, is odd occupied, even weight, odd weight}
556 
557 // sample even color clipmap
558 0x00002024:     if_nz r15.x
559 0x00002030:       movc r12.xzw, r10.xxxx, r13.xxyz, r14.xxyz
560 0x00002054:       add r16.xyz, r6.xyyx, r12.xzwx
561 0x00002070:       add r17.xyz, r5.xzzx, r12.xzwx
562 0x0000208C:       add r12.xzw, r5.yyzz, r12.xxzw
563 0x000020A8:       sample_l_indexable(texture3d)(float,float,float,float) r16.xyz, r16.xyzx, t_EmittanceEven.xyzw, s_VoxelTextureSampler, l(0.000000)
564 0x000020DC:       sample_l_indexable(texture3d)(float,float,float,float) r17.xyz, r17.xyzx, t_EmittanceEven.xyzw, s_VoxelTextureSampler, l(0.000000)
565 0x00002110:       sample_l_indexable(texture3d)(float,float,float,float) r12.xzw, r12.xzwx, t_EmittanceEven.xwyz, s_VoxelTextureSampler, l(0.000000)
566 0x00002144:       mul r17.xyz, |r4.yyyy|, r17.xyzx
567 0x00002164:       mad r16.xyz, |r4.xxxx|, r16.xyzx, r17.xyzx
568 0x0000218C:       mad r12.xzw, |r4.zzzz|, r12.xxzw, r16.xxyz                            // r12.xzw = interpolated color in even texture
569 0x000021B4:       mul r12.xzw, r15.zzzz, r12.xxzw                                       // r12.xzw = even color
570 0x000021D0:     else 
571 0x000021D4:       mov r12.xzw, l(0,0,0,0)
572 0x000021F4:     endif
573 
574 // sample odd color clipmap
575 0x000021F8:     lt r11.x, l(0.000000), r15.w
576 0x00002214:     and r11.x, r11.x, r15.y
577 0x00002230:     if_nz r11.x                                                             // if (is odd occupied && odd weight > 0)
578 0x0000223C:       movc r13.xyz, r10.xxxx, r14.xyzx, r13.xyzx
579 0x00002260:       add r14.xyz, r6.xzzx, r13.xyzx
580 0x0000227C:       add r16.xyz, r5.xwwx, r13.xyzx
581 0x00002298:       add r13.xyz, r5.ywwy, r13.xyzx
582 0x000022B4:       sample_l_indexable(texture3d)(float,float,float,float) r14.xyz, r14.xyzx, t_EmittanceOdd.xyzw, s_VoxelTextureSampler, l(0.000000)
583 0x000022E8:       sample_l_indexable(texture3d)(float,float,float,float) r16.xyz, r16.xyzx, t_EmittanceOdd.xyzw, s_VoxelTextureSampler, l(0.000000)
584 0x0000231C:       sample_l_indexable(texture3d)(float,float,float,float) r13.xyz, r13.xyzx, t_EmittanceOdd.xyzw, s_VoxelTextureSampler, l(0.000000)
585 0x00002350:       mul r16.xyz, |r4.yyyy|, r16.xyzx
586 0x00002370:       mad r14.xyz, |r4.xxxx|, r14.xyzx, r16.xyzx
587 0x00002398:       mad r13.xyz, |r4.zzzz|, r13.xyzx, r14.xyzx
588 0x000023C0:       mad r12.xzw, r13.xxyz, r15.wwww, r12.xxzw                             // r12.xzw = final interpolated color
589 0x000023E4:       mov r15.x, l(-1)
590 0x000023F8:     endif
591 // r12.xzw = final interpolated color
592 
593 // Add color contribution and update transparency for environment map
594 // r12.y = intepolated opacity
595 // r10.w = step in voxels
596 // r10.z = diameter
597 // r11.y = distance in world coordinate
598 // r6.w = old transparency
599 0x000023FC:     mul r13.xyz, r0.yyyy, r12.xzwx                                          // r13.xyz = scaled color = rEmittanceStorageScale.y * g_EmittanceScale * color = 0.52 * color
600 0x00002418:     div r10.x, g_ConeFactor, r11.y                                          // r10.x = g_ConeFactor / distance
601 0x00002438:     mul r10.x, r10.x, r10.x                                                 // r10.x = (g_ConeFactor / distance) ^ 2
602 0x00002454:     mul r13.xyz, r10.xxxx, r13.xyzx                                         // color.xyz = (g_ConeFactor / distance) ^ 2 * color.xyz
603 0x00002470:     movc r12.xzw, r15.xxxx, r13.xxyz, r12.xxzw                              // r12.xzw = color.xyz * -1 + final color
604 0x00002494:     lt r10.x, l(0.000000), r12.y                                            // r10.x = opacity > 0
605 0x000024B0:     add r11.x, -r12.y, l(1.000000)                                          // r11.x = 1 - opacity
606 0x000024D0:     mul r11.y, r10.w, g_OpacityCorrectionFactor                             // r11.y = step in voxels * g_OpacityCorrectionFactor
607 0x000024F0:     div r10.z, r11.y, r10.z                                                 // r10.z = factor = step in voxels * g_OpacityCorrectionFactor / diameter
608 0x0000250C:     log r11.x, r11.x                                                        // r11.x = log2(1 - opacity)
609 0x00002520:     mul r10.z, r10.z, r11.x                                                 // r10.z = r10.z * log2(1 - opacity)
610 0x0000253C:     exp r10.z, r10.z                                                        // r10.z = 2 ^ (r10.z) = 2 ^ (factor * log2(1 - opacity)) = (1 - opacity) ^ factor
611 0x00002550:     add r10.z, -r10.z, l(1.000000)                                          // r10.z = 1 - (1 - opacity) ^ factor
612 0x00002570:     and r10.x, r10.z, r10.x                                                 // r10.x = opacity > 0 ? 1 - (1 - opacity) ^ factor : 0
613 0x0000258C:     mad r12.xyz, r8.wwww, r12.xzwx, r7.xyzx                                 // r12.xyz = new indirect color = 1 * (color.xyz * -1 + final color) + indirect color
614 0x000025B0:     add r10.x, -r10.x, l(1.000000)                                          // r10.x = step transparency = (1 - opacity) ^ factor
615 0x000025D0:     mul r10.x, r6.w, r10.x                                                  // r10.x = r6.w * r10.x = transparency for environment map * step transparency
616 // r10.x = new transparency for environment map
617 //       = old transparency * (1 - ((1- intepolated opacity) ^ (step in voxels * g_OpacityCorrectionFactor / diameter in voxels))), if intepolated opacity < 1
618 //       = old transparency, otherwise
619 // r12.xyz = new indirect color
620 //         = old indirect color + intepolated color * the second last transparency
621 
622 // terminate cone tracing
623 0x000025EC:     lt r10.z, r7.w, l(0.000100)                                             // r10.z = r7.w < 0.001
624 0x00002608:     if_nz r10.z                                                             // if(r7.w < 0.001)
625 0x00002614:       mov r7.xyz, r12.xyzx                                                  //     r7.xyz = indirect color
626 0x00002628:       mov r9.x, r11.w                                                       //     r9.x = AO = r11.w
627 0x0000263C:       mov r6.w, r10.x                                                       //     r6.w = r10.x = transparency for environment map
628 0x00002650:       break 
629 0x00002654:     endif
630 
631 // proceed to next iteration
632 // r11.z = new AO weight = 2 ^ (0.04 * distance measured by voxel count * 1.442695)
633 // r11.w = AO
634 // r10.x = transparency for environment map
635 0x00002658:     mad r9.z, r10.y, r1.w, r9.z                                             // r9.z = new distance = g_TracingStep * step in voxels + distance in voxels
636 0x0000267C:     mul r10.y, r10.w, FinestVoxelSize.y                                     // r10.y = step length
637 0x0000269C:     mad r8.xyz, r10.yyyy, r4.xyzx, r8.xyzx                                  // r8.xyz = new sampling position = old sampling position + step size * direction
638 0x000026C0:     add r9.w, r9.w, l(1.000000)                                             // r9.w = iteration++
639 0x000026DC:     mov r7.xyz, r12.xyzx                                                    // r7.xyz = indirect color
640 0x000026F0:     mov r10.y, r6.w                                                         // r10.y = tranparency
641 0x00002704:     mov r8.w, r7.w                                                          // r8.w = tranparency
642 0x00002718:     mov r9.xy, r11.wzww                                                     // r9.xy = r11.wz = {AO, 2 ^ (0.04 * distance measured by voxel count * 1.442695)}
643 0x0000272C:     mov r6.w, r10.x                                                         // r6.w = new transparency for env map = r10.x
644 0x00002740:     mov r7.w, r10.y                                                         // r7.w = transparency
645 // r7.xyz = indirect light
646 // r6.w = latest transparency for environment map
647 // r7.w = last transparency for environment map
648 // r8.w = the second last transparency for environment map
649 // r9.x = AO
650 // r9.y = new AO weight
651 
652 0x00002754:   endloop 
653 
654 // sample environment map
655 0x00002758:   mov_sat r9.x, r9.x
656 0x0000276C:   add_sat r0.x, -r6.w, l(1.000000)                                          // r0.x = saturate(1 - transparency)
657 0x0000278C:   add r0.x, -r0.x, l(1.000000)                                              // r0.x = 1 - saturate(1 - transparency) = transparency
658 0x000027AC:   mul r0.xyz, r0.xxxx, g_EnvironmentMapTint.xyzx                            // r0.xyz = g_EnvironmentMapTint * transparency
659 0x000027CC:   lt r1.xyz, l(0.000000, 0.000000, 0.000000, 0.000000), r0.xyzx
660 0x000027F4:   or r1.x, r1.y, r1.x
661 0x00002810:   or r1.x, r1.z, r1.x
662 0x0000282C:   if_nz r1.x                                                                // if (any(g_EnvironmentMapTint * transparency > 0))
663 0x00002838:     mul r1.x, g_ConeFactor, g_EnvironmentMapResolution                      //      r1.x = g_ConeFactor * g_EnvironmentMapResolution
664 0x0000285C:     log r1.x, r1.x                                                          //      r1.x = log2(g_ConeFactor * g_EnvironmentMapResolution)
665 0x00002870:     add r1.x, r1.x, l(-1.000000)
666 0x0000288C:     max r1.x, r1.x, l(0.000000)                                             //      r1.x = max(log2(g_ConeFactor * g_EnvironmentMapResolution)-1,0)
667 0x000028A8:     min r1.x, r1.x, g_MaxEnvironmentMapMipLevel                             //      r1.x = min(g_MaxEnvironmentMapMipLevel, max(log2(g_ConeFactor * g_EnvironmentMapResolution)-1,0))
668 0x000028C8:     sample_l_indexable(texturecube)(float,float,float,float) r1.xyz, r4.xyzx, t_EnvironmentMap.xyzw, s_EnvironmentMapSampler, r1.x
669 0x000028FC:     mul r0.xyz, r0.xyzx, r1.xyzx                                            //      r0.xyz = environment color = g_EnvironmentMapTint * transparency * environment map color
670 0x00002918:     mad r7.xyz, r0.xyzx, g_rNumCones.wwww, r7.xyzx                          //      r7.xyz = indirect color = r7.xyz + environment color / number of cones
671 0x00002940:   endif 
672 // r7.xyz = indirect light
673 
674 // add ambient color
675 // r9.x = AO?
676 0x00002944:   mad_sat r0.x, r9.x, g_AmbientScale, g_AmbientBias                         // r0.x = saturate(r9.x * g_AmbientScale + g_AmbientBias)
677 0x00002970:   log r0.x, r0.x
678 0x00002984:   mul r0.x, r0.x, g_AmbientPower
679 0x000029A4:   exp r0.x, r0.x                                                            // r0.x = ambient strength = pow(saturate(r9.x * g_AmbientScale + g_AmbientBias), g_AmbientPower)
680 0x000029B8:   mul r0.xyz, r0.xxxx, g_AmbientColor.xyzx
681 0x000029D8:   mul r0.xyz, r0.xyzx, g_rNumCones.wwww                                     // r0.xyz = ambient term = ambient strength * g_AmbientColor.xyzx / number of cones
682 0x000029F8:   mad r0.xyz, r7.xyzx, l(0.318310, 0.318310, 0.318310, 0.000000), r0.xyzx   // r0.xyz = all indirect light = ambient term + indirect light * 0.318310
683 0x00002A28:   mul r1.xyz, r4.xxxx, r0.xyzx                                              // r1.xyz = all indirect light * direction.x
684 0x00002A44:   mul r2.xyz, r4.yyyy, r0.xyzx                                              // r2.xyz = all indirect light * direction.y = all indirect light * cos(theta)
685 0x00002A60:   mul r0.xyz, r4.zzzz, r0.xyzx                                              // r0.xyz = all indirect light * direction.z
686 0x00002A7C: else 
687 0x00002A80:   mov r1.xyz, l(0,0,0,0)
688 0x00002AA0:   mov r2.xyz, l(0,0,0,0)
689 0x00002AC0:   mov r0.xyz, l(0,0,0,0)
690 0x00002AE0: endif 
691 
692 // write x axis indirect illumination
693 0x00002AE4: mul r0.w, r0.w, g_rNumCones.w
694 0x00002B04: and r1.w, r1.x, l(0x7f800000)
695 0x00002B20: ieq r1.w, r1.w, l(0x7f800000)
696 0x00002B3C: movc o0.x, r1.w, l(0), r1.x
697 0x00002B60: and r1.x, r1.y, l(0x7f800000)
698 0x00002B7C: ieq r1.x, r1.x, l(0x7f800000)
699 0x00002B98: movc o0.y, r1.x, l(0), r1.y
700 0x00002BBC: and r1.x, r1.z, l(0x7f800000)
701 0x00002BD8: ieq r1.x, r1.x, l(0x7f800000)
702 0x00002BF4: movc o0.z, r1.x, l(0), r1.z
703 0x00002C18: and r1.x, r0.w, l(0x7f800000)
704 0x00002C34: ieq r1.x, r1.x, l(0x7f800000)
705 0x00002C50: movc o0.w, r1.x, l(0), r0.w
706 
707 // write y axis indirect illumination
708 0x00002C74: and r0.w, r2.x, l(0x7f800000)
709 0x00002C90: ieq r0.w, r0.w, l(0x7f800000)
710 0x00002CAC: movc o1.x, r0.w, l(0), r2.x
711 0x00002CD0: and r0.w, r2.y, l(0x7f800000)
712 0x00002CEC: ieq r0.w, r0.w, l(0x7f800000)
713 0x00002D08: movc o1.y, r0.w, l(0), r2.y
714 0x00002D2C: and r0.w, r2.z, l(0x7f800000)
715 0x00002D48: ieq r0.w, r0.w, l(0x7f800000)
716 0x00002D64: movc o1.z, r0.w, l(0), r2.z
717 
718 // write z axis indirect illumination
719 0x00002D88: and r0.w, r0.x, l(0x7f800000)
720 0x00002DA4: ieq r0.w, r0.w, l(0x7f800000)
721 0x00002DC0: movc o2.x, r0.w, l(0), r0.x
722 0x00002DE4: and r0.x, r0.y, l(0x7f800000)
723 0x00002E00: ieq r0.x, r0.x, l(0x7f800000)
724 0x00002E1C: movc o2.y, r0.x, l(0), r0.y
725 0x00002E40: and r0.x, r0.z, l(0x7f800000)
726 0x00002E5C: ieq r0.x, r0.x, l(0x7f800000)
727 0x00002E78: movc o2.z, r0.x, l(0), r0.z
728 0x00002E9C: mov o1.w, l(0)
729 0x00002EB0: mov o2.w, l(0)
730 0x00002EC4: ret 
731 // Approximately 399 instruction slots used

 

Here is specular cone tracing code

  1 //
  2 // Generated by Microsoft (R) HLSL Shader Compiler 10.0.10011.16384
  3 //
  4 //
  5 // Buffer Definitions: 
  6 //
  7 // cbuffer AbstractTracingCB
  8 // {
  9 //
 10 //   struct VxgiAbstractTracingConstants
 11 //   {
 12 //       
 13 //       float4 rOpacityTextureSize;    // Offset:    0
 14 //       float4 rEmittanceTextureSize;  // Offset:   16
 15 //       float4 ClipmapAnchor;          // Offset:   32
 16 //       float4 SceneBoundaryLower;     // Offset:   48
 17 //       float4 SceneBoundaryUpper;     // Offset:   64
 18 //       float4 ClipmapCenter;          // Offset:   80
 19 //       float4 TracingToroidalOffset;  // Offset:   96
 20 //       float EmittancePackingStride;  // Offset:  112
 21 //       float FinestVoxelSize;         // Offset:  116
 22 //       float StackTextureSize;        // Offset:  120
 23 //       float rNearestLevel0Boundary;  // Offset:  124
 24 //       float MaxMipmapLevel;          // Offset:  128
 25 //       float rEmittanceStorageScale;  // Offset:  132
 26 //       float rClipmapSizeWorld;       // Offset:  136
 27 //       uint Use6DOpacity;             // Offset:  140
 28 //
 29 //   } g_VxgiAbstractTracingCB;         // Offset:    0 Size:   144
 30 //
 31 // }
 32 //
 33 // cbuffer TranslationCB
 34 // {
 35 //
 36 //   float4 g_VxgiTranslationParameters[13];// Offset:    0 Size:   208
 37 //   float4 g_VxgiTranslationParameters2[13];// Offset:  208 Size:   208
 38 //
 39 // }
 40 //
 41 // cbuffer cBuiltinTracingParameters
 42 // {
 43 //
 44 //   struct GBufferParameters
 45 //   {
 46 //       
 47 //       row_major float4x4 viewProjMatrix;// Offset:    0
 48 //       row_major float4x4 viewProjMatrixInv;// Offset:   64
 49 //       row_major float4x4 viewMatrix; // Offset:  128
 50 //       float4 cameraPosition;         // Offset:  192
 51 //       float4 uvToView;               // Offset:  208
 52 //       float2 gbufferSize;            // Offset:  224
 53 //       float2 gbufferSizeInv;         // Offset:  232
 54 //       float2 viewportOrigin;         // Offset:  240
 55 //       float2 viewportSize;           // Offset:  248
 56 //       float2 viewportSizeInv;        // Offset:  256
 57 //       float2 firstSamplePosition;    // Offset:  264
 58 //       float projectionA;             // Offset:  272
 59 //       float projectionB;             // Offset:  276
 60 //       float depthScale;              // Offset:  280
 61 //       float depthBias;               // Offset:  284
 62 //       float normalScale;             // Offset:  288
 63 //       float normalBias;              // Offset:  292
 64 //       float radiusToScreen;          // Offset:  296
 65 //
 66 //   } g_GBuffer;                       // Offset:    0 Size:   300
 67 //   
 68 //   struct GBufferParameters
 69 //   {
 70 //       
 71 //       row_major float4x4 viewProjMatrix;// Offset:  304
 72 //       row_major float4x4 viewProjMatrixInv;// Offset:  368
 73 //       row_major float4x4 viewMatrix; // Offset:  432
 74 //       float4 cameraPosition;         // Offset:  496
 75 //       float4 uvToView;               // Offset:  512
 76 //       float2 gbufferSize;            // Offset:  528
 77 //       float2 gbufferSizeInv;         // Offset:  536
 78 //       float2 viewportOrigin;         // Offset:  544
 79 //       float2 viewportSize;           // Offset:  552
 80 //       float2 viewportSizeInv;        // Offset:  560
 81 //       float2 firstSamplePosition;    // Offset:  568
 82 //       float projectionA;             // Offset:  576
 83 //       float projectionB;             // Offset:  580
 84 //       float depthScale;              // Offset:  584
 85 //       float depthBias;               // Offset:  588
 86 //       float normalScale;             // Offset:  592
 87 //       float normalBias;              // Offset:  596
 88 //       float radiusToScreen;          // Offset:  600
 89 //
 90 //   } g_PreviousGBuffer;               // Offset:  304 Size:   300
 91 //   row_major float4x4 g_ReprojectionMatrix;// Offset:  608 Size:    64
 92 //   float4 g_AmbientColor;             // Offset:  672 Size:    16 [unused]
 93 //   float4 g_DownsampleScale;          // Offset:  688 Size:    16 [unused]
 94 //   float4 g_DebugParams;              // Offset:  704 Size:    16 [unused]
 95 //   float4 g_EnvironmentMapTint;       // Offset:  720 Size:    16
 96 //   float4 g_RefinementGridResolution; // Offset:  736 Size:    16 [unused]
 97 //   float4 g_BackgroundColor;          // Offset:  752 Size:    16 [unused]
 98 //   int2 g_PixelToSave;                // Offset:  768 Size:     8 [unused]
 99 //   int2 g_RandomOffset;               // Offset:  776 Size:     8
100 //   float2 g_GridOrigin;               // Offset:  784 Size:     8 [unused]
101 //   float g_ConeFactor;                // Offset:  792 Size:     4 [unused]
102 //   float g_TracingStep;               // Offset:  796 Size:     4
103 //   float g_OpacityCorrectionFactor;   // Offset:  800 Size:     4
104 //   int g_MaxSamples;                  // Offset:  804 Size:     4
105 //   int g_NumCones;                    // Offset:  808 Size:     4 [unused]
106 //   float g_rNumCones;                 // Offset:  812 Size:     4 [unused]
107 //   float g_EmittanceScale;            // Offset:  816 Size:     4
108 //   float g_EnvironmentMapResolution;  // Offset:  820 Size:     4
109 //   float g_MaxEnvironmentMapMipLevel; // Offset:  824 Size:     4
110 //   float g_NormalOffsetFactor;        // Offset:  828 Size:     4 [unused]
111 //   float g_AmbientAttenuationFactor;  // Offset:  832 Size:     4 [unused]
112 //   uint g_FlipOpacityDirections;      // Offset:  836 Size:     4
113 //   float g_InitialOffsetBias;         // Offset:  840 Size:     4
114 //   float g_InitialOffsetDistanceFactor;// Offset:  844 Size:     4
115 //   uint g_EnableSpecularRandomOffsets;// Offset:  848 Size:     4
116 //   uint g_NumDiscontinuityLevels;     // Offset:  852 Size:     4 [unused]
117 //   float g_TemporalReprojectionWeight;// Offset:  856 Size:     4
118 //   float g_TangentJitterScale;        // Offset:  860 Size:     4
119 //   float g_DepthDeltaSign;            // Offset:  864 Size:     4 [unused]
120 //   float g_ReprojectionDepthWeightScale;// Offset:  868 Size:     4
121 //   float g_ReprojectionNormalWeightExponent;// Offset:  872 Size:     4
122 //   float g_InterpolationWeightThreshold;// Offset:  876 Size:     4 [unused]
123 //   uint g_EnableRefinement;           // Offset:  880 Size:     4 [unused]
124 //   float g_AmbientScale;              // Offset:  884 Size:     4 [unused]
125 //   float g_AmbientBias;               // Offset:  888 Size:     4 [unused]
126 //   float g_AmbientPower;              // Offset:  892 Size:     4 [unused]
127 //   float g_AmbientDistanceDarkening;  // Offset:  896 Size:     4 [unused]
128 //   int g_AltSettingsStencilMask;      // Offset:  900 Size:     4 [unused]
129 //   int g_AltSettingsStencilRefValue;  // Offset:  904 Size:     4 [unused]
130 //   float g_AltInitialOffsetBias;      // Offset:  908 Size:     4 [unused]
131 //   float g_AltInitialOffsetDistanceFactor;// Offset:  912 Size:     4 [unused]
132 //   float g_AltNormalOffsetFactor;     // Offset:  916 Size:     4 [unused]
133 //   float g_AltTracingStep;            // Offset:  920 Size:     4 [unused]
134 //   float g_SSAO_SurfaceBias;          // Offset:  924 Size:     4 [unused]
135 //   float g_SSAO_RadiusWorld;          // Offset:  928 Size:     4 [unused]
136 //   float g_SSAO_rBackgroundViewDepth; // Offset:  932 Size:     4 [unused]
137 //   float g_SSAO_CoarseAO;             // Offset:  936 Size:     4 [unused]
138 //   float g_SSAO_PowerExponent;        // Offset:  940 Size:     4 [unused]
139 //
140 // }
141 //
142 //
143 // Resource Bindings:
144 //
145 // Name                                 Type  Format         Dim Slot Elements
146 // ------------------------------ ---------- ------- ----------- ---- --------
147 // s_VoxelTextureSampler             sampler      NA          NA    0        1
148 // s_EnvironmentMapSampler           sampler      NA          NA   11        1
149 // g_DepthBuffer                     texture  float4          2d    0        1
150 // g_TargetNormal                    texture  float4          2d    2        1
151 // t_OpacityMap_Pos                  texture  float4          3d    6        1
152 // t_OpacityMap_Neg                  texture  float4          3d    7        1
153 // t_Randoms                         texture  float4          2d    9        1
154 // t_EnvironmentMap                  texture  float4        cube   11        1
155 // t_EmittanceEven                   texture  float4          3d   12        1
156 // t_EmittanceOdd                    texture  float4          3d   15        1
157 // g_PrevDepthBuffer                 texture  float4          2d   18        1
158 // g_PrevTargetNormal                texture  float4          2d   19        1
159 // g_PrevSpecular                    texture  float4          2d   20        1
160 // AbstractTracingCB                 cbuffer      NA          NA    0        1
161 // TranslationCB                     cbuffer      NA          NA    1        1
162 // cBuiltinTracingParameters         cbuffer      NA          NA    2        1
163 //
164 //
165 //
166 // Input signature:
167 //
168 // Name                 Index   Mask Register SysValue  Format   Used
169 // -------------------- ----- ------ -------- -------- ------- ------
170 // TEXCOORD                 0   xy          0     NONE   float   xy  
171 // INSTANCEID               0     z         0     NONE   float       
172 // RAY                      0   xyzw        1     NONE   float       
173 // SV_Position              0   xyzw        2      POS   float   xy  
174 //
175 //
176 // Output signature:
177 //
178 // Name                 Index   Mask Register SysValue  Format   Used
179 // -------------------- ----- ------ -------- -------- ------- ------
180 // SV_Target                0   xyzw        0   TARGET   float   xyzw
181 //
182 0x00000000: ps_5_0
183 0x00000008: dcl_globalFlags refactoringAllowed
184 0x0000000C: dcl_immediateConstantBuffer { { -0.759375, 0.518795, 0, 0},
185                               { 0.532276, 0.235007, 0, 0},
186                               { 0.811488, -0.458026, 0, 0},
187                               { -0.309351, -0.749256, 0, 0},
188                               { 0.229313, 0.760701, 0, 0},
189                               { 0.082651, -0.893957, 0, 0},
190                               { 0.098134, 0.192451, 0, 0},
191                               { -0.311438, -0.301729, 0, 0},
192                               { 0.650529, 0.629737, 0, 0},
193                               { -0.302202, 0.297664, 0, 0},
194                               { -0.738689, -0.521569, 0, 0},
195                               { -0.393524, 0.753064, 0, 0},
196                               { -0.692823, 0.071195, 0, 0},
197                               { 0.858102, -0.016241, 0, 0},
198                               { 0.398883, -0.617012, 0, 0},
199                               { 0.283767, -0.179743, 0, 0} }
200 0x00000114: dcl_constantbuffer cb0[9], immediateIndexed
201 0x00000124: dcl_constantbuffer cb1[26], dynamicIndexed
202 0x00000134: dcl_constantbuffer cb2[55], immediateIndexed
203 0x00000144: dcl_sampler s_VoxelTextureSampler, mode_default
204 0x00000150: dcl_sampler s_EnvironmentMapSampler, mode_default
205 0x0000015C: dcl_resource_texture2d (float,float,float,float) g_DepthBuffer
206 0x0000016C: dcl_resource_texture2d (float,float,float,float) g_TargetNormal
207 0x0000017C: dcl_resource_texture3d (float,float,float,float) t_OpacityMap_Pos
208 0x0000018C: dcl_resource_texture3d (float,float,float,float) t_OpacityMap_Neg
209 0x0000019C: dcl_resource_texture2d (float,float,float,float) t_Randoms
210 0x000001AC: dcl_resource_texturecube (float,float,float,float) t_EnvironmentMap
211 0x000001BC: dcl_resource_texture3d (float,float,float,float) t_EmittanceEven
212 0x000001CC: dcl_resource_texture3d (float,float,float,float) t_EmittanceOdd
213 0x000001DC: dcl_resource_texture2d (float,float,float,float) g_PrevDepthBuffer
214 0x000001EC: dcl_resource_texture2d (float,float,float,float) g_PrevTargetNormal
215 0x000001FC: dcl_resource_texture2d (float,float,float,float) g_PrevSpecular
216 0x0000020C: dcl_input_ps linear v0.xy
217 0x00000218: dcl_input_ps_siv linear noperspective v2.xy, position
218 0x00000228: dcl_output o0.xyzw
219 0x00000234: dcl_temps 21
220 
221 // load normal
222 0x0000023C: ftoi r0.xy, v2.xyxx                                               // r0.xy = SV_Position.xy
223 0x00000250: mov r0.zw, l(0,0,0,0)
224 0x00000270: ld_indexable(texture2d)(float,float,float,float) r1.xyzw, r0.xyww, g_TargetNormal.xyzw // r1.xyzw = g_TargetNormal.xyzw
225 0x00000294: ge r2.x, l(0.000000), r1.w                                        // if(0 >= r1.w)
226 0x000002B0: if_nz r2.x
227 0x000002BC:   mov o0.xyzw, l(0,0,0,0)                                         //      SV_Target.xyzw = (0,0,0,0)
228 0x000002DC:   ret                                                             //      return
229 0x000002E0: endif
230 // r0.xy = screen position
231 // r1.xyzw = normal
232 // r1.w = glossiness
233 
234 // load depth, normalize normal
235 0x000002E4: ld_indexable(texture2d)(float,float,float,float) r0.x, r0.xyzw, g_DepthBuffer.xyzw   // r0.x = depth
236 0x00000308: mad r0.x, r0.x, depthScale.z, depthBias.w                         // r0.x = r0.x * depthScale.z + depthBias.w
237 0x00000334: mad r0.yzw, r1.xxyz, normalScale.xxxx, normalBias.yyyy            // r0.yzw = r1.xyz * normalScale.xxxx + normalBias.yyyy
238 0x00000360: dp3 r1.x, r0.yzwy, r0.yzwy                                        // r0.yzw = normalize(r0.yzw)
239 0x0000037C: sqrt r1.x, r1.x
240 0x00000390: div r0.yzw, r0.yyzw, r1.xxxx
241 0x000003AC: ge r1.x, l(0.000000), r1.x                                        // if(length(normal) <= 0)
242 0x000003C8: movc r0.yzw, r1.xxxx, l(0,0,0,0), r0.yyzw                         //    r0.yzw = 0
243 // r0.yzw = normalized normal
244 // r0.x   = depth
245 
246 // compute world space position
247 0x000003F8: add r1.xy, v2.xyxx, -viewportOrigin.xyxx
248 0x0000041C: mul r1.xy, r1.xyxx, viewportSizeInv.xyxx
249 0x0000043C: mad r1.x, r1.x, l(2.000000), l(-1.000000)
250 0x00000460: mad r1.y, -r1.y, l(2.000000), l(1.000000)                         // r1.xy = project space coordinate
251 0x00000488: mul r2.xyzw, r1.yyyy, viewProjMatrixInv.xyzw
252 0x000004A8: mad r2.xyzw, r1.xxxx, viewProjMatrixInv.xyzw, r2.xyzw
253 0x000004D0: mad r2.xyzw, r0.xxxx, viewProjMatrixInv.xyzw, r2.xyzw
254 0x000004F8: add r2.xyzw, r2.xyzw, viewProjMatrixInv.xyzw
255 0x00000518: div r1.xyz, r2.xyzx, r2.wwww
256 // r1.xyz = world space position
257 
258 // compute view direction
259 0x00000534: add r2.xyz, r1.xyzx, -cameraPosition.xyzx                         // r2.xyz = r1.xyz - cameraPosition
260 0x00000558: dp3 r2.w, r2.xyzx, r0.yzwy
261 0x00000574: add r2.w, r2.w, r2.w
262 0x00000590: mad r2.xyz, r0.yzwy, -r2.wwww, r2.xyzx                            // r2.xyz += normal * -dot(normal,r2.xyz)*2
263 0x000005B8: dp3 r2.w, r2.xyzx, r2.xyzx
264 0x000005D4: rsq r2.w, r2.w
265 0x000005E8: mul r3.xyz, r2.wwww, r2.xyzx                                      // r3.xyz = normalized reflection vector
266 // r2.xyz = reflection vector
267 // r3.xyz = normalized reflection vector
268 
269 // compute clipmap size factor for shading point
270 0x00000604: add r4.xyz, r1.xyzx, -ClipmapAnchor.xyzx
271 0x00000628: max r2.z, |r4.z|, |r4.y|
272 0x0000064C: max r2.z, r2.z, |r4.x|
273 0x0000066C: dp2 r2.z, rNearestLevel0Boundary.wwww, r2.zzzz                    // rNearestLevel0Boundary = 0
274 0x0000068C: max r2.z, r2.z, l(1.000000)
275 // r2.z = 0
276 
277 // calculate fresnel coefficient
278 0x000006A8: add r4.xyz, -r1.xyzx, cameraPosition.xyzx
279 0x000006CC: dp3 r3.w, r4.xyzx, r4.xyzx
280 0x000006E8: rsq r3.w, r3.w
281 0x000006FC: mul r4.xyz, r3.wwww, r4.xyzx                                      // r4.xyz = normalized view vector (from shading point to camera)
282 0x00000718: dp3 r3.w, r0.yzwy, r4.xyzx                                        // r0.yzw = normalized normal
283 0x00000734: add r3.w, -|r3.w|, l(1.000000)
284 0x00000754: max r3.w, r3.w, l(0.000000)
285 0x00000770: mul r3.w, r3.w, r3.w
286 0x0000078C: mul r3.w, r3.w, r3.w                                              // r3.w = (1-dot(viewVector, normal)) ^ 4
287 // r3.w = fresnel coef?
288 
289 // calculate random offset
290 0x000007A8: itof r4.xy, g_RandomOffset.zwzz                                   // g_RandomOffset = (0,0)
291 0x000007C0: add r4.xy, r4.xyxx, v2.xyxx                                       // r4.xy = screen position + g_RandomOffset
292 0x000007DC: ftoi r4.zw, r4.xxxy
293 0x000007F0: and r5.xy, r4.zwzz, l(3, 3, 0, 0)                                 // r5.xy = (screen position + g_RandomOffset) & (3,3)
294 0x00000818: mov r5.zw, l(0,0,0,0)
295 0x00000838: ld_indexable(texture2d)(float,float,float,float) r4.z, r5.xyzw, t_Randoms.yzxw // load random number, based on screen position
296 0x0000085C: movc r4.z, g_EnableSpecularRandomOffsets, r4.z, l(0.500000)       // r4.z = random offset
297 0x00000884: mul r4.z, r2.z, r4.z                                              // r4.z = random offset * level factor = 0
298 // r4.xy = screen position + g_RandomOffset
299 // r4.z = random offset * level factor = 0
300 
301 0x000008A0: min r1.w, r1.w, l(0.750000)
302 0x000008BC: mul r1.w, r1.w, r1.w
303 0x000008D8: mul r4.w, r1.w, l(1.772454)                                       // r4.w = min(normal texture.w, 0.75) ^ 2 * 1.772454
304 0x000008F4: itof r5.x, g_MaxSamples                                           // g_MaxSamples = 128
305 0x0000090C: dp2 r4.x, r4.xyxx, l(12.989800, 78.233002, 0.000000, 0.000000)
306 0x00000934: sincos r4.x, null, r4.x                                           // r4.x = sin(dot(screen position + g_RandomOffset, (12.989800, 78.233002)))
307 0x0000094C: mul r4.x, r4.x, l(43758.546875)
308 0x00000968: frc r4.x, r4.x
309 // r4.x = random number = frac(sin(dot(screen position + g_RandomOffset, (12.989800, 78.233002))) * 43758.546875)
310 // r4.w = min(glossiness, 0.75) ^ 2 * 1.772454
311 
312 // Calculate initial offset
313 // r2.z = 0
314 0x0000097C: mad r2.z, r2.z, g_InitialOffsetDistanceFactor, g_InitialOffsetBias// r2.z = 0 * g_InitialOffsetDistanceFactor + g_InitialOffsetBias = 2
315 0x000009A8: mul r3.w, r3.w, g_InitialOffsetBias                               // r3.w *= g_InitialOffsetBias
316 0x000009C8: mad r2.z, r3.w, l(5.000000), r2.z                                 // r2.z = fresnel coef* g_InitialOffsetBias*5+0 * g_InitialOffsetDistanceFactor + g_InitialOffsetBias
317 0x000009EC: mad r2.z, r4.z, g_TracingStep, r2.z                               // r2.z = random offset * level factor * g_TracingStep + fresnel coef* g_InitialOffsetBias*5+0 * g_InitialOffsetDistanceFactor + g_InitialOffsetBias
318                                                                               //      = 0 + fresnel coef* g_InitialOffsetBias*5 + g_InitialOffsetBias
319 0x00000A14: mul r3.w, r2.z, FinestVoxelSize.y
320 0x00000A34: mad r1.xyz, r3.xyzx, r3.wwww, r1.xyzx                             // r1.xyz = world space position + offset * reflection vector
321 // r1.xyz = initial tracing position
322 // r2.z = random offset * level factor * g_TracingStep + fresnel coef* g_InitialOffsetBias*5 + 0 * g_InitialOffsetDistanceFactor + g_InitialOffsetBias
323 //      = 0 + fresnel coef* g_InitialOffsetBias*5 + g_InitialOffsetBias
324 
325 // Construct local coordinate system
326 // r3.xyz = normalized reflection vector
327 0x00000A58: mul r3.w, rEmittanceStorageScale.y, g_EmittanceScale
328 0x00000A7C: mov r6.xyz, |r3.xyzx|
329 0x00000A94: max r4.y, r6.z, r6.y
330 0x00000AB0: max r4.y, r4.y, r6.x                                              // r4.y = max(abs(normalized reflection vector))
331 0x00000ACC: mad r2.xyw, -r2.yxyx, r2.wwww, -r3.zzzy                           // r2.xyw = -normalize(reflection vector).yxx - normalized reflection vector.zzy
332 0x00000AF8: lt r5.yzw, l(0.000000, 0.000000, 0.000000, 0.000000), r3.xxyz     // r5.yzw = 0 < r3.xyz
333 0x00000B20: lt r7.xyz, r3.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000)     // r7.xyz = r3.xyz < 0
334 0x00000B48: iadd r7.xyz, -r5.yzwy, r7.xyzx                                    // r7.xyz = r7.xyz - r5.yzw = -sign(normalized reflection vector)
335 0x00000B68: itof r7.xyz, r7.xyzx
336 0x00000B7C: eq r4.yz, r6.xxyx, r4.yyyy                                        // r4.yz = r6.xy == r4.yy
337 0x00000B98: mul r7.xyz, r2.xywx, r7.xyzx
338 0x00000BB4: mov r6.w, r7.y
339 0x00000BC8: mov r7.w, r6.z
340 0x00000BDC: movc r2.xyw, r4.zzzz, r6.ywyy, r7.wwwz
341 0x00000C00: mov r7.yz, r6.xxxx
342 0x00000C14: movc r2.xyw, r4.yyyy, r7.xyxz, r2.xyxw
343 0x00000C38: dp3 r4.y, r2.xywx, r2.xywx
344 0x00000C54: rsq r4.y, r4.y
345 0x00000C68: mul r2.xyw, r2.xyxw, r4.yyyy                                      // r2.xyw = normalize(r2.xyw)
346 0x00000C84: mul r7.xyz, r3.yzxy, r2.wxyw
347 0x00000CA0: mad r7.xyz, r2.ywxy, r3.zxyz, -r7.xyzx                            // r7.xyz = r2.ywx * r3.zxy - r2.wxy * r3.yzx = cross(r2.xyw, r3.xyz)
348 // r3.xyz = normalized reflection vector, "z" axis
349 // r2.xyw = "y" axis
350 // r7 = cross(r2.xyw, normalized reflection vector) = "x" axis
351 
352 // prepare data for cone tracing
353 // r1.w = glossiness
354 0x00000CC8: frc r4.x, r4.x
355 0x00000CDC: mul r4.x, r4.x, l(16.000000)
356 0x00000CF8: ftoi r4.x, r4.x                                                   // r4.x = int(frac(random number)*16)
357 0x00000D0C: mad r4.y, -r1.w, l(1.772454), l(2.000000)                         // r4.y = -r1.w * 1.772454 + 2
358 0x00000D34: mad r4.z, r1.w, l(1.772454), l(2.000000)                          // r4.z = r1.w * 1.772454 + 2
359 0x00000D58: div r4.z, r4.z, r4.y                                              // r4.z = (2 + r1.w * 1.772454) / (2 - r1.w * 1.772454)
360 0x00000D74: add r4.z, r4.z, l(-1.000000)                                      // r4.z = (2 + r1.w * 1.772454) / (2 - r1.w * 1.772454) - 1
361 0x00000D90: add r6.w, MaxMipmapLevel.x, l(1.000000)                           // r6.w = MaxMipmapLevel + 1
362 0x00000DB0: lt r8.xy, l(0.000000, 0.000000, 0.000000, 0.000000), (g_TangentJitterScale,g_TemporalReprojectionWeight,g_TangentJitterScale,g_TangentJitterScale)
363 0x00000DDC: mul r7.w, FinestVoxelSize.y, FinestVoxelSize.y                    // r7.w = FinestVoxelSize.y * FinestVoxelSize.y
364 0x00000E00: movc r9.xyz, g_FlipOpacityDirections.yyyy, -r3.xyzx, r3.xyzx      // r9.xyz = g_FlipOpacityDirections ? reflection vector : -reflection vector
365 0x00000E2C: and r5.y, r5.y, l(0x40400000)
366 0x00000E48: movc r5.zw, r5.zzzw, l(0,0,4.000000,5.000000), l(0,0,1.000000,2.000000) // r5.yzw = face index = reflection vector.xyz > 0 ? (3,4,5) : (0,1,2)
367 0x00000E84: mul r10.x, r5.y, EmittancePackingStride.x                         // r10.x = x face texcoord offset = r5.y * EmittancePackingStride = r5.y * 0.17
368 0x00000EA4: mul r11.xy, r5.zwzz, EmittancePackingStride.xxxx                  // r11.xy = yz face texcoord offset = r5.zw * EmittancePackingStride = r5.zw * 0.17
369 // r4.y = 2 - r1.w * 1.772454
370 // r4.z = cone tracing step factor = (2 + r1.w * 1.772454) / (2 - r1.w * 1.772454) - 1
371 // r5.yzw = face index = reflection vector.xyz > 0 ? (3,4,5) : (0,1,2)
372 // r6.w = MaxMipmapLevel + 1
373 // r7.w = FinestVoxelSize.y * FinestVoxelSize.y
374 // r8.xy = (g_TangentJitterScale > 0, g_TemporalReprojectionWeight > 0)
375 // r9.xyz = g_FlipOpacityDirections ? reflection vector : -reflection vector
376 // (r10.x, r11.xy) = xyz face texcoord offset
377 
378 // initial variables for loop
379 0x00000EC4: mov r10.yz, l(0,0,0,0)
380 0x00000EE4: mov r11.zw, l(0,0,0,0)
381 0x00000F04: mov r5.yzw, l(0,0,0,0)
382 0x00000F24: mov r12.xyz, r1.xyzx
383 0x00000F38: mov r8.z, Use6DOpacity.w
384 0x00000F50: mov r8.w, l(1.000000)
385 0x00000F64: mov r9.w, l(1.000000)
386 0x00000F78: mov r10.w, l(1.000000)
387 0x00000F8C: mov r12.w, r2.z
388 0x00000FA0: mov r13.x, l(0)
389 // r12.xyz = sample position
390 
391 // begin specular cone tracing
392 0x00000FB4: loop 
393 
394 // calculate sample level
395 // r12.w = trace length in voxel count
396 // r13.x = step count
397 0x00000FB8:   ge r13.y, r13.x, r5.x                                           // if(step count >= 128)
398 0x00000FD4:   breakc_nz r13.y                                                 //    break
399 0x00000FE0:   add r13.yzw, r12.xxyz, -ClipmapAnchor.xxyz                      // r13.yzw = sample position - ClipmapAnchor
400 0x00001004:   max r13.z, |r13.w|, |r13.z|
401 0x00001028:   max r13.y, r13.z, |r13.y|                                       // r13.y = manhattan distance from clip map center 
402 0x00001048:   dp2 r13.z, rNearestLevel0Boundary.wwww, r13.yyyy
403 0x00001068:   max r13.z, r13.z, l(1.000000)                                   // r13.z = max(1, distance from center / level 0 range)
404 0x00001084:   mul r13.w, r4.w, r12.w                                          // r13.w = min(glossiness, 0.75) ^ 2 * 1.772454 * trace length
405 0x000010A0:   lt r14.x, r13.w, r13.z                                          // if(r13.w < r13.z)
406 0x000010BC:   movc r13.w, r14.x, r13.z, r13.w                                 //    r13.w = r13.z = voxel size factor
407 0x000010E0:   log r14.y, r13.w                                                // r14.y = clip map level = log2(r13.w)
408 0x000010F4:   ge r14.z, r14.y, r6.w
409 0x00001110:   if_nz r14.z                                                     // if(level >= MaxMipmapLevel + 1)
410 0x0000111C:     break                                                         //    break
411 0x00001120:   endif 
412 // r14.y = clip map level
413 
414 0x00001124:   add r13.y, -r13.y, ClipmapAnchor.w                              // r13.y = ClipmapAnchor.w - manhattan distance
415 0x00001148:   mul r14.z, r13.w, FinestVoxelSize.y                             // r14.z = sample voxel size = r13.w * FinestVoxelSize
416 0x00001168:   mad r13.y, -r13.w, FinestVoxelSize.y, r13.y                     // r13.y = -voxel size factor * FinestVoxelSize + ClipmapAnchor.w - manhattan distance
417 0x00001194:   lt r14.w, r13.y, l(0.000000)
418 0x000011B0:   if_nz r14.w                                                     // if (r13.y < 0)
419 0x000011BC:     break                                                         //    break
420 0x000011C0:   endif 
421 
422 // test if sample position is in scene bounding box
423 0x000011C4:   mad r15.xyz, r13.wwww, FinestVoxelSize.yyyy, r12.xyzx
424 0x000011EC:   lt r15.xyz, r15.xyzx, SceneBoundaryLower.xyzx
425 0x0000120C:   or r14.w, r15.y, r15.x
426 0x00001228:   or r14.w, r15.z, r14.w
427 0x00001244:   mad r15.xyz, -r13.wwww, FinestVoxelSize.yyyy, r12.xyzx
428 0x00001270:   lt r15.xyz, SceneBoundaryUpper.xyzx, r15.xyzx
429 0x00001290:   or r15.x, r15.y, r15.x
430 0x000012AC:   or r15.x, r15.z, r15.x
431 0x000012C8:   or r14.w, r14.w, r15.x
432 0x000012E4:   if_nz r14.w
433 0x000012F0:     break 
434 0x000012F4:   endif 
435 
436 // r12.w = trace length in voxel count
437 // r13.z = max(1, distance from center / level 0 range)
438 0x000012F8:   mad r14.w, r12.w, l(2.000000), r13.z                            // r14.w = length * 2 + max(1, distance from center / level 0 range)
439 0x0000131C:   div r14.w, r14.w, r4.y                                          // r14.w = (length * 2 + max(1, distance from center / level 0 range)) / (2 - glossiness * 1.772454)
440 0x00001338:   add r13.z, r12.w, r13.z                                         // r13.z = length  + max(1, distance from center / level 0 range)
441 0x00001354:   max r13.z, r13.z, r14.w                                         // r13.z = max(length  + max(1, distance from center / level 0 range), (length * 2 + max(1, distance from center / level 0 range)) / (2 - glossiness * 1.772454))
442 0x00001370:   add r13.z, -r12.w, r13.z                                        // r13.z = max(length  + max(1, distance from center / level 0 range), (length * 2 + max(1, distance from center / level 0 range)) / (2 - glossiness * 1.772454)) - length
443 0x00001390:   mul r14.w, r4.z, r12.w                                          // r14.w = step factor * trace length
444 0x000013AC:   movc r13.z, r14.x, r13.z, r14.w
445 0x000013D0:   mul r14.x, r13.z, g_TracingStep                                 // r14.x = step legnth in voxel count = r13.z * g_TracingStep
446 0x000013F0:   div_sat r13.y, r13.y, r14.z                                     // r13.y = (-voxel size factor * FinestVoxelSize + ClipmapAnchor.w - manhattan distance) / sample voxel size
447 // r13.z = original step in voxels
448 // r14.x = step in voxels
449 //       = g_TracingStep * (max(distance + 1, (distance * 2 + 1)/(2 - g_ConeFactor)) - distance), if diameter less that one voxel
450 //       = g_TracingStep * ((2 + g_ConeFactor) / (2 - g_ConeFactor)-1) * distance
451 
452 // When g_TangentJitterScale > 0, add random tangent offset to sample position
453 // r2.xyw = "y" axis for ray coordinate system
454 // r7.xyz = "x" axis for ray coordinate system
455 0x0000140C:   if_nz r8.x                                                      // if(g_TangentJitterScale > 0)
456 0x00001418:     ftoi r14.w, r13.x                                             //    r14.w = step count
457 0x0000142C:     iadd r14.w, r4.x, r14.w                                       //    r14.w = step count + int(frac(random number)*16)
458 0x00001448:     and r14.w, r14.w, l(15)                                       //    r14.w = random index
459 0x00001464:     mul r15.x, r14.z, g_TangentJitterScale                        //    r15.x = sample voxel size * g_TangentJitterScale
460 0x00001484:     mul r15.xy, r15.xxxx, dcl_immediateConstantBuffer[r14.w + 0].xyxx
461 0x000014A4:     mad r15.xzw, r2.xxyw, r15.xxxx, r12.xxyz
462 0x000014C8:     mad r15.xyz, r7.xyzx, r15.yyyy, r15.xzwx
463 0x000014EC:   else 
464 0x000014F0:     mov r15.xyz, r12.xyzx
465 0x00001504:   endif 
466 // r15.xyz = final sample position
467 
468 // calculate clipmap level weight
469 // r14.y = clip map level
470 0x00001508:   round_ni r14.w, r14.y                                           // r14.w = round(clip map level)
471 0x0000151C:   add r15.w, -r14.w, r14.y                                        // r15.w = frac(clip map level)
472 0x0000153C:   add r16.x, -r15.w, l(1.000000)                                  // r16.x = weight for lower level = 1 - frac(clip map level)
473 0x0000155C:   mul r16.x, r13.y, r16.x
474 0x00001578:   lt r14.y, MaxMipmapLevel.x, r14.y
475 0x00001598:   mul r13.y, r13.y, r15.w
476 0x000015B4:   movc r13.y, r14.y, l(0), r13.y
477 0x000015D8:   ftoi r14.y, r14.w                                               // r14.y = int(floor(level))
478 
479 // calculate clip map address
480 0x000015EC:   add r15.xyz, r15.xyzx, -ClipmapCenter.xyzx
481 0x00001610:   mad r16.yzw, r15.xxyz, g_VxgiTranslationParameters[r14.y + 0].xxxx, l(0.000000, 0.500000, 0.500000, 0.500000)
482 0x00001648:   add r16.yzw, r16.yyzw, g_VxgiTranslationParameters2[r14.y + 13].xxyz
483 0x00001670:   frc r16.yzw, r16.yyzw
484 0x00001684:   mul r17.xy, r16.yzyy, g_VxgiTranslationParameters[r14.y + 0].yyyy
485 0x000016A8:   mad r17.z, r16.w, g_VxgiTranslationParameters[r14.y + 0].y, g_VxgiTranslationParameters[r14.y + 0].z
486 0x000016DC:   mul r17.xyz, r17.xyzx, rOpacityTextureSize.xyzx
487 0x000016FC:   mad r18.xy, r16.yzyy, g_VxgiTranslationParameters[r14.y + 0].yyyy, l(1.000000, 0.000000, 0.000000, 0.000000)
488 0x00001734:   mad r18.z, r16.w, g_VxgiTranslationParameters[r14.y + 0].y, g_VxgiTranslationParameters[r14.y + 0].w
489 0x00001768:   mul r16.yzw, r18.xxyz, rEmittanceTextureSize.xxyz
490 0x00001788:   add r15.w, r14.w, l(1.000000)
491 0x000017A4:   ftoi r15.w, r15.w
492 
493 0x000017B8:   mad r15.xyz, r15.xyzx, g_VxgiTranslationParameters[r15.w + 0].xxxx, l(0.500000, 0.500000, 0.500000, 0.000000)
494 0x000017F0:   add r15.xyz, r15.xyzx, g_VxgiTranslationParameters2[r15.w + 13].xyzx
495 0x00001818:   frc r15.xyz, r15.xyzx
496 0x0000182C:   mul r18.xy, r15.xyxx, g_VxgiTranslationParameters[r15.w + 0].yyyy
497 0x00001850:   mad r18.z, r15.z, g_VxgiTranslationParameters[r15.w + 0].y, g_VxgiTranslationParameters[r15.w + 0].z
498 0x00001884:   mul r18.xyz, r18.xyzx, rOpacityTextureSize.xyzx
499 0x000018A4:   mad r19.xy, r15.xyxx, g_VxgiTranslationParameters[r15.w + 0].yyyy, l(1.000000, 0.000000, 0.000000, 0.000000)
500 0x000018DC:   mad r19.z, r15.z, g_VxgiTranslationParameters[r15.w + 0].y, g_VxgiTranslationParameters[r15.w + 0].w
501 0x00001910:   mul r15.xyz, r19.xyzx, rEmittanceTextureSize.xyzx
502 
503 // sample lower opacity clipmap
504 0x00001930:   sample_l_indexable(texture3d)(float,float,float,float) r19.xyzw, r17.xyzx, t_OpacityMap_Pos.xyzw, s_VoxelTextureSampler, l(0.000000)
505 0x00001964:   if_nz r8.z                                                      // if(Use6DOpacity)
506 0x00001970:     sample_l_indexable(texture3d)(float,float,float,float) r17.xyz, r17.xyzx, t_OpacityMap_Neg.xyzw, s_VoxelTextureSampler, l(0.000000)
507 0x000019A4:     mul_sat r20.xyz, -r9.xyzx, r19.xyzx
508 0x000019C4:     add r15.w, r20.y, r20.x
509 0x000019E0:     add r15.w, r20.z, r15.w
510 0x000019FC:     min r15.w, r15.w, l(1.000000)
511 0x00001A18:     mul_sat r17.xyz, r9.xyzx, r17.xyzx
512 0x00001A34:     add r17.x, r17.y, r17.x
513 0x00001A50:     add r17.x, r17.z, r17.x
514 0x00001A6C:     min r17.x, r17.x, l(1.000000)
515 0x00001A88:     add r15.w, r15.w, r17.x
516 0x00001AA4:   else 
517 0x00001AA8:     mul_sat r17.xyz, r6.xyzx, r19.xyzx
518 0x00001AC4:     add r17.x, r17.y, r17.x
519 0x00001AE0:     add r17.x, r17.z, r17.x
520 0x00001AFC:     min r15.w, r17.x, l(1.000000)                                        // r15.w = lower opacity
521 0x00001B18:   endif 
522 0x00001B1C:   ne r17.y, r19.w, l(0.000000)                                           // r17.y = if lower voxel is occupied
523 
524 // sample higher opacity clipmap
525 0x00001B38:   sample_l_indexable(texture3d)(float,float,float,float) r19.xyzw, r18.xyzx, t6.xyzw, s_VoxelTextureSampler, l(0.000000)
526 0x00001B6C:   if_nz r8.z
527 0x00001B78:     sample_l_indexable(texture3d)(float,float,float,float) r18.xyz, r18.xyzx, t_OpacityMap_Neg.xyzw, s_VoxelTextureSampler, l(0.000000)
528 0x00001BAC:     mul_sat r20.xyz, -r9.xyzx, r19.xyzx
529 0x00001BCC:     add r18.w, r20.y, r20.x
530 0x00001BE8:     add r18.w, r20.z, r18.w
531 0x00001C04:     mul_sat r18.xyz, r9.xyzx, r18.xyzx
532 0x00001C20:     add r18.x, r18.y, r18.x
533 0x00001C3C:     add r18.x, r18.z, r18.x
534 0x00001C58:     min r18.xw, r18.xxxw, l(1.000000, 0.000000, 0.000000, 1.000000)
535 0x00001C80:     add r18.x, r18.x, r18.w
536 0x00001C9C:   else 
537 0x00001CA0:     mul_sat r18.yzw, r6.xxyz, r19.xxyz
538 0x00001CBC:     add r18.y, r18.z, r18.y
539 0x00001CD8:     add r18.y, r18.w, r18.y
540 0x00001CF4:     min r18.x, r18.y, l(1.000000)                                        // r18.x = higher opacity
541 0x00001D10:   endif 
542 0x00001D14:   ne r17.x, r19.w, l(0.000000)                                           // r17.x = if higher voxel is occupied
543 
544 0x00001D30:   mul r18.x, r13.y, r18.x
545 0x00001D4C:   mad_sat r15.w, r15.w, r16.x, r18.x
546 0x00001D70:   add r14.w, r14.w, r14.w
547 0x00001D8C:   exp r14.w, r14.w
548 0x00001DA0:   mul r14.w, r7.w, r14.w
549 0x00001DBC:   mul r13.y, r13.y, r14.w
550 0x00001DD8:   mul r17.w, r16.x, r14.w
551 0x00001DF4:   mul r17.z, r13.y, l(4.000000)
552 0x00001E10:   and r13.y, r14.y, l(1)
553 0x00001E2C:   movc r17.xyzw, r13.yyyy, r17.xyzw, r17.yxwz
554 
555 // sample even color clipmap
556 0x00001E50:   if_nz r17.x
557 0x00001E5C:     movc r18.xyz, r13.yyyy, r15.xyzx, r16.yzwy
558 0x00001E80:     add r19.xyz, r10.xyyx, r18.xyzx
559 0x00001E9C:     add r20.xyz, r11.xzzx, r18.xyzx
560 0x00001EB8:     add r18.xyz, r11.yzzy, r18.xyzx
561 0x00001ED4:     sample_l_indexable(texture3d)(float,float,float,float) r19.xyz, r19.xyzx, t_EmittanceEven.xyzw, s_VoxelTextureSampler, l(0.000000)
562 0x00001F08:     sample_l_indexable(texture3d)(float,float,float,float) r20.xyz, r20.xyzx, t_EmittanceEven.xyzw, s_VoxelTextureSampler, l(0.000000)
563 0x00001F3C:     sample_l_indexable(texture3d)(float,float,float,float) r18.xyz, r18.xyzx, t_EmittanceEven.xyzw, s_VoxelTextureSampler, l(0.000000)
564 0x00001F70:     mul r20.xyz, r6.yyyy, r20.xyzx
565 0x00001F8C:     mad r19.xyz, r6.xxxx, r19.xyzx, r20.xyzx
566 0x00001FB0:     mad r18.xyz, r6.zzzz, r18.xyzx, r19.xyzx
567 0x00001FD4:     mul r18.xyz, r17.zzzz, r18.xyzx
568 0x00001FF0:   else 
569 0x00001FF4:     mov r18.xyz, l(0,0,0,0)
570 0x00002014:   endif 
571 // r18.xyz = even color
572 
573 // sample odd color clipmap
574 0x00002018:   lt r14.y, l(0.000000), r17.w
575 0x00002034:   and r14.y, r14.y, r17.y
576 0x00002050:   if_nz r14.y
577 0x0000205C:     movc r15.xyz, r13.yyyy, r16.yzwy, r15.xyzx
578 0x00002080:     add r16.xyz, r10.xzzx, r15.xyzx
579 0x0000209C:     add r19.xyz, r11.xwwx, r15.xyzx
580 0x000020B8:     add r15.xyz, r11.ywwy, r15.xyzx
581 0x000020D4:     sample_l_indexable(texture3d)(float,float,float,float) r16.xyz, r16.xyzx, t_EmittanceOdd.xyzw, s_VoxelTextureSampler, l(0.000000)
582 0x00002108:     sample_l_indexable(texture3d)(float,float,float,float) r19.xyz, r19.xyzx, t_EmittanceOdd.xyzw, s_VoxelTextureSampler, l(0.000000)
583 0x0000213C:     sample_l_indexable(texture3d)(float,float,float,float) r15.xyz, r15.xyzx, t_EmittanceOdd.xyzw, s_VoxelTextureSampler, l(0.000000)
584 0x00002170:     mul r19.xyz, r6.yyyy, r19.xyzx
585 0x0000218C:     mad r16.xyz, r6.xxxx, r16.xyzx, r19.xyzx
586 0x000021B0:     mad r15.xyz, r6.zzzz, r15.xyzx, r16.xyzx
587 0x000021D4:     mad r18.xyz, r15.xyzx, r17.wwww, r18.xyzx
588 0x000021F8:     mov r17.x, l(-1)
589 0x0000220C:   endif 
590 // r18.xyz = final interpolated color
591 
592 // Add color contribution and update transparency for environment map
593 0x00002210:   mul r15.xyz, r3.wwww, r18.xyzx                                  // r15.xyz = scaled color = rEmittanceStorageScale.y * g_EmittanceScale * r18.xyz
594 0x0000222C:   div r13.y, r4.w, r14.z
595 0x00002248:   mul r13.y, r13.y, r13.y
596 0x00002264:   mul r14.yzw, r13.yyyy, r15.xxyz
597 0x00002280:   movc r14.yzw, r17.xxxx, r14.yyzw, r18.xxyz
598 0x000022A4:   lt r13.y, l(0.000000), r15.w
599 0x000022C0:   add r15.x, -r15.w, l(1.000000)
600 0x000022E0:   mul r15.y, r14.x, g_OpacityCorrectionFactor
601 0x00002300:   div r13.w, r15.y, r13.w
602 0x0000231C:   log r15.x, r15.x
603 0x00002330:   mul r13.w, r13.w, r15.x
604 0x0000234C:   exp r13.w, r13.w
605 0x00002360:   add r13.w, -r13.w, l(1.000000)
606 0x00002380:   and r13.y, r13.w, r13.y
607 0x0000239C:   mad r14.yzw, r10.wwww, r14.yyzw, r5.yyzw
608 0x000023C0:   add r13.y, -r13.y, l(1.000000)
609 0x000023E0:   mul r13.y, r8.w, r13.y
610 // r13.y = new transparency for environment map
611 //       = old transparency * (1 - ((1- intepolated opacity) ^ (step in voxels * g_OpacityCorrectionFactor / diameter in voxels))), if intepolated opacity < 1
612 //       = old transparency, otherwise
613 // r14.yzw = new indirect color
614 //         = old indirect color + intepolated color * the second last transparency
615 
616 // terminate cone tracing
617 0x000023FC:   lt r13.w, r9.w, l(0.000100)
618 0x00002418:   if_nz r13.w
619 0x00002424:     mov r5.yzw, r14.yyzw
620 0x00002438:     mov r8.w, r13.y
621 0x0000244C:     break 
622 0x00002450:   endif 
623 
624 0x00002454:   mad r12.w, r13.z, g_TracingStep, r12.w
625 0x0000247C:   mul r13.z, r14.x, FinestVoxelSize.y                             // r13.z = step length = step length in voxel count * voxel size
626 0x0000249C:   mad r12.xyz, r13.zzzz, r3.xyzx, r12.xyzx                        // r12.xyz = new sample position = step length * reflection vector + old sample position
627 0x000024C0:   add r13.x, r13.x, l(1.000000)                                   // r13.x = step count += 1
628 0x000024DC:   mov r5.yzw, r14.yyzw                                            // r5.yzw = indirect color
629 0x000024F0:   mov r13.z, r8.w                                                 // r13.z = tranparency
630 0x00002504:   mov r10.w, r9.w                                                 // r10.w = tranparency
631 0x00002518:   mov r8.w, r13.y                                                 // r8.w = new transparency for env map = r13.y
632 0x0000252C:   mov r9.w, r13.z                                                 // r9.w = transparency
633 0x00002540: endloop 
634 // r5.yzw = indirect light
635 // r8.w = latest transparency for environment map
636 // r9.w = last transparency for environment map
637 // r13.z = the second last transparency for environment map
638 
639 // sample environment map
640 0x00002544: add_sat r2.w, -r8.w, l(1.000000)
641 0x00002564: add r1.x, -r2.w, l(1.000000)
642 0x00002584: mul r1.xyz, r1.xxxx, g_EnvironmentMapTint.xyzx
643 0x000025A4: lt r4.xyz, l(0.000000, 0.000000, 0.000000, 0.000000), r1.xyzx
644 0x000025CC: or r3.w, r4.y, r4.x
645 0x000025E8: or r3.w, r4.z, r3.w
646 0x00002604: if_nz r3.w
647 0x00002610:   mul r3.w, r4.w, g_EnvironmentMapResolution
648 0x00002630:   log r3.w, r3.w
649 0x00002644:   add r3.w, r3.w, l(-1.000000)
650 0x00002660:   max r3.w, r3.w, l(0.000000)
651 0x0000267C:   min r3.w, r3.w, g_MaxEnvironmentMapMipLevel
652 0x0000269C:   sample_l_indexable(texturecube)(float,float,float,float) r3.xyz, r3.xyzx, t_EnvironmentMap.xyzw, s_EnvironmentMapSampler, r3.w
653 0x000026D0:   mul r1.xyz, r1.xyzx, r3.xyzx
654 0x000026EC:   mul r3.x, r4.w, r4.w
655 0x00002708:   mad r5.yzw, r1.xxyz, r3.xxxx, r5.yyzw
656 0x0000272C: endif 
657 // r5.yzw = indirect light
658 
659 // handle tamporal reprojection weight
660 0x00002730: mul r1.x, r1.w, r1.w
661 0x0000274C: mul r1.x, r1.x, l(3.141593)
662 0x00002768: div r2.xyz, r5.yzwy, r1.xxxx
663 0x00002784: if_nz r8.y
664 0x00002790:   mad r1.x, v0.x, l(2.000000), l(-1.000000)
665 0x000027B4:   mad r1.y, -v0.y, l(2.000000), l(1.000000)
666 0x000027DC:   mul r3.xyzw, r1.yyyy, g_ReprojectionMatrix.xyzw
667 0x000027FC:   mad r1.xyzw, r1.xxxx, g_ReprojectionMatrix.xyzw, r3.xyzw
668 0x00002824:   mad r1.xyzw, r0.xxxx, g_ReprojectionMatrix.xyzw, r1.xyzw
669 0x0000284C:   add r1.xyzw, r1.xyzw, g_ReprojectionMatrix.xyzw
670 0x0000286C:   ge r3.xyz, |r1.xyzx|, r1.wwww
671 0x0000288C:   or r0.x, r3.y, r3.x
672 0x000028A8:   or r0.x, r3.z, r0.x
673 0x000028C4:   ge r3.x, l(0.000000), r1.w
674 0x000028E0:   or r0.x, r0.x, r3.x
675 0x000028FC:   if_z r0.x
676 0x00002908:     div r1.xyz, r1.xyzx, r1.wwww
677 0x00002924:     mad r0.x, r1.x, l(0.500000), l(0.500000)
678 0x00002948:     mad r3.x, r0.x, viewportSize.z, viewportOrigin.x
679 0x00002974:     mad r0.x, -r1.y, l(0.500000), l(0.500000)
680 0x0000299C:     mad r3.y, r0.x, viewportSize.y, viewportOrigin.y
681 0x000029C8:     add r0.x, r1.z, -projectionA
682 0x000029EC:     div r0.x, projectionB, r0.x
683 0x00002A0C:     add r1.xyzw, r3.xyxy, l(-0.500000, -0.500000, -0.500000, 0.500000)
684 0x00002A34:     round_ni r1.xyzw, r1.xyzw
685 0x00002A48:     ftoi r4.xy, r1.xyxx
686 0x00002A5C:     mov r4.zw, l(0,0,0,0)
687 0x00002A7C:     ld_indexable(texture2d)(float,float,float,float) r3.z, r4.xyww, g_PrevDepthBuffer.yzxw
688 0x00002AA0:     mad r3.z, r3.z, depthScale, depthBias
689 0x00002ACC:     add r3.z, r3.z, -projectionA
690 0x00002AF0:     div r3.z, projectionB, r3.z
691 0x00002B10:     ld_indexable(texture2d)(float,float,float,float) r5.xyz, r4.xyww, g_PrevTargetNormal.xyzw
692 0x00002B34:     mad r5.xyz, r5.xyzx, normalScale.xxxx, normalBias.yyyy
693 0x00002B60:     dp3 r3.w, r5.xyzx, r5.xyzx
694 0x00002B7C:     sqrt r3.w, r3.w
695 0x00002B90:     div r5.xyz, r5.xyzx, r3.wwww
696 0x00002BAC:     ge r3.w, l(0.000000), r3.w
697 0x00002BC8:     movc r5.xyz, r3.wwww, l(0,0,0,0), r5.xyzx
698 0x00002BF8:     ld_indexable(texture2d)(float,float,float,float) r4.xyzw, r4.xyzw, g_PrevSpecular.xyzw
699 0x00002C1C:     add r3.z, r0.x, -r3.z
700 0x00002C3C:     mad_sat r3.z, -|r3.z|, g_ReprojectionDepthWeightScale, l(1.000000)
701 0x00002C68:     dp3_sat r3.w, r0.yzwy, r5.xyzx
702 0x00002C84:     log r3.w, r3.w
703 0x00002C98:     mul r3.w, r3.w, g_ReprojectionNormalWeightExponent
704 0x00002CB8:     exp r3.w, r3.w
705 0x00002CCC:     min r3.w, r3.w, l(1.000000)
706 0x00002CE8:     add r5.xyzw, -r1.xyzw, r3.xyxy
707 0x00002D08:     add r5.xyzw, r5.xyzw, l(-0.500000, -0.500000, -0.500000, -0.500000)
708 0x00002D30:     add r5.xyzw, -|r5.xyzw|, l(1.000000, 1.000000, 1.000000, 1.000000)
709 0x00002D5C:     mul_sat r1.xy, r5.ywyy, r5.xzxx
710 0x00002D78:     mul r3.z, r3.w, r3.z
711 0x00002D94:     mul r1.x, r1.x, r3.z
712 0x00002DB0:     and r3.z, r1.x, l(0x7f800000)
713 0x00002DCC:     ieq r3.z, r3.z, l(0x7f800000)
714 0x00002DE8:     and r5.xyzw, r4.xyzw, l(0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000)
715 0x00002E10:     ieq r5.xyzw, r5.xyzw, l(0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000)
716 0x00002E38:     or r3.w, r5.y, r5.x
717 0x00002E54:     or r3.w, r5.z, r3.w
718 0x00002E70:     or r3.w, r5.w, r3.w
719 0x00002E8C:     or r3.z, r3.w, r3.z
720 0x00002EA8:     mul r4.xyzw, r1.xxxx, r4.xyzw
721 0x00002EC4:     movc r4.xyzw, r3.zzzz, l(0,0,0,0), r4.xyzw
722 0x00002EF4:     movc r1.x, r3.z, l(0), r1.x
723 0x00002F18:     ftoi r5.xy, r1.zwzz
724 0x00002F2C:     mov r5.zw, l(0,0,0,0)
725 0x00002F4C:     ld_indexable(texture2d)(float,float,float,float) r1.z, r5.xyww, g_PrevDepthBuffer.yzxw
726 0x00002F70:     mad r1.z, r1.z, depthScale, depthBias
727 0x00002F9C:     add r1.z, r1.z, -projectionA
728 0x00002FC0:     div r1.z, projectionB, r1.z
729 0x00002FE0:     ld_indexable(texture2d)(float,float,float,float) r6.xyz, r5.xyww, g_PrevTargetNormal.xyzw
730 0x00003004:     mad r6.xyz, r6.xyzx, normalScale.xxxx, normalBias.yyyy
731 0x00003030:     dp3 r1.w, r6.xyzx, r6.xyzx
732 0x0000304C:     sqrt r1.w, r1.w
733 0x00003060:     div r6.xyz, r6.xyzx, r1.wwww
734 0x0000307C:     ge r1.w, l(0.000000), r1.w
735 0x00003098:     movc r6.xyz, r1.wwww, l(0,0,0,0), r6.xyzx
736 0x000030C8:     ld_indexable(texture2d)(float,float,float,float) r5.xyzw, r5.xyzw, g_PrevSpecular.xyzw
737 0x000030EC:     add r1.z, r0.x, -r1.z
738 0x0000310C:     mad_sat r1.z, -|r1.z|, g_ReprojectionDepthWeightScale, l(1.000000)
739 0x00003138:     dp3_sat r1.w, r0.yzwy, r6.xyzx
740 0x00003154:     log r1.w, r1.w
741 0x00003168:     mul r1.w, r1.w, g_ReprojectionNormalWeightExponent
742 0x00003188:     exp r1.w, r1.w
743 0x0000319C:     min r1.w, r1.w, l(1.000000)
744 0x000031B8:     mul r1.z, r1.w, r1.z
745 0x000031D4:     mul r1.w, r1.y, r1.z
746 0x000031F0:     and r3.z, r1.w, l(0x7f800000)
747 0x0000320C:     ieq r3.z, r3.z, l(0x7f800000)
748 0x00003228:     and r6.xyzw, r5.xyzw, l(0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000)
749 0x00003250:     ieq r6.xyzw, r6.xyzw, l(0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000)
750 0x00003278:     or r3.w, r6.y, r6.x
751 0x00003294:     or r3.w, r6.z, r3.w
752 0x000032B0:     or r3.w, r6.w, r3.w
753 0x000032CC:     or r3.z, r3.w, r3.z
754 0x000032E8:     mad r5.xyzw, r5.xyzw, r1.wwww, r4.xyzw
755 0x0000330C:     mad r1.y, r1.z, r1.y, r1.x
756 0x00003330:     movc r4.xyzw, r3.zzzz, r4.xyzw, r5.xyzw
757 0x00003354:     movc r1.x, r3.z, r1.x, r1.y
758 0x00003378:     add r5.xyzw, r3.xyxy, l(0.500000, -0.500000, 0.500000, 0.500000)
759 0x000033A0:     round_ni r5.xyzw, r5.xyzw
760 0x000033B4:     ftoi r6.xy, r5.xyxx
761 0x000033C8:     mov r6.zw, l(0,0,0,0)
762 0x000033E8:     ld_indexable(texture2d)(float,float,float,float) r1.y, r6.xyww, g_PrevDepthBuffer.yxzw
763 0x0000340C:     mad r1.y, r1.y, depthScale, depthBias
764 0x00003438:     add r1.y, r1.y, -projectionA
765 0x0000345C:     div r1.y, projectionB, r1.y
766 0x0000347C:     ld_indexable(texture2d)(float,float,float,float) r7.xyz, r6.xyww, g_PrevTargetNormal.xyzw
767 0x000034A0:     mad r7.xyz, r7.xyzx, normalScale.xxxx, normalBias.yyyy
768 0x000034CC:     dp3 r1.z, r7.xyzx, r7.xyzx
769 0x000034E8:     sqrt r1.z, r1.z
770 0x000034FC:     div r7.xyz, r7.xyzx, r1.zzzz
771 0x00003518:     ge r1.z, l(0.000000), r1.z
772 0x00003534:     movc r7.xyz, r1.zzzz, l(0,0,0,0), r7.xyzx
773 0x00003564:     ld_indexable(texture2d)(float,float,float,float) r6.xyzw, r6.xyzw, g_PrevSpecular.xyzw
774 0x00003588:     add r1.y, r0.x, -r1.y
775 0x000035A8:     mad_sat r1.y, -|r1.y|, g_ReprojectionDepthWeightScale, l(1.000000)
776 0x000035D4:     dp3_sat r1.z, r0.yzwy, r7.xyzx
777 0x000035F0:     log r1.z, r1.z
778 0x00003604:     mul r1.z, r1.z, cg_ReprojectionNormalWeightExponent
779 0x00003624:     exp r1.z, r1.z
780 0x00003638:     min r1.z, r1.z, l(1.000000)
781 0x00003654:     add r3.xyzw, r3.xyxy, -r5.xyzw
782 0x00003674:     add r3.xyzw, r3.xyzw, l(-0.500000, -0.500000, -0.500000, -0.500000)
783 0x0000369C:     add r3.xyzw, -|r3.xyzw|, l(1.000000, 1.000000, 1.000000, 1.000000)
784 0x000036C8:     mul_sat r3.xy, r3.ywyy, r3.xzxx
785 0x000036E4:     mul r1.y, r1.z, r1.y
786 0x00003700:     mul r1.z, r3.x, r1.y
787 0x0000371C:     and r1.w, r1.z, l(0x7f800000)
788 0x00003738:     ieq r1.w, r1.w, l(0x7f800000)
789 0x00003754:     and r7.xyzw, r6.xyzw, l(0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000)
790 0x0000377C:     ieq r7.xyzw, r7.xyzw, l(0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000)
791 0x000037A4:     or r3.z, r7.y, r7.x
792 0x000037C0:     or r3.z, r7.z, r3.z
793 0x000037DC:     or r3.z, r7.w, r3.z
794 0x000037F8:     or r1.w, r1.w, r3.z
795 0x00003814:     mad r6.xyzw, r6.xyzw, r1.zzzz, r4.xyzw
796 0x00003838:     mad r1.y, r1.y, r3.x, r1.x
797 0x0000385C:     movc r4.xyzw, r1.wwww, r4.xyzw, r6.xyzw
798 0x00003880:     movc r1.x, r1.w, r1.x, r1.y
799 0x000038A4:     ftoi r5.xy, r5.zwzz
800 0x000038B8:     mov r5.zw, l(0,0,0,0)
801 0x000038D8:     ld_indexable(texture2d)(float,float,float,float) r1.y, r5.xyww, g_PrevDepthBuffer.yxzw
802 0x000038FC:     mad r1.y, r1.y, depthScale, depthBias
803 0x00003928:     add r1.y, r1.y, -projectionA
804 0x0000394C:     div r1.y, projectionB, r1.y
805 0x0000396C:     ld_indexable(texture2d)(float,float,float,float) r3.xzw, r5.xyww, g_PrevTargetNormal.xwyz
806 0x00003990:     mad r3.xzw, r3.xxzw, normalScale.xxxx, normalBias.yyyy
807 0x000039BC:     dp3 r1.z, r3.xzwx, r3.xzwx
808 0x000039D8:     sqrt r1.z, r1.z
809 0x000039EC:     div r3.xzw, r3.xxzw, r1.zzzz
810 0x00003A08:     ge r1.z, l(0.000000), r1.z
811 0x00003A24:     movc r3.xzw, r1.zzzz, l(0,0,0,0), r3.xxzw
812 0x00003A54:     ld_indexable(texture2d)(float,float,float,float) r5.xyzw, r5.xyzw, g_PrevSpecular.xyzw
813 0x00003A78:     add r0.x, r0.x, -r1.y
814 0x00003A98:     mad_sat r0.x, -|r0.x|, g_ReprojectionDepthWeightScale, l(1.000000)
815 0x00003AC4:     dp3_sat r0.y, r0.yzwy, r3.xzwx
816 0x00003AE0:     log r0.y, r0.y
817 0x00003AF4:     mul r0.y, r0.y, g_ReprojectionNormalWeightExponent
818 0x00003B14:     exp r0.y, r0.y
819 0x00003B28:     min r0.y, r0.y, l(1.000000)
820 0x00003B44:     mul r0.x, r0.y, r0.x
821 0x00003B60:     mul r0.y, r3.y, r0.x
822 0x00003B7C:     and r0.z, r0.y, l(0x7f800000)
823 0x00003B98:     ieq r0.z, r0.z, l(0x7f800000)
824 0x00003BB4:     and r6.xyzw, r5.xyzw, l(0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000)
825 0x00003BDC:     ieq r6.xyzw, r6.xyzw, l(0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000)
826 0x00003C04:     or r0.w, r6.y, r6.x
827 0x00003C20:     or r0.w, r6.z, r0.w
828 0x00003C3C:     or r0.w, r6.w, r0.w
829 0x00003C58:     or r0.z, r0.w, r0.z
830 0x00003C74:     mad r5.xyzw, r5.xyzw, r0.yyyy, r4.xyzw
831 0x00003C98:     mad r0.x, r0.x, r3.y, r1.x
832 0x00003CBC:     movc r3.xyzw, r0.zzzz, r4.xyzw, r5.xyzw
833 0x00003CE0:     movc r0.x, r0.z, r1.x, r0.x
834 0x00003D04:   else 
835 0x00003D08:     mov r3.xyzw, l(0,0,0,0)
836 0x00003D28:     mov r0.x, l(0)
837 0x00003D3C:   endif 
838 0x00003D40:   mad r0.x, -r0.x, g_TemporalReprojectionWeight, l(1.000000)
839 0x00003D6C:   mul r1.xyzw, r3.xyzw, g_TemporalReprojectionWeight.zzzz
840 0x00003D8C:   mad r2.xyzw, r2.xyzw, r0.xxxx, r1.xyzw
841 0x00003DB0: endif 
842 
843 0x00003DB4: and r0.x, r2.x, l(0x7f800000)
844 0x00003DD0: ieq r0.x, r0.x, l(0x7f800000)
845 0x00003DEC: movc o0.x, r0.x, l(0), r2.x
846 0x00003E10: and r0.x, r2.y, l(0x7f800000)
847 0x00003E2C: ieq r0.x, r0.x, l(0x7f800000)
848 0x00003E48: movc o0.y, r0.x, l(0), r2.y
849 0x00003E6C: and r0.x, r2.z, l(0x7f800000)
850 0x00003E88: ieq r0.x, r0.x, l(0x7f800000)
851 0x00003EA4: movc o0.z, r0.x, l(0), r2.z
852 0x00003EC8: and r0.x, r2.w, l(0x7f800000)
853 0x00003EE4: ieq r0.x, r0.x, l(0x7f800000)
854 0x00003F00: movc o0.w, r0.x, l(0), r2.w
855 0x00003F24: ret 
856 // Approximately 521 instruction slots used

 


 

转载于:https://www.cnblogs.com/dydx/p/9517270.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值