Skip to content

Commit

Permalink
Far Cry 4: Fix direct sun shafts with correct occlusion
Browse files Browse the repository at this point in the history
These now line up correctly with branches, etc. The trick was adjusting
the propagation amount so that they retain their occlusion while
propagating in the correct direction in stereo.
  • Loading branch information
DarkStarSword committed Mar 8, 2015
1 parent c58418c commit 007e1a2
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 117 deletions.
11 changes: 9 additions & 2 deletions FC4/ShaderFixes/23314f6e050d3f58-ps_replace.txt
@@ -1,3 +1,4 @@
// Various post processing effects - bloom, lens grit, direct sun shafts (pass 4/4)

cbuffer CPostFxHDRBloomEffectsParameterProvider : register(b0)
{
Expand Down Expand Up @@ -90,8 +91,14 @@ else /* right eye */
// r2.xyz = 0;

r0.xyz = r1.xyz * r2.xyz + r0.xyz;
coords.x = v1.x - stereo.x / 2;
r1.xyz = GodRaysSampler.SampleLevel(LinearTextureSampler_s, coords, 0.000000000e+000).xyz;

// Part of an early attempt to fix god rays (direct, not nvidia or volumetric
// fog). Was able to position them correctly, but they were not being occluded
// accurately. Instead they are now fixed in the two propagation shaders.
//coords.x = v1.x - stereo.x / 2;
//r1.xyz = GodRaysSampler.SampleLevel(LinearTextureSampler_s, coords, 0.000000000e+000).xyz;
r1.xyz = GodRaysSampler.SampleLevel(LinearTextureSampler_s, v1.xy, 0.000000000e+000).xyz;

r0.xyz = _CombineSettings.xxx * r1.xyz + r0.xyz;
o0.xyz = _CombineSettings.www * r0.xyz;
o0.w = 0.000000000e+000;
Expand Down
17 changes: 11 additions & 6 deletions FC4/ShaderFixes/6831f29e59799e2f-vs_replace.txt
@@ -1,5 +1,7 @@
// Direct sun shafts + other celestial objects
// Using partner pixel shader filtering in d3dx.ini to only adjust sun shafts
// Direct sun shafts (pass 1/4) + other celestial objects

// Was using partner pixel shader filtering in d3dx.ini to only adjust sun
// shafts, now doing the fix in parts 2+3 instead of here.

cbuffer CViewportShaderParameterProvider : register(b0)
{
Expand Down Expand Up @@ -66,11 +68,14 @@ void main(
o0.z = dot(v0.xyzw, _ModelViewProj._m02_m12_m22_m32);
o0.w = dot(v0.xyzw, _ModelViewProj._m03_m13_m23_m33);

// Fix sun shaft origin so they cast towards the camera instead of off to the side.
// NOTE: would break sun position, so using partner shader filtering so this
// Part of an early attempt to fix god rays (direct, not nvidia or volumetric
// fog). Was able to position them correctly, but they were not being occluded
// accurately. Instead they are now fixed in the two propagation shaders.

// NOTE: would break sun position, so use partner shader filtering so this
// only applies when used with the sun shaft pixel shader
float4 stereo = StereoParams.Load(0);
o0.x -= stereo.x * o0.w; //(o0.w - stereo.y);
//float4 stereo = StereoParams.Load(0);
//o0.x -= stereo.x * (o0.w - stereo.y);

r0.xyz = v0.yzx * _CameraDistances.yyy + _SkyPosition.yzx;
r0.xyz = -_CameraPosition_DistanceScale.yzx + r0.xyz;
Expand Down
116 changes: 13 additions & 103 deletions FC4/ShaderFixes/6ca2e5c46157f0e3-ps_replace.txt
@@ -1,3 +1,4 @@
// Direct sun shafts (pass 2/4)

cbuffer CPostFxAtmosphericScatteringParameterProvider : register(b0)
{
Expand All @@ -24,7 +25,17 @@ void main(
float4 fDest;

r0.xyzw = SrcSampler__TexObj__.SampleLevel(SrcSampler__SampObj___s, v1.xy, 0.000000000e+000).xyzw;
r1.xy = v1.xy * _CombinedParamsScaleNextGen.xy + _CombinedParamsScaleNextGen.zw;

// For testing before propagating too far:
// o0 = r0 * 10;
//return;

// Fix god ray propagation:
float4 stereo = StereoParams.Load(0);
float2 adj = v1.xy;
adj.x -= stereo.x / 2;
r1.xy = adj.xy * _CombinedParamsScaleNextGen.xy + _CombinedParamsScaleNextGen.zw;

r1.zw = v1.xy + r1.xy;
r2.xyzw = SrcSampler__TexObj__.SampleLevel(SrcSampler__SampObj___s, r1.zw, 0.000000000e+000).xyzw;
r1.zw = r1.zw + r1.xy;
Expand Down Expand Up @@ -70,7 +81,7 @@ void main(
return;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Original ASM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
//
Expand Down Expand Up @@ -169,104 +180,3 @@ ret
// Approximately 45 instruction slots used

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Recompiled ASM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.30.9200.20789
//
//
// Buffer Definitions:
//
// cbuffer CPostFxAtmosphericScatteringParameterProvider
// {
//
// float4 _CombinedParamsColorNextGen;// Offset: 0 Size: 16
// float4 _CombinedParamsScaleNextGen;// Offset: 16 Size: 16
// float4 _QuadParams; // Offset: 32 Size: 16 [unused]
// float4 _SunPosition_Attenuation_Zoom;// Offset: 48 Size: 16 [unused]
// float3 _ColorTint; // Offset: 64 Size: 12 [unused]
//
// }
//
//
// Resource Bindings:
//
// Name Type Format Dim Slot Elements
// ------------------------------ ---------- ------- ----------- ---- --------
// SrcSampler__SampObj___s sampler NA NA 0 1
// SrcSampler__TexObj__ texture float4 2d 0 1
// CPostFxAtmosphericScatteringParameterProvider cbuffer NA NA 0 1
//
//
//
// Input signature:
//
// Name Index Mask Register SysValue Format Used
// -------------------- ----- ------ -------- -------- ------- ------
// SV_Position 0 xyzw 0 POS float
// TEXCOORD 0 xy 1 NONE float xy
// SV_IsFrontFace 0 x 2 FFACE uint
//
//
// Output signature:
//
// Name Index Mask Register SysValue Format Used
// -------------------- ----- ------ -------- -------- ------- ------
// SV_Target 0 xyzw 0 TARGET float xyzw
//
ps_4_0
dcl_constantbuffer cb0[2], immediateIndexed
dcl_sampler s0, mode_default
dcl_resource_texture2d (float,float,float,float) t0
dcl_input_ps linear v1.xy
dcl_output o0.xyzw
dcl_temps 4
sample_l r0.xyzw, v1.xyxx, t0.xyzw, s0, l(0.000000)
mad r1.xy, v1.xyxx, cb0[1].xyxx, cb0[1].zwzz
add r1.zw, r1.xxxy, v1.xxxy
sample_l r2.xyzw, r1.zwzz, t0.xyzw, s0, l(0.000000)
add r1.zw, r1.xxxy, r1.zzzw
mul r2.xyz, r2.xyzx, r2.xyzx
mad r0.xyz, r0.xyzx, r0.xyzx, r2.xyzx
sample_l r2.xyzw, r1.zwzz, t0.xyzw, s0, l(0.000000)
add r1.zw, r1.xxxy, r1.zzzw
mad r0.xyz, r2.xyzx, r2.xyzx, r0.xyzx
sample_l r2.xyzw, r1.zwzz, t0.xyzw, s0, l(0.000000)
add r1.zw, r1.xxxy, r1.zzzw
mad r0.xyz, r2.xyzx, r2.xyzx, r0.xyzx
sample_l r2.xyzw, r1.zwzz, t0.xyzw, s0, l(0.000000)
add r1.zw, r1.xxxy, r1.zzzw
mad r0.xyz, r2.xyzx, r2.xyzx, r0.xyzx
sample_l r2.xyzw, r1.zwzz, t0.xyzw, s0, l(0.000000)
add r1.zw, r1.xxxy, r1.zzzw
mad r0.xyz, r2.xyzx, r2.xyzx, r0.xyzx
sample_l r2.xyzw, r1.zwzz, t0.xyzw, s0, l(0.000000)
add r1.zw, r1.xxxy, r1.zzzw
mad r0.xyz, r2.xyzx, r2.xyzx, r0.xyzx
sample_l r2.xyzw, r1.zwzz, t0.xyzw, s0, l(0.000000)
add r1.zw, r1.xxxy, r1.zzzw
mad r0.xyz, r2.xyzx, r2.xyzx, r0.xyzx
sample_l r2.xyzw, r1.zwzz, t0.xyzw, s0, l(0.000000)
add r1.zw, r1.xxxy, r1.zzzw
mad r0.xyz, r2.xyzx, r2.xyzx, r0.xyzx
sample_l r2.xyzw, r1.zwzz, t0.xyzw, s0, l(0.000000)
add r1.zw, r1.xxxy, r1.zzzw
mad r0.xyz, r2.xyzx, r2.xyzx, r0.xyzx
sample_l r2.xyzw, r1.zwzz, t0.xyzw, s0, l(0.000000)
add r1.zw, r1.xxxy, r1.zzzw
mad r0.xyz, r2.xyzx, r2.xyzx, r0.xyzx
sample_l r2.xyzw, r1.zwzz, t0.xyzw, s0, l(0.000000)
add r1.zw, r1.xxxy, r1.zzzw
add r1.xy, r1.xyxx, r1.zwzz
sample_l r3.xyzw, r1.zwzz, t0.xyzw, s0, l(0.000000)
sample_l r1.xyzw, r1.xyxx, t0.xyzw, s0, l(0.000000)
mad r0.xyz, r2.xyzx, r2.xyzx, r0.xyzx
mad r0.xyz, r3.xyzx, r3.xyzx, r0.xyzx
mad r0.xyz, r1.xyzx, r1.xyzx, r0.xyzx
mul o0.xyz, r0.xyzx, cb0[0].xyzx
mov o0.w, l(1.000000)
ret
// Approximately 45 instruction slots used

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
14 changes: 13 additions & 1 deletion FC4/ShaderFixes/e83172ba974a0198-ps_replace.txt
@@ -1,3 +1,4 @@
// Direct sun shafts (pass 3/4)

cbuffer CPostFxAtmosphericScatteringParameterProvider : register(b0)
{
Expand All @@ -23,8 +24,17 @@ void main(
uint4 bitmask, uiDest;
float4 fDest;

float4 stereo = StereoParams.Load(0);

r0.xyzw = SrcSampler__TexObj__.SampleLevel(SrcSampler__SampObj___s, v1.xy, 0.000000000e+000).xyzw;
r1.xy = v1.xy * _CombinedParamsScaleNextGen.xy + _CombinedParamsScaleNextGen.zw;

//o0.x = r0 * 100; // testing propagation

// Fix god ray propagation:
float2 adj = v1.xy;
adj.x -= stereo.x / 2;
r1.xy = adj.xy * _CombinedParamsScaleNextGen.xy + _CombinedParamsScaleNextGen.zw;

r1.zw = v1.xy + r1.xy;
r2.xyzw = SrcSampler__TexObj__.SampleLevel(SrcSampler__SampObj___s, r1.zw, 0.000000000e+000).xyzw;
r1.zw = r1.zw + r1.xy;
Expand All @@ -39,6 +49,7 @@ void main(
r1.zw = r1.zw + r1.xy;
r0.xyz = r2.xyz + r0.xyz;
r2.xyzw = SrcSampler__TexObj__.SampleLevel(SrcSampler__SampObj___s, r1.zw, 0.000000000e+000).xyzw;
//o0.y = r2 * 100; // testing propagation
r1.zw = r1.zw + r1.xy;
r0.xyz = r2.xyz + r0.xyz;
r2.xyzw = SrcSampler__TexObj__.SampleLevel(SrcSampler__SampObj___s, r1.zw, 0.000000000e+000).xyzw;
Expand All @@ -48,6 +59,7 @@ void main(
r1.zw = r1.zw + r1.xy;
r0.xyz = r2.xyz + r0.xyz;
r2.xyzw = SrcSampler__TexObj__.SampleLevel(SrcSampler__SampObj___s, r1.zw, 0.000000000e+000).xyzw;
//o0.z = r2.x * 100; // testing propagation
r1.zw = r1.zw + r1.xy;
r0.xyz = r2.xyz + r0.xyz;
r2.xyzw = SrcSampler__TexObj__.SampleLevel(SrcSampler__SampObj___s, r1.zw, 0.000000000e+000).xyzw;
Expand Down
11 changes: 6 additions & 5 deletions FC4/d3dx.ini
Expand Up @@ -453,11 +453,12 @@ depth_filter = depth_inactive
Hash = ba19f0c9ae1d7486
depth_filter = depth_inactive

[ShaderOverrideSunShafts]
; Vertex shader responsible for direct sun shadts + other celestial objects.
; Only apply adjustment when used with the pixel shader for sun shafts.
Hash = 6831f29e59799e2f
partner = af7b880f07630615
; No longer necessary - fixing sun shafts in alternate shaders instead
; [ShaderOverrideSunShafts]
; ; Vertex shader responsible for direct sun shadts + other celestial objects.
; ; Only apply adjustment when used with the pixel shader for sun shafts.
; Hash = 6831f29e59799e2f
; partner = af7b880f07630615

[KeySwitchWeaponSightAdjustment]
; Switches between two weapon depth adjustments - aligned with the weapon, or
Expand Down

0 comments on commit 007e1a2

Please sign in to comment.