Skip to content

Instantly share code, notes, and snippets.

@kristiker
Last active June 14, 2023 14:41
Show Gist options
  • Save kristiker/45388b8806913540f58ba4173a427f39 to your computer and use it in GitHub Desktop.
Save kristiker/45388b8806913540f58ba4173a427f39 to your computer and use it in GitHub Desktop.
Vr Simple
// VULKAN[6] source bytes (39936) ref=5b6d78009026a5acc5e0a9f79e9b14dc
// SPIR-V source (39844), Glsl reflection with SPIRV-Cross, KhronosGroup
// D_BAKED_LIGHTING_FROM_LIGHTMAP == 1
// D_COMPRESSED_NORMALS_AND_TANGENTS == 0
// D_BLEND == 0
// vs[0][20]
// ps[0](6)
// Stage: VS
cbuffer PerViewConstantBuffer_t : register(b15)
{
float g_flTime : packoffset(c21.w);
column_major float4x4 g_matWorldToProjectionMultiview[2] : packoffset(c32);
float4 g_vWorldToCameraOffsetMultiview[2] : packoffset(c45);
};
cbuffer BakedLightingConstantBuffer_t : register(b18)
{
float4 g_vLightmapUvScale : packoffset(c0);
};
cbuffer PerViewConstantBufferVR_t : register(b17)
{
float4 vInteractionTriggerVolumeWorldToVolumeScale : packoffset(c36);
};
cbuffer _Globals_Vs_ : register(b14)
{
float2 g_vTexCoordScale : packoffset(c9);
float2 g_vTexCoordOffset : packoffset(c9.z);
float2 g_vTexCoordScrollSpeed : packoffset(c10);
float3 g_vColorTint : packoffset(c14);
float g_flModelTintAmount : packoffset(c14.w);
float g_flFadeExponent : packoffset(c15);
};
Texture2D<float4> g_tTransformTexture;
SamplerState smpl;
static float4 gl_Position;
static float3 vPositionOs;
static float2 vTexCoord;
static float4 vNormalOs;
static float4 vTangentUOs_flTangentVSign;
static float2 vTransformTextureUV;
static float2 vLightmapUV;
struct VS_INPUT
{
float4 vNormalOs : NORMAL0 < Semantic( OptionallyCompressedTangentFrame ); >;
float2 vLightmapUV : TEXCOORD3 < Semantic( LightmapUV ); >; // D_BAKED_LIGHTING_FROM_LIGHTMAP=1
float3 vPositionOs : POSITION0 < Semantic( PosXyz ); >;
float4 vTangentUOs_flTangentVSign : TANGENT0 < Semantic( TangentU_SignV ); >; // D_COMPRESSED_NORMALS_AND_TANGENTS=0
float2 vTexCoord : TEXCOORD0 < Semantic( LowPrecisionUv ); >;
float2 vTransformTextureUV : TEXCOORD13 < Semantic( InstanceTransformUv ); >;
};
void MainVs()
{
float3x4 transform = float3x4(
g_tTransformTexture.SampleLevel(smpl, vTransformTextureUV, 0.0f),
g_tTransformTexture.SampleLevel(smpl, vTransformTextureUV, 0.0f, int2(1, 0)),
g_tTransformTexture.SampleLevel(smpl, vTransformTextureUV, 0.0f, int2(2, 0))
);
float4 instanceData = g_tTransformTexture.SampleLevel(smpl, vTransformTextureUV, 0.0f, int2(3, 0));
float instanceFade = instanceData.x;
uint _13689 = asuint(instanceData.y);
float3 instanceTint;
instanceTint.x = float((_13689 >> uint(16)) & 255u) * 0.0039215688593685626983642578125f;
instanceTint.y = float((_13689 >> uint(8)) & 255u) * 0.0039215688593685626983642578125f;
instanceTint.z = float((_13689 >> uint(0)) & 255u) * 0.0039215688593685626983642578125f;
float3 normalWs = normalize(mul(transform, float4(vNormalOs.xyz, 0.0f)));
float3 positionWs = mul(transform, float4(vPositionOs, 1.0f));
float4 positionMultiView = mul(g_matWorldToProjectionMultiview[0u], float4(positionWs, 1.0f) + (g_vWorldToCameraOffsetMultiview[0u] * 1.0f));
float3 _8849 = mul(transform, float4(vTangentUOs_flTangentVSign.xyz, 0.0f));
float3 tangent = normalize(_8849 - (normalWs * dot(_8849, normalWs)));
float3 tint = lerp(1.0f.xxx, instanceTint.xyz, g_flModelTintAmount.xxx).xyz * g_vColorTint;
float4 vertexColor = float4(tint, pow(instanceFade, g_flFadeExponent));
vPositionWs = positionWs - vInteractionTriggerVolumeWorldToVolumeScale.xyz;
vNormalWs = normalWs;
vTextureCoords = ((vTexCoord * g_vTexCoordScale) + g_vTexCoordOffset) + (g_vTexCoordScrollSpeed * g_flTime);
vLightmapUV = vLightmapUV * g_vLightmapUvScale.xy;
vVertexColor = vertexColor;
vCentroidNormalWs = normalWs;
vTangentUWs = tangent;
vTangentVWs = cross(normalWs, tangent) * vTangentUOs_flTangentVSign.w;
nView = asuint(instanceData.z) & 65535u;
positionMultiView.y = -positionMultiView.y;
gl_Position = positionMultiView;
}
PS_INPUT main(VS_INPUT stage_input)
{
vPositionOs = stage_input.vPositionOs;
vTexCoord = stage_input.vTexCoord;
vNormalOs = stage_input.vNormalOs;
vTangentUOs_flTangentVSign = stage_input.vTangentUOs_flTangentVSign;
vTransformTextureUV = stage_input.vTransformTextureUV;
vLightmapUV = stage_input.vLightmapUV;
MainVs();
PS_INPUT stage_output;
stage_output.gl_Position = gl_Position;
stage_output.vPositionWs = vPositionWs;
stage_output.vNormalWs = vNormalWs;
stage_output.vTextureCoords = vTextureCoords;
stage_output.vLightmapUV = vLightmapUV;
stage_output.vVertexColor = vVertexColor;
stage_output.vCentroidNormalWs = vCentroidNormalWs;
stage_output.vTangentUWs = vTangentUWs;
stage_output.vTangentVWs = vTangentVWs;
stage_output.nView = nView;
return stage_output;
}
// Stage: PS
//static float4 _16738;
//static float4 _13853;
//static int2 _18779;
cbuffer PerViewConstantBuffer_t : register(b1)
{
float3 g_vCameraPositionWs : packoffset(c19);
float4 g_vCameraPositionWsMultiview[2] : packoffset(c40);
};
#if (D_BAKED_LIGHTING_FROM_LIGHT_PROBE == 1)
cbuffer PerBatchLightProbeVolumeConstantBuffer_t : register(b2)
{
column_major float4x3 g_matLightProbeVolumeWorldToLocal : packoffset(c0);
float4 g_vLightProbeVolumeLayer0TextureMin : packoffset(c3);
float4 g_vLightProbeVolumeLayer0TextureMax : packoffset(c4);
float4 g_vLightProbeVolumeColor : packoffset(c5);
};
#endif
cbuffer PerViewConstantBufferVR_t : register(b3)
{
uint4 g_bFogTypeEnabled : packoffset(c0);
uint4 g_bOtherFxEnabled : packoffset(c1);
float4 g_vAoProxyDownres : packoffset(c2);
float4 g_vGradientFogBiasAndScale : packoffset(c10);
float4 m_vGradientFogExponents : packoffset(c11);
float4 g_vGradientFogColor_Opacity : packoffset(c12);
float4 g_vGradientFogCullingParams : packoffset(c13);
float4 g_vCubeFog_Offset_Scale_Bias_Exponent : packoffset(c14);
float4 g_vCubeFog_Height_Offset_Scale_Exponent_Log2Mip : packoffset(c15);
column_major float4x4 g_matvCubeFogSkyWsToOs : packoffset(c16);
float4 g_vCubeFogCullingParams : packoffset(c20);
float4 g_vSphericalVignetteBiasAndScale : packoffset(c21);
float4 g_vSphericalVignetteOrigin_Exponent : packoffset(c22);
float4 g_vSphericalVignetteColor_Opacity : packoffset(c23);
float4 g_vVolFogDitherScaleBias : packoffset(c25);
float4 g_vVolFogPostWorldToFrustumScale : packoffset(c26);
float4 g_vVolFogPostWorldToFrustumBias : packoffset(c27);
column_major float4x4 g_mVolFogFromWorld[2] : packoffset(c28);
float4 g_vHighPrecisionLightingOffsetWs : packoffset(c36);
};
cbuffer PerViewRuntimeFastPathLightingConstantBuffer_t : register(b5)
{
int4 g_vFastPathNumLights : packoffset(c0);
float4 g_vSingleLightPosition_flInvRadius : packoffset(c1);
float4 g_vSingleLightColor : packoffset(c2);
float4 g_vSingleLightFalloffParams : packoffset(c3);
column_major float4x4 g_matSingleLightWorldToCookie : packoffset(c5);
column_major float4x4 g_matSingleLightWorldToShadow : packoffset(c9);
float4 g_vFxLightColors[8] : packoffset(c14);
float4 g_vFxLightPositions[8] : packoffset(c22);
float4 g_vBakedLightPosition[256] : packoffset(c30);
float4 g_vBakedLightColor[256] : packoffset(c286);
column_major float4x4 g_matWorldToBakedLightShadow[2] : packoffset(c542);
float4 g_vBakedLightShadowBounds : packoffset(c550);
float4 g_vBakedLightCascadeThreshold[4] : packoffset(c551);
float4 g_vBakedLightShadowStrengthVignette : packoffset(c555);
int4 g_vBakedLightShadowIntParams : packoffset(c556);
float4 g_vEnvironmentMapSizeConstants : packoffset(c1101);
column_major float4x3 g_matEnvMapWorldToLocal[144] : packoffset(c1102);
float4 g_vEnvironmentMapBoxMins[144] : packoffset(c1534);
float4 g_vEnvironmentMapBoxMaxs[144] : packoffset(c1678);
float4 g_vEnvironmentMapProxySphere[144] : packoffset(c1822);
float4 g_vEnvironmentMapColorRotated[144] : packoffset(c1966);
float4 g_vEnvironmentMapNormalizationSH[144] : packoffset(c2110);
};
cbuffer PerViewLightingConstantBufferVr_t : register(b4)
{
float4 g_vShadow3x3PCFTermC0 : packoffset(c1286);
float4 g_vShadow3x3PCFTermC1 : packoffset(c1287);
float4 g_vShadow3x3PCFTermC2 : packoffset(c1288);
float4 g_vShadow3x3PCFTermC3 : packoffset(c1289);
float4 g_vLightmapParams : packoffset(c1312);
float4 g_vScreenSpaceDitherParams : packoffset(c1313);
float4 g_vAmbientOcclusionProxyLightPositions[4] : packoffset(c2343);
float4 g_vAmbientOcclusionProxyLightStrengths : packoffset(c2348);
float4 g_vAmbientOcclusionProxyAmbientStrength : packoffset(c2349);
float4 g_vCubemapNormalizationParams : packoffset(c2350);
};
cbuffer _Globals_ : register(b0)
{
float g_flDirectionalLightmapStrength : packoffset(c0.z);
float g_flDirectionalLightmapMinZ : packoffset(c0.w);
uint g_bFogEnabled : packoffset(c1);
float g_flMetalness : packoffset(c9.y);
};
Texture2D<float4> g_tColor;
Texture2D<float4> g_tNormal;
Texture3D<float4> g_tVrLightCookieTexture;
Texture2D<float4> g_tVrShadowDepthBufferDepth;
//Texture2D<float4> g_tBlueNoise;
Texture2D<float4> g_tDynamicAmbientOcclusionDepth;
Texture2D<float4> g_tDynamicAmbientOcclusion;
#if (D_BAKED_LIGHTING_FROM_LIGHTMAP == 1)
Texture2DArray<float4> g_tLightmap0;
Texture2DArray<float4> g_tLightmap1;
Texture2DArray<float4> g_tLightmap2;
Texture2DArray<float4> g_tLightmap3;
#endif
#if (D_BAKED_LIGHTING_FROM_LIGHT_PROBE == 1)
Texture3D<float4> g_tLightProbeVolumeTexture;
Texture3D<float4> g_tLightProbeVolumeTextureDirectLightIndices;
Texture3D<float4> g_tLightProbeVolumeTextureDirectLightScalars;
#endif
TextureCubeArray<float4> g_tEnvironmentMap;
Texture2D<float4> g_tBRDFLookup;
TextureCube<float4> g_tFogCubeTexture;
Texture2D<float4> g_tFogSomething;
Texture3D<float4> g_tFogVolume;
static float4 gl_FragCoord;
static float3 vPositionWs;
static float3 vNormalWs;
static float2 vTextureCoords;
static float2 vLightmapUV;
static float4 vVertexColor;
static float3 vCentroidNormalWs;
static float3 vTangentUWs;
static float3 vTangentVWs;
static uint nView;
static float4 outColor;
struct PS_INPUT
{
float3 vPositionWs : TEXCOORD0; // vPositionWithOffsetWs?
float3 vNormalWs : TEXCOORD1;
float2 vTextureCoords : TEXCOORD2;
centroid float2 vLightmapUV : TEXCOORD3; // D_BAKED_LIGHTING_FROM_LIGHTMAP=1
float4 vVertexColor : TEXCOORD4;
centroid float3 vCentroidNormalWs : TEXCOORD5; // S_SPECULAR=1
float3 vTangentUWs : TEXCOORD6; // PS_INPUT_HAS_TANGENT_BASIS=1
float3 vTangentVWs : TEXCOORD7; // PS_INPUT_HAS_TANGENT_BASIS=1
nointerpolation uint nView : TEXCOORD8; // D_MULTIVIEW_INSTANCING=1
float4 gl_FragCoord : SV_Position;
};
uint2 spvTextureSize(Texture2D<float4> Tex, uint Level, out uint Param)
{
uint2 ret;
Tex.GetDimensions(Level, ret.x, ret.y, Param);
return ret;
}
void MainPs()
{
bool3 _13596 = (dot(vNormalWs, vNormalWs) >= 1.001f).xxx;
float3 vNormalHQ = normalize(float3(_13596.x ? vCentroidNormalWs.x : vNormalWs.x, _13596.y ? vCentroidNormalWs.y : vNormalWs.y, _13596.z ? vCentroidNormalWs.z : vNormalWs.z));
float3 vHiPos = vPositionWs + g_vHighPrecisionLightingOffsetWs.xyz;
uint Instance = nView >> uint(8);
float4 albedo = g_tColor.Sample(vTextureCoords);
float3 color = albedo.xyz * vVertexColor.xyz;
// Hemi-Octahedral Normal Decoding
float4 _23868 = g_tNormal.Sample(vTextureCoords);
float _14039 = _23868.x;
float _17759 = _23868.y;
float _19991 = (_14039 + _17759) - 1.00392162799835205078125f;
float _10151 = _14039 - _17759;
float3 _11997 = normalize(float3(_19991, _10151, (1.0f - abs(_19991)) - abs(_10151)));
float _8397 = -_11997.y;
float3 _19957 = _11997;
_19957.y = _8397;
float3 N = normalize(((normalize(vTangentUWs) * _11997.x) + (normalize(vTangentVWs) * _8397)) + (vNormalHQ * _11997.z));
float3 F0 = lerp(0.04f.xxx, color, g_flMetalness.xxx);
float3 _14502 = ddx(vNormalHQ);
float3 _13285 = ddy(vNormalHQ);
float2 roughness = max(_23868.zz, pow(clamp(max(dot(_14502, _14502), dot(_13285, _13285)), 0.0f, 1.0f), 0.333000004291534423828125f).xx);
float3 _11252;
float3 _13710;
do
{
float3 _11251;
float3 _13709;
[branch]
if (g_vFastPathNumLights.x != 0)
{
float2 _15083 = ((1.0f.xx - roughness) * 0.800000011920928955078125f) + 0.60000002384185791015625f.xx;
float3 V = -normalize(vHiPos - g_vCameraPositionWs);
float3 _7361 = g_vSingleLightPosition_flInvRadius.xyz - vPositionWs;
float3 L = normalize(_7361);
float _13058 = dot(_7361, _7361);
[branch]
if (_13058 > g_vSingleLightFalloffParams.z)
{
_11252 = 0.0f.xxx;
_13710 = 0.0f.xxx;
break;
}
float4 _23852 = float4(vPositionWs, 1.0f);
float4 _11050 = mul(_23852, g_matSingleLightWorldToCookie);
float3 _7829 = g_tVrLightCookieTexture.SampleLevel((_11050.xyz / _11050.w.xxx).xyz, 0.0f).xyz * g_vSingleLightColor.xyz;
[branch]
if (dot(_7829, _7829) == 0.0f)
{
_11252 = 0.0f.xxx;
_13710 = 0.0f.xxx;
break;
}
float _13715 = max(_13058, 1.0f);
float3 lightColor = _7829 * clamp((1.0f / dot(float2(sqrt(_13715), _13715), g_vSingleLightFalloffParams.xy)) - g_vSingleLightFalloffParams.w, 0.0f, 1.0f);
float4 _22932 = mul(_23852, g_matSingleLightWorldToShadow);
float3 _21195 = _22932.xyz / _22932.w.xxx;
float _21074;
do
{
float2 _19763 = _21195.xy;
float _18993 = clamp(_21195.z - 9.9999999747524270787835121154785e-07f, 0.0f, 1.0f);
float4 _17516;
_17516.x = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19763 + _24634_m3.xx, _18993).xy, _18993);
_17516.y = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19763 + _24634_m3.yx, _18993).xy, _18993);
_17516.z = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19763 + _24634_m3.xy, _18993).xy, _18993);
_17516.w = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19763 + _24634_m3.yy, _18993).xy, _18993);
float _6480 = dot(_17516, 0.25f.xxxx);
if ((_6480 == 0.0f) || (_6480 == 1.0f))
{
_21074 = _6480;
break;
}
float4 _17519;
_17519.x = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19763 + _24634_m2.wz, _18993).xy, _18993);
_17519.y = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19763 + _24634_m1.zw, _18993).xy, _18993);
_17519.z = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19763 + _24634_m1.wz, _18993).xy, _18993);
_17519.w = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19763 + _24634_m2.zw, _18993).xy, _18993);
_21074 = ((_6480 * (g_vShadow3x3PCFTermC0.w * 4.0f)) + dot(_17519, _24634_m1.xxxx)) + (g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_21195.xy, _18993).xy, _18993) * _24634_m1.y);
break;
} while(false);
[branch]
if (_21074 <= 0.0f)
{
_11252 = 0.0f.xxx;
_13710 = 0.0f.xxx;
break;
}
// BRDF
float dotNL = max(0.0f, dot(N, L));
float _8107 = (_15083.x + _15083.y) * 0.5f;
float3 H = normalize(L + V);
float dotNH = dot(H, N);
float2 _12038 = roughness.xx;
float2 _20486 = _12038 * _12038;
float2 _7196 = _20486 / ((((_20486 * _20486) - 1.0f.xx) * (dotNH * dotNH)) + 1.0f.xx);
float2 _20646 = _12038 + 1.0f.xx;
float2 k = (_20646 * _20646) / 8.0f;
float2 _12933 = 1.0f.xx - k;
_11251 = ((((_8107 + 1.0f) * 0.5f).xxx * pow(dotNL, _8107)) * _21074) * lightColor;
_13709 = (((F0 + (((1.0f.xxx - F0) * 1.0f) * pow(1.0f - max(0.0f, dot(L, H)), 5.0f))) * (((_7196 * _7196) / ((4.0f.xx * ((dotNL.xx * _12933) + k)) * ((max(0.0f, dot(N, V)).xx * _12933) + k))).x * dotNL)) * _21074) * lightColor;
}
else
{
_11251 = 0.0f.xxx;
_13709 = 0.0f.xxx;
}
_11252 = _11251;
_13710 = _13709;
break;
} while(false);
float3 _7755;
_7755 = _11252;
for (int _10303 = 0; _10303 < g_vFastPathNumLights.y; )
{
float3 _7362 = g_vFxLightPositions[_10303].xyz - vPositionWs;
_7755 += (g_vFxLightColors[_10303].xyz * (max(0.0f, dot(N, normalize(_7362))) * clamp((1.0f / length(_7362)) - g_vFxLightPositions[_10303].w, 0.0f, 1.0f)));
_10303++;
continue;
}
float _13061 = dot(roughness, 0.5f.xx);
float3 _6962 = vHiPos - g_vCameraPositionWsMultiview[0u].xyz;
float3 V = normalize(_6962);
float3 Vinv = -V;
float aoTermProxies;
// Ao Proxies
if (g_bOtherFxEnabled.x != 0u)
{
float4 _20201;
_20201.x = dot(g_vAmbientOcclusionProxyLightPositions[0].xyz, vNormalHQ);
_20201.y = dot(g_vAmbientOcclusionProxyLightPositions[1].xyz, vNormalHQ);
_20201.z = dot(g_vAmbientOcclusionProxyLightPositions[2].xyz, vNormalHQ);
_20201.w = dot(g_vAmbientOcclusionProxyLightPositions[3].xyz, vNormalHQ);
uint _16733_dummy_parameter;
uint2 _16733 = spvTextureSize(_4573, uint(0), _16733_dummy_parameter);
int2 _20362;
_20362.x = int(_16733.x);
_20362.y = int(_16733.y);
float2 _24086 = 1.0f.xx / float2(_20362);
float2 _17863 = (floor(gl_FragCoord.xy * g_vAoProxyDownres.x) * _24086) + (_24086 * 0.5f);
float4 _20482 = g_tDynamicAmbientOcclusionDepth.GatherRed(_17863) - gl_FragCoord.zzzz;
float _16618 = _20482.w;
float _16509 = _20482.z;
float _6608;
float2 _8059;
if (abs(_16509) < _16618)
{
_8059 = float2(_24086.x, 0.0f);
_6608 = _16509;
}
else
{
_8059 = 0.0f.xx;
_6608 = _16618;
}
float _24672 = _20482.x;
float _6609;
float2 _8060;
if (abs(_24672) < _6608)
{
_8060 = float2(0.0f, _24086.y);
_6609 = _24672;
}
else
{
_8060 = _8059;
_6609 = _6608;
}
bool2 _11046 = (abs(_20482.y) < _6609).xx;
float4 _13652 = max(_20201, 0.0f.xxxx) * g_vAmbientOcclusionProxyLightStrengths;
aoTermProxies = (1.0f / (dot(_13652, 1.0f.xxxx) + g_vAmbientOcclusionProxyAmbientStrength.x)) * (g_vAmbientOcclusionProxyAmbientStrength.x + dot(_13652, g_tDynamicAmbientOcclusion.Sample(_17863 + float2(_11046.x ? _24086.x : _8060.x, _11046.y ? _24086.y : _8060.y))));
}
else
{
aoTermProxies = 1.0f;
}
#if (D_BAKED_LIGHTING_FROM_LIGHTMAP == 1)
float3 vLightmapUVW = float3(vLightmapUV, 0.0f);
int4 vLightIndices = int4(g_tLightmap0.Sample(vLightmapUVW) * 255.0f);
float4 vLightStrengths = g_tLightmap1.Sample(vLightmapUVW);
// Ambient Highlight Direction (directional lightmap) data
float3 vIrradiance = g_tLightmap2.Sample(vLightmapUVW).rgb;
float4 vAHDData = g_tLightmap3.Sample(vLightmapUVW);
float2 vHighlightXY = (vAHDData.xy * 2.0f) - 1.0f.xx;
float _20977 = 1.0f - sqrt(dot(vHighlightXY, vHighlightXY));
float3 vAmbientColor = vIrradiance * saturate(lerp(1.0f, vAHDData.z, g_flDirectionalLightmapStrength) + g_vLightmapParams.x);
float3 finalAmbient = vAmbientColor + (((vIrradiance - vAmbientColor) / max(_20977, g_flDirectionalLightmapMinZ).xxx) * max(0.0f, dot(float3(vHighlightXY, _20977), _19957)));
#endif
#if (D_BAKED_LIGHTING_FROM_LIGHT_PROBE == 1)
float3 probePos = mul(float4(vHiPos, 1.0f), g_matLightProbeVolumeWorldToLocal);
float3 temp = probePos;
probePos.z *= 0.16666667f;
float3 clampedPos = clamp(temp, g_vLightProbeVolumeLayer0TextureMin.xyz, g_vLightProbeVolumeLayer0TextureMax.xyz);
float3 lerped = lerp(
float3(0.0f, 0.16666667f, 0.3333333f),
float3(0.5f, 0.66666667f, 0.8333333f),
step(N, 0.0f)
);
float3 normalSquared = N * N;
int4 vLightIndices = int4(g_tLightProbeVolumeTextureDirectLightIndices.SampleLevel(probePos, 0.0f) * 255.0f);
float4 vLightStrengths = g_tLightProbeVolumeTextureDirectLightScalars.SampleLevel(probePos, 0.0f);
float3 finalAmbient = (
(g_tLightProbeVolumeTexture.SampleLevel(clampedPos + float3(0.0f, 0.0f, lerped.x), 0.0f).xyz * normalSquared.x)
+ (g_tLightProbeVolumeTexture.SampleLevel(clampedPos + float3(0.0f, 0.0f, lerped.y), 0.0f).xyz * normalSquared.y)
+ (g_tLightProbeVolumeTexture.SampleLevel(clampedPos + float3(0.0f, 0.0f, lerped.z), 0.0f).xyz * normalSquared.z))
* g_vLightProbeVolumeColor.xyz;
#endif
float4 thisFilter = float4(bool4(
vLightIndices.x == g_vBakedLightShadowIntParams.x,
vLightIndices.y == g_vBakedLightShadowIntParams.y,
vLightIndices.z == g_vBakedLightShadowIntParams.z,
vLightIndices.w == g_vBakedLightShadowIntParams.w
)) * g_vBakedLightShadowStrengthVignette.xxxx;
float4 lightStrengths2 = vLightStrengths * vLightStrengths;
float4 StrengthF = lightStrengths2 * thisFilter;
float4 _16269;
[branch]
if (any(bool4(StrengthF.x != 0.0f, StrengthF.y != 0.0f, StrengthF.z != 0.0f, StrengthF.w != 0.0f)))
{
float _16268;
[branch]
if (g_vBakedLightCascadeThreshold[0].w != 0.0f)
{
float4 _22026 = float4(vPositionWs, 1.0f);
float _13959 = smoothstep(1.0f, g_vBakedLightShadowStrengthVignette.y, max(abs(dot(g_vBakedLightCascadeThreshold[0], _22026)), abs(dot(g_vBakedLightCascadeThreshold[1], _22026))));
float _14525 = 1.0f - _13959;
float _20599 = smoothstep(1.0f, g_vBakedLightShadowStrengthVignette.z, max(abs(dot(g_vBakedLightCascadeThreshold[2], _22026)), abs(dot(g_vBakedLightCascadeThreshold[3], _22026)))) * _14525;
float _16216 = _14525 - _20599;
float _22112;
[branch]
if (_13959 != 0.0f)
{
float4 _22933 = mul(_22026, g_matWorldToBakedLightShadow[0]);
float3 _21196 = _22933.xyz / _22933.w.xxx;
float _9276;
do
{
float2 _19765 = _21196.xy;
float _18995 = clamp(_21196.z - 9.9999999747524270787835121154785e-07f, 0.0f, 1.0f);
float4 _17529;
_17529.x = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19765 + _24634_m3.xx, _18995).xy, _18995);
_17529.y = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19765 + _24634_m3.yx, _18995).xy, _18995);
_17529.z = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19765 + _24634_m3.xy, _18995).xy, _18995);
_17529.w = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19765 + _24634_m3.yy, _18995).xy, _18995);
float _6482 = dot(_17529, 0.25f.xxxx);
if ((_6482 == 0.0f) || (_6482 == 1.0f))
{
_9276 = _6482;
break;
}
float4 _17532;
_17532.x = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19765 + _24634_m2.wz, _18995).xy, _18995);
_17532.y = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19765 + _24634_m1.zw, _18995).xy, _18995);
_17532.z = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19765 + _24634_m1.wz, _18995).xy, _18995);
_17532.w = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19765 + _24634_m2.zw, _18995).xy, _18995);
_9276 = ((_6482 * (g_vShadow3x3PCFTermC0.w * 4.0f)) + dot(_17532, _24634_m1.xxxx)) + (g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_21196.xy, _18995).xy, _18995) * _24634_m1.y);
break;
} while(false);
_22112 = _16216 + (_13959 * _9276);
}
else
{
_22112 = _16216;
}
float _10542;
[branch]
if (_20599 != 0.0f)
{
float4 _22934 = mul(_22026, g_matWorldToBakedLightShadow[1]);
float3 _21197 = _22934.xyz / _22934.w.xxx;
float _9277;
do
{
float2 _19766 = _21197.xy;
float _18996 = clamp(_21197.z - 9.9999999747524270787835121154785e-07f, 0.0f, 1.0f);
float4 _17535;
_17535.x = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19766 + _24634_m3.xx, _18996).xy, _18996);
_17535.y = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19766 + _24634_m3.yx, _18996).xy, _18996);
_17535.z = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19766 + _24634_m3.xy, _18996).xy, _18996);
_17535.w = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19766 + _24634_m3.yy, _18996).xy, _18996);
float _6483 = dot(_17535, 0.25f.xxxx);
if ((_6483 == 0.0f) || (_6483 == 1.0f))
{
_9277 = _6483;
break;
}
float4 _17538;
_17538.x = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19766 + _24634_m2.wz, _18996).xy, _18996);
_17538.y = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19766 + _24634_m1.zw, _18996).xy, _18996);
_17538.z = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19766 + _24634_m1.wz, _18996).xy, _18996);
_17538.w = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19766 + _24634_m2.zw, _18996).xy, _18996);
_9277 = ((_6483 * (g_vShadow3x3PCFTermC0.w * 4.0f)) + dot(_17538, _24634_m1.xxxx)) + (g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_21197.xy, _18996).xy, _18996) * _24634_m1.y);
break;
} while(false);
_10542 = _22112 + (_20599 * _9277);
}
else
{
_10542 = _22112;
}
_16268 = _10542;
}
else
{
float _10541;
do
{
float4 _11434 = mul(float4(vPositionWs, 1.0f), g_matWorldToBakedLightShadow[0]);
float3 _8541 = _11434.xyz / _11434.w.xxx;
float3 _22497 = step(float3(g_vBakedLightShadowBounds.xy, 0.0f), _8541) * step(_8541, float3(g_vBakedLightShadowBounds.zw, 1.0f));
[branch]
if (((_22497.x * _22497.y) * _22497.z) != 0.0f)
{
float _10540;
do
{
float2 _19764 = _8541.xy;
float _18994 = clamp(_8541.z - 9.9999999747524270787835121154785e-07f, 0.0f, 1.0f);
float4 _17522;
_17522.x = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19764 + _24634_m3.xx, _18994).xy, _18994);
_17522.y = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19764 + _24634_m3.yx, _18994).xy, _18994);
_17522.z = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19764 + _24634_m3.xy, _18994).xy, _18994);
_17522.w = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19764 + _24634_m3.yy, _18994).xy, _18994);
float _6481 = dot(_17522, 0.25f.xxxx);
if ((_6481 == 0.0f) || (_6481 == 1.0f))
{
_10540 = _6481;
break;
}
float4 _17525;
_17525.x = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19764 + _24634_m2.wz, _18994).xy, _18994);
_17525.y = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19764 + _24634_m1.zw, _18994).xy, _18994);
_17525.z = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19764 + _24634_m1.wz, _18994).xy, _18994);
_17525.w = g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_19764 + _24634_m2.zw, _18994).xy, _18994);
_10540 = ((_6481 * (g_vShadow3x3PCFTermC0.w * 4.0f)) + dot(_17525, _24634_m1.xxxx)) + (g_tVrShadowDepthBufferDepth.SampleCmpLevelZero(float3(_8541.xy, _18994).xy, _18994) * _24634_m1.y);
break;
} while(false);
_10541 = _10540;
break;
}
_10541 = 1.0f;
break;
} while(false);
_16268 = _10541;
}
_16269 = lightStrengths2 * lerp(1.0f.xxxx, _16268.xxxx, thisFilter);
}
else
{
_16269 = lightStrengths2;
}
float4 _12139 = _16269 * lerp(aoTermProxies.xxxx, 1.0f.xxxx, thisFilter);
int index = vLightIndices.x;
float currentSth = _12139.x;
float3 out2;
float3 out1;
[branch]
if (currentSth > 9.9999997473787516355514526367188e-05f)
{
float3 _16788 = normalize(g_vBakedLightPosition[index].xyz - vHiPos);
float _19745 = max(0.0f, dot(N, _16788));
float3 _18694;
[branch]
if (g_vBakedLightColor[index].w != 0.0f)
{
float3 _15736 = normalize(_16788 + Vinv);
float _15267 = dot(_15736, N);
float2 _12039 = roughness.xx;
float2 _20487 = _12039 * _12039;
float2 _7197 = _20487 / ((((_20487 * _20487) - 1.0f.xx) * (_15267 * _15267)) + 1.0f.xx);
float2 _20647 = _12039 + 1.0f.xx;
float2 _13660 = (_20647 * _20647) * 0.125f.xx;
float2 _12934 = 1.0f.xx - _13660;
_18694 = (F0 + (((1.0f.xxx - F0) * 1.0f) * pow(1.0f - max(0.0f, dot(_16788, _15736)), 5.0f))) * (((_7197 * _7197) / ((4.0f.xx * ((_19745.xx * _12934) + _13660)) * ((max(0.0f, dot(N, Vinv)).xx * _12934) + _13660))).x * _19745);
}
else
{
_18694 = 0.0f.xxx;
}
out1 = _13710 + ((_18694 * g_vBakedLightColor[index].xyz) * currentSth);
out2 = _7755 + (((1.0f.xxx * pow(_19745, 1.0f)) * g_vBakedLightColor[index].xyz) * currentSth);
}
else
{
out1 = _13710;
out2 = _7755;
}
int _6787 = vLightIndices.y;
float _15146 = _12139.y;
float3 _7917;
float3 _8062;
[branch]
if (_15146 > 9.9999997473787516355514526367188e-05f)
{
float3 _16789 = normalize(g_vBakedLightPosition[_6787].xyz - vHiPos);
float _19746 = max(0.0f, dot(N, _16789));
float3 _18695;
[branch]
if (g_vBakedLightColor[_6787].w != 0.0f)
{
float3 _15737 = normalize(_16789 + Vinv);
float _15268 = dot(_15737, N);
float2 _12040 = roughness.xx;
float2 _20488 = _12040 * _12040;
float2 _7198 = _20488 / ((((_20488 * _20488) - 1.0f.xx) * (_15268 * _15268)) + 1.0f.xx);
float2 _20648 = _12040 + 1.0f.xx;
float2 _13661 = (_20648 * _20648) * 0.125f.xx;
float2 _12935 = 1.0f.xx - _13661;
_18695 = (F0 + (((1.0f.xxx - F0) * 1.0f) * pow(1.0f - max(0.0f, dot(_16789, _15737)), 5.0f))) * (((_7198 * _7198) / ((4.0f.xx * ((_19746.xx * _12935) + _13661)) * ((max(0.0f, dot(N, Vinv)).xx * _12935) + _13661))).x * _19746);
}
else
{
_18695 = 0.0f.xxx;
}
_8062 = out1 + ((_18695 * g_vBakedLightColor[_6787].xyz) * _15146);
_7917 = out2 + (((1.0f.xxx * pow(_19746, 1.0f)) * g_vBakedLightColor[_6787].xyz) * _15146);
}
else
{
_8062 = out1;
_7917 = out2;
}
int _6788 = vLightIndices.z;
float _15147 = _12139.z;
float3 _7918;
float3 _8063;
[branch]
if (_15147 > 9.9999997473787516355514526367188e-05f)
{
float3 _16790 = normalize(g_vBakedLightPosition[_6788].xyz - vHiPos);
float _19747 = max(0.0f, dot(N, _16790));
float3 _18696;
[branch]
if (g_vBakedLightColor[_6788].w != 0.0f)
{
float3 _15738 = normalize(_16790 + Vinv);
float _15269 = dot(_15738, N);
float2 _12041 = roughness.xx;
float2 _20489 = _12041 * _12041;
float2 _7199 = _20489 / ((((_20489 * _20489) - 1.0f.xx) * (_15269 * _15269)) + 1.0f.xx);
float2 _20649 = _12041 + 1.0f.xx;
float2 _13662 = (_20649 * _20649) * 0.125f.xx;
float2 _12936 = 1.0f.xx - _13662;
_18696 = (F0 + (((1.0f.xxx - F0) * 1.0f) * pow(1.0f - max(0.0f, dot(_16790, _15738)), 5.0f))) * (((_7199 * _7199) / ((4.0f.xx * ((_19747.xx * _12936) + _13662)) * ((max(0.0f, dot(N, Vinv)).xx * _12936) + _13662))).x * _19747);
}
else
{
_18696 = 0.0f.xxx;
}
_8063 = _8062 + ((_18696 * g_vBakedLightColor[_6788].xyz) * _15147);
_7918 = _7917 + (((1.0f.xxx * pow(_19747, 1.0f)) * g_vBakedLightColor[_6788].xyz) * _15147);
}
else
{
_8063 = _8062;
_7918 = _7917;
}
int _6789 = vLightIndices.w;
float _15148 = _12139.w;
float3 _6779;
float3 _17326;
[branch]
if (_15148 > 9.9999997473787516355514526367188e-05f)
{
float3 _16792 = normalize(g_vBakedLightPosition[_6789].xyz - vHiPos);
float _19748 = max(0.0f, dot(N, _16792));
float3 _18697;
[branch]
if (g_vBakedLightColor[_6789].w != 0.0f)
{
float3 _15739 = normalize(_16792 + Vinv);
float _15270 = dot(_15739, N);
float2 _12042 = roughness.xx;
float2 _20490 = _12042 * _12042;
float2 _7200 = _20490 / ((((_20490 * _20490) - 1.0f.xx) * (_15270 * _15270)) + 1.0f.xx);
float2 _20650 = _12042 + 1.0f.xx;
float2 _13663 = (_20650 * _20650) * 0.125f.xx;
float2 _12937 = 1.0f.xx - _13663;
_18697 = (F0 + (((1.0f.xxx - F0) * 1.0f) * pow(1.0f - max(0.0f, dot(_16792, _15739)), 5.0f))) * (((_7200 * _7200) / ((4.0f.xx * ((_19748.xx * _12937) + _13663)) * ((max(0.0f, dot(N, Vinv)).xx * _12937) + _13663))).x * _19748);
}
else
{
_18697 = 0.0f.xxx;
}
_6779 = _8063 + ((_18697 * g_vBakedLightColor[_6789].xyz) * _15148);
_17326 = _7918 + (((1.0f.xxx * pow(_19748, 1.0f)) * g_vBakedLightColor[_6789].xyz) * _15148);
}
else
{
_6779 = _8063;
_17326 = _7918;
}
float roughSquare = sqrt(_13061);
float3 R = reflect(V, N);
float3 envPosLS;
float3 ReflPosLS;
if (g_vEnvironmentMapColorRotated[Instance].w != 0.0f)
{
envPosLS = mul(float4(vHiPos, 1.0f), g_matEnvMapWorldToLocal[Instance]);
ReflPosLS = mul(float4(R, 0.0f), g_matEnvMapWorldToLocal[Instance]);
}
else
{
envPosLS = vHiPos - g_vEnvironmentMapProxySphere[Instance].xyz;
ReflPosLS = R;
}
// Following is the parallax-correction code
// Find the ray intersection with box plane
// Get the furthest of these intersections along the ray
// (Ok because x/0 give +inf and -x/0 give –inf )
float3 FurthestPlane = max(
(g_vEnvironmentMapBoxMaxs[Instance].xyz - envPosLS) / ReflPosLS,
(g_vEnvironmentMapBoxMins[Instance].xyz - envPosLS) / ReflPosLS
);
// Find the closest far intersection
float3 Distance = abs(min(FurthestPlane.x, min(FurthestPlane.y, FurthestPlane.z)));
// Get the intersection position
float3 IntersectPosition = envPosLS + (ReflPosLS * Distance);
float2 _20268 = g_tBRDFLookup.SampleLevel(float2(max(0.0f, dot(Vinv, N)), _13061), 0.0f).xy;
float2 _17874 = _20268 * _20268;
float3 _22636 = (min(albedo.w, vAHDData.w) * aoTermProxies).xxx;
float4 envMapSampleCoords = float4(
normalize(lerp(IntersectPosition, N, roughSquare.xxx)),
float(nView & 255u)
);
float3 luminance = float3(0.21f, 0.72f, 0.072f);
float3 finalNoFog = (
((_17326 + (finalAmbient * (aoTermProxies * albedo.w).xxx)) * (color * (1.0f - g_flMetalness))).xyz
+ (_6779 * _22636)).xyz
+ ((
(
(
g_tEnvironmentMap.SampleLevel(envMapSampleCoords, g_vEnvironmentMapSizeConstants.y * roughSquare).xyz
* g_vEnvironmentMapColorRotated[Instance].xyz
)
* ((F0 * _17874.x) + _17874.y.xxx)
)
* min(
dot(finalAmbient, luminance) / dot(float4(N, 1.0f), g_vEnvironmentMapNormalizationSH[Instance]),
max((_13061 * g_vCubemapNormalizationParams.x) + g_vCubemapNormalizationParams.y, 1.0f)
)
)
* _22636
);
float4 finalColor;
if (g_bFogEnabled != 0u)
{
float _22886;
float3 _20860;
do
{
float2 _19532 = _6962.xy;
_22886 = vHiPos.z;
[branch]
if ((dot(_19532, _19532) > g_vGradientFogCullingParams.x) && (_22886 < g_vGradientFogCullingParams.y))
{
float2 _7381 = clamp(g_vGradientFogBiasAndScale.xy + (g_vGradientFogBiasAndScale.zw * float2(length(_19532), _22886)), 0.0f.xx, 1.0f.xx);
float _8865 = (pow(_7381.x, m_vGradientFogExponents.x) * pow(_7381.y, m_vGradientFogExponents.y)) * g_vGradientFogColor_Opacity.w;
_20860 = lerp(finalNoFog.xyz, float4(g_vGradientFogColor_Opacity.xyz, _8865).xyz, _8865.xxx);
break;
}
_20860 = finalNoFog.xyz;
break;
} while(false);
float3 _20861;
do
{
if ((dot(_6962, _6962) > g_vCubeFogCullingParams.x) || (_22886 > g_vCubeFogCullingParams.y))
{
float _22869 = max(pow(max(0.0f, (length(_6962) * g_vCubeFog_Offset_Scale_Bias_Exponent.y) + g_vCubeFog_Offset_Scale_Bias_Exponent.x), g_vCubeFog_Offset_Scale_Bias_Exponent.w), pow(max(0.0f, (_22886 * g_vCubeFog_Height_Offset_Scale_Exponent_Log2Mip.y) + g_vCubeFog_Height_Offset_Scale_Exponent_Log2Mip.x), g_vCubeFog_Height_Offset_Scale_Exponent_Log2Mip.z));
float _16402 = clamp(_22869, 0.0f, 1.0f);
_20861 = lerp(_20860.xyz, float4(g_tFogCubeTexture.SampleLevel(normalize(mul(float4(_6962, 0.0f), g_matvCubeFogSkyWsToOs).xyz), g_vCubeFog_Height_Offset_Scale_Exponent_Log2Mip.w * clamp(1.0f - (_22869 * g_vCubeFog_Offset_Scale_Bias_Exponent.z), 0.0f, 1.0f)).xyz, _16402).xyz, _16402.xxx);
break;
}
_20861 = _20860.xyz;
break;
} while(false);
float3 _20862;
do
{
if (g_bFogTypeEnabled.x != 0u)
{
float4 _11670 = mul(g_mVolFogFromWorld[0u], float4(vHiPos + mad(g_tFogSomething.Sample(mad(gl_FragCoord.xy, g_vScreenSpaceDitherParams.zz, g_vScreenSpaceDitherParams.xy)).xyz, g_vVolFogDitherScaleBias.xxx, g_vVolFogDitherScaleBias.yyy), 1.0f));
float2 _13693 = _11670.xy / _11670.w.xx;
float3 _12515 = (float4(_13693.x, _13693.y, _11670.z, _11670.w).xyw * g_vVolFogPostWorldToFrustumScale.xyz) + g_vVolFogPostWorldToFrustumBias.xyz;
float4 _14467 = float4(_12515.x, _12515.y, _12515.z, _11670.w);
_14467.z = sqrt(max(0.0f, _12515.z));
float4 _24177 = g_tFogVolume.Sample(_14467.xyz);
_20862 = _24177.xyz + (_20861.xyz * _24177.www);
break;
}
_20862 = _20861.xyz;
break;
} while(false);
float3 _20898;
do
{
[branch]
if (g_bFogTypeEnabled.w != 0u)
{
float _8868 = pow(clamp(g_vSphericalVignetteBiasAndScale.x + (g_vSphericalVignetteBiasAndScale.y * distance(vHiPos, g_vSphericalVignetteOrigin_Exponent.xyz)), 0.0f, 1.0f), g_vSphericalVignetteOrigin_Exponent.w) * g_vSphericalVignetteColor_Opacity.w;
_20898 = lerp(_20862.xyz, float4(g_vSphericalVignetteColor_Opacity.xyz, _8868).xyz, _8868.xxx);
break;
}
_20898 = _20862.xyz;
break;
} while(false);
finalColor = float4(_20898.x, _20898.y, _20898.z, vVertexColor.w);
}
else
{
finalColor = float4(finalNoFog.xyz, vVertexColor.w);
}
outColor = finalColor;
}
float4 main(PS_INPUT stage_input) : Sv_Target0
{
gl_FragCoord = stage_input.gl_FragCoord;
gl_FragCoord.w = 1.0 / gl_FragCoord.w;
vPositionWs = stage_input.vPositionWs;
vNormalWs = stage_input.vNormalWs;
vTextureCoords = stage_input.vTextureCoords;
vLightmapUV = stage_input.vLightmapUV;
vVertexColor = stage_input.vVertexColor;
vCentroidNormalWs = stage_input.vCentroidNormalWs;
vTangentUWs = stage_input.vTangentUWs;
vTangentVWs = stage_input.vTangentVWs;
nView = stage_input.nView;
MainPs();
return outColor;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment