Advertisement
Tableuraz

Fog Light/Density compte shader

Mar 29th, 2025 (edited)
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.11 KB | None | 0 0
  1. #include <Bindings.glsl>
  2. #include <Camera.glsl>
  3. #include <Fog.glsl>
  4. #include <FrameInfo.glsl>
  5. #include <FwdLights.glsl>
  6. #include <Lights.glsl>
  7. #include <VTFSLightSampling.glsl>
  8.  
  9. layout(
  10.     local_size_x = FOG_WIDTH / FOG_WORKGROUPS,
  11.     local_size_y = FOG_HEIGHT / FOG_WORKGROUPS,
  12.     local_size_z = FOG_DEPTH / FOG_WORKGROUPS) in;
  13.  
  14. layout(binding = UBO_FRAME_INFO) uniform FrameInfoBlock
  15. {
  16.     FrameInfo u_FrameInfo;
  17. };
  18. layout(binding = UBO_CAMERA) uniform CameraBlock
  19. {
  20.     Camera u_Camera;
  21. };
  22. layout(binding = UBO_FOG_SETTINGS) uniform FogSettingsBlock
  23. {
  24.     FogSettings u_FogSettings;
  25. };
  26.  
  27. layout(binding = 0) uniform sampler3D u_Density;
  28. layout(binding = 0, rgba16f) restrict writeonly uniform image3D img_Result;
  29.  
  30. float HenyeyGreensteinPhase(IN(vec3) a_WorldView, IN(vec3) a_WorldLightDir, float a_Aniso)
  31. {
  32.     float costh = dot(a_WorldView, a_WorldLightDir);
  33.     float denom = 1.0f + a_Aniso * a_Aniso + 2.0f * a_Aniso * costh;
  34.     return (1.0f / (4.0f * M_PI)) * (1.0f - a_Aniso * a_Aniso) / max(pow(denom, 1.5f), 0.000001);
  35. }
  36.  
  37. float SchlickPhase(IN(vec3) a_WorldView, IN(vec3) a_WorldLightDir, float a_Aniso)
  38. {
  39.     float costh = dot(a_WorldView, a_WorldLightDir);
  40.     return (1.0 - a_Aniso * a_Aniso) / (4.0 * M_PI * pow(1.0 - a_Aniso * costh, 2.0));
  41. }
  42.  
  43. vec3 GetFogVTFSLightColor(
  44.     IN(vec3) a_WorldCameraPosition,
  45.     IN(vec3) a_WorldPosition,
  46.     IN(vec3) a_NDCPosition,
  47.     IN(float) a_Aniso)
  48. {
  49.     const vec3 worldView          = normalize(a_WorldPosition - a_WorldCameraPosition);
  50.     const uvec3 vtfsClusterIndex  = VTFSClusterIndex(a_NDCPosition);
  51.     const uint vtfsClusterIndex1D = VTFSClusterIndexTo1D(vtfsClusterIndex);
  52.     const uint lightCount         = vtfsClusters[vtfsClusterIndex1D].count;
  53.     vec3 totalLightColor          = vec3(0);
  54.     for (uint i = 0; i < lightCount; i++) {
  55.         const uint lightIndex         = vtfsClusters[vtfsClusterIndex1D].index[i];
  56.         const int lightType           = lightBase[lightIndex].commonData.type;
  57.         const vec3 lightPosition      = lightBase[lightIndex].commonData.position;
  58.         const vec3 lightColor         = lightBase[lightIndex].commonData.color;
  59.         const float lightMaxIntensity = lightBase[lightIndex].commonData.intensity;
  60.         const float lightFalloff      = lightBase[lightIndex].commonData.falloff;
  61.         float lightIntensity          = 0;
  62.         vec3 L                        = vec3(0);
  63.         if (lightType == LIGHT_TYPE_POINT || lightType == LIGHT_TYPE_SPOT) {
  64.             const vec3 LVec   = lightPosition - a_WorldPosition;
  65.             const float LDist = length(LVec);
  66.             L                 = LVec / LDist;
  67.             lightIntensity    = PointLightIntensity(LDist, lightPoint[lightIndex].range, lightMaxIntensity, lightFalloff)
  68.                 * HenyeyGreensteinPhase(worldView, L, a_Aniso);
  69.             if (lightType == LIGHT_TYPE_SPOT) {
  70.                 const vec3 lightDir             = lightSpot[lightIndex].direction;
  71.                 const float lightInnerConeAngle = lightSpot[lightIndex].innerConeAngle;
  72.                 const float lightOuterConeAngle = lightSpot[lightIndex].outerConeAngle;
  73.                 lightIntensity *= SpotLightIntensity(L, lightDir, lightInnerConeAngle, lightOuterConeAngle);
  74.             }
  75.         } else {
  76.             L              = -lightDirectional[lightIndex].direction;
  77.             lightIntensity = lightMaxIntensity
  78.                 * HenyeyGreensteinPhase(worldView, L, a_Aniso);
  79.         }
  80.         totalLightColor += lightColor * lightIntensity;
  81.     }
  82.     return totalLightColor;
  83. }
  84.  
  85. vec3 GetFogShadowLightColor(
  86.     IN(vec3) a_WorldCameraPosition,
  87.     IN(vec3) a_WorldPosition,
  88.     IN(float) a_Aniso,
  89.     IN(ivec3) a_RandBase)
  90. {
  91.     const vec3 worldView = normalize(a_WorldPosition - a_WorldCameraPosition);
  92.     vec3 totalLightColor = vec3(0);
  93.     for (uint i = 0; i < u_FwdShadowsBase.count; i++) {
  94.         const FwdShadowBase shadowBase = u_FwdShadowsBase.shadows[i];
  95.         const int lightType            = shadowBase.light.commonData.type;
  96.         const vec3 lightPosition       = shadowBase.light.commonData.position;
  97.         const vec3 lightColor          = shadowBase.light.commonData.color;
  98.         const float lightMaxIntensity  = shadowBase.light.commonData.intensity;
  99.         const float lightFalloff       = shadowBase.light.commonData.falloff;
  100.         float lightIntensity           = 0;
  101.         vec3 L                         = vec3(0);
  102.         if (lightType == LIGHT_TYPE_POINT) {
  103.             const FwdShadowPoint shadowPoint = u_FwdShadowsPoint.shadows[i];
  104.             const float lightRange           = shadowPoint.light.range;
  105.             const vec3 LVec                  = lightPosition - a_WorldPosition;
  106.             const float LDist                = length(LVec);
  107.             L                                = normalize(LVec);
  108.             ShadowPointData shadowData;
  109.             shadowData.lightDir         = -L;
  110.             shadowData.lightDist        = LDist;
  111.             shadowData.near             = shadowPoint.projection.zNear;
  112.             shadowData.far              = shadowPoint.projection.zFar;
  113.             shadowData.blurRadius       = shadowPoint.blurRadius;
  114.             shadowData.randBase         = a_RandBase;
  115.             const float shadowIntensity = SampleShadowMap(u_FwdShadowSamplers[i], shadowData);
  116.             lightIntensity              = PointLightIntensity(LDist, lightRange, lightMaxIntensity, lightFalloff)
  117.                 * HenyeyGreensteinPhase(worldView, L, a_Aniso)
  118.                 * shadowIntensity;
  119.         } else if (lightType == LIGHT_TYPE_SPOT) {
  120.             const FwdShadowSpot shadowSpot  = u_FwdShadowsSpot.shadows[i];
  121.             const float lightRange          = shadowSpot.light.range;
  122.             const vec3 lightDir             = shadowSpot.light.direction;
  123.             const float lightInnerConeAngle = shadowSpot.light.innerConeAngle;
  124.             const float lightOuterConeAngle = shadowSpot.light.outerConeAngle;
  125.             const vec3 LVec                 = lightPosition - a_WorldPosition;
  126.             const float LDist               = length(LVec);
  127.             L                               = normalize(LVec);
  128.             ShadowSpotData shadowData;
  129.             shadowData.projection       = shadowSpot.projection.projection * shadowSpot.projection.view;
  130.             shadowData.near             = shadowSpot.projection.zNear;
  131.             shadowData.far              = shadowSpot.projection.zFar;
  132.             shadowData.blurRadius       = shadowSpot.blurRadius;
  133.             shadowData.surfacePosition  = a_WorldPosition;
  134.             shadowData.randBase         = a_RandBase;
  135.             const float shadowIntensity = SampleShadowMap(u_FwdShadowSamplers[i], shadowData);
  136.             lightIntensity              = PointLightIntensity(LDist, lightRange, lightMaxIntensity, lightFalloff)
  137.                 * SpotLightIntensity(L, lightDir, lightInnerConeAngle, lightOuterConeAngle)
  138.                 * HenyeyGreensteinPhase(worldView, L, a_Aniso)
  139.                 * shadowIntensity;
  140.         } else {
  141.             const FwdShadowDir shadowDir = u_FwdShadowsDir.shadows[i];
  142.             L = -shadowDir.light.direction;
  143.             ShadowDirData shadowData;
  144.             shadowData.surfacePosition  = a_WorldPosition;
  145.             shadowData.projection       = shadowDir.projection.projection * shadowDir.projection.view;
  146.             shadowData.near             = shadowDir.projection.zNear;
  147.             shadowData.far              = shadowDir.projection.zFar;
  148.             shadowData.blurRadius       = shadowDir.blurRadius;
  149.             shadowData.randBase         = a_RandBase;
  150.             const float shadowIntensity = SampleShadowMap(u_FwdShadowSamplers[i], shadowData);
  151.             lightIntensity              = lightMaxIntensity
  152.                 * HenyeyGreensteinPhase(worldView, L, a_Aniso)
  153.                 * shadowIntensity;
  154.         }
  155.         totalLightColor += lightColor * lightIntensity;
  156.     }
  157.     return totalLightColor;
  158. }
  159.  
  160. #ifndef ANISO
  161. #define ANISO 0.76
  162. #endif
  163.  
  164. void main()
  165. {
  166.     const mat4x4 VP       = u_Camera.projection * u_Camera.view;
  167.     const mat4x4 invVP    = inverse(VP);
  168.     const vec3 resultSize = vec3(FOG_WIDTH, FOG_HEIGHT, FOG_DEPTH);
  169.  
  170.     const vec3 fragCoord = gl_GlobalInvocationID + vec3(0.5f);
  171.     const vec3 uv        = vec3(fragCoord.xy / resultSize.xy, pow(fragCoord.z / resultSize.z, 1 / FOG_DEPTH_EXP));
  172.     const vec3 NDCPos    = uv * 2.f - 1.f;
  173.     const vec4 projPos   = (invVP * vec4(NDCPos, 1));
  174.     const vec3 worldPos  = projPos.xyz / projPos.w;
  175.  
  176.     const vec3 vtfsColor       = GetFogVTFSLightColor(u_Camera.position, worldPos, NDCPos, ANISO);
  177.     const vec3 shadColor       = GetFogShadowLightColor(u_Camera.position, worldPos, ANISO, ivec3(fragCoord.xy, u_FrameInfo.frameIndex));
  178.     const vec3 iblColor        = GetIBLColor(worldPos);
  179.     const vec4 fogColorDensity = texture(u_Density, uv);
  180.     const vec3 lightColor      = (vtfsColor + shadColor + iblColor) * fogColorDensity.a;
  181.  
  182.     vec4 out_Color;
  183.     out_Color.rgb = fogColorDensity.rgb * lightColor * fogColorDensity.a;
  184.     out_Color.a   = fogColorDensity.a;
  185.     imageStore(img_Result, ivec3(fragCoord), out_Color);
  186. }
  187.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement