Advertisement
MathInferno123

Untitled

Feb 3rd, 2025
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OpenGL Shading 3.61 KB | Source Code | 0 0
  1. #version 460
  2.  
  3. layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
  4.  
  5. layout(set = 0, binding = 0) readonly buffer lv_tileBuffer {
  6.     uint lv_tileData[];
  7. } tileBuffer;
  8.  
  9.  
  10. layout(set = 0, binding = 1) uniform  UniformBuffer {
  11.  
  12. mat4   inMtx;
  13. mat4   viewMatrix;
  14. vec4 cameraPos;
  15.  
  16. float scale;
  17. float bias;
  18. float zNear;
  19. float zFar;
  20. float radius;
  21. float attScale;
  22. float distScale;
  23. uint m_enableDeferred;
  24.  
  25. } ubo;
  26.  
  27.  
  28.  
  29.  
  30. struct Light {
  31.     vec4 m_Position;
  32.     vec4 m_Color;
  33.  
  34.     float m_linear;
  35.     float m_quadratic;
  36.     float m_radius;
  37.     float m_pad;
  38. };
  39.  
  40. const uint lv_totalNumLights = 64;
  41. const uint lv_totalNumBins = 32;
  42.  
  43. layout(set = 0, binding = 2) uniform lv_lightData
  44. {
  45.     Light m_lights[lv_totalNumLights];
  46.     uint m_sortedLightsIndices[lv_totalNumLights];
  47.  
  48.     uint m_bins[lv_totalNumBins];
  49. } lightData;
  50.  
  51.  
  52.  
  53. layout(set = 0, binding = 3) uniform sampler2D lv_positions;
  54. layout(set = 0, binding = 4) uniform sampler2D lv_normals;
  55. layout(set = 0, binding = 5) uniform sampler2D lv_albedoSpecs;
  56.  
  57. layout(set = 0, binding = 6) uniform writeonly image2D lv_outputImage;
  58.  
  59.  
  60. void main()
  61. {
  62.    
  63.     ivec2 lv_uv = ivec2(gl_GlobalInvocationID.xy);
  64.  
  65.     vec4 lv_worldPos = vec4(texelFetch(lv_positions, lv_uv,0).xyz, 1.f);
  66.  
  67.     vec4 lv_viewPos = ubo.viewMatrix * lv_worldPos;
  68.    
  69.     uint lv_binIndex = uint(((-lv_viewPos.z - ubo.zNear)/(ubo.zFar - ubo.zNear)) * 8.f);
  70.  
  71.     uint lv_bin = lightData.m_bins[lv_binIndex];
  72.  
  73.     uint lv_minLightIndex = lv_bin & 0xFFFF;
  74.     uint lv_maxLightIndex = (lv_bin >> 16) & 0xFFFF;
  75.     vec3 lv_albedo = texelFetch(lv_albedoSpecs, lv_uv,0).rgb;
  76.     vec3 lv_lightning = lv_albedo*0.1;
  77.    
  78.     if(lv_maxLightIndex != 0) {
  79.  
  80.         uvec2 lv_currentThreadGlobalID = gl_GlobalInvocationID.xy;
  81.  
  82.         uvec2 lv_tile = lv_currentThreadGlobalID/uint(8);
  83.  
  84.         uint lv_stride = 1024;
  85.  
  86.         uint lv_address = lv_tile.y*lv_stride + lv_tile.x*8;
  87.  
  88.         for(uint lv_lightIndex = lv_minLightIndex; lv_lightIndex <= lv_maxLightIndex; ++lv_lightIndex) {
  89.            
  90.             uint lv_wordID = lv_lightIndex / 32;
  91.             uint lv_bit = lv_lightIndex % 32;
  92.  
  93.             if((tileBuffer.lv_tileData[lv_address + lv_wordID] & (1 << lv_bit)) != 0) {
  94.  
  95.                 vec3 lv_fragPos = texelFetch(lv_positions, lv_uv,0).rgb;
  96.                 vec3 lv_normal = texelFetch(lv_normals, lv_uv,0).rgb;
  97.                 float lv_specular = texelFetch(lv_albedoSpecs, lv_uv,0).a;
  98.  
  99.                 uint lv_globalLightIndex = lightData.m_sortedLightsIndices[lv_lightIndex];
  100.  
  101.                 Light lv_light = lightData.m_lights[lv_globalLightIndex];
  102.  
  103.                 vec3 lv_dir = normalize(ubo.cameraPos.xyz - lv_fragPos);
  104.    
  105.        
  106.                 vec3 lv_lightDir = normalize(lv_light.m_Position.xyz - lv_fragPos);
  107.                 vec3 lv_diffuse = max(dot(lv_normal, lv_lightDir), 0.0) * lv_albedo * lv_light.m_Color.rgb;
  108.  
  109.                 //specular
  110.                 vec3 halfwayDir = normalize(lv_lightDir + lv_dir);  
  111.                 float spec = pow(max(dot(lv_normal, halfwayDir), 0.0), 16.0);
  112.                 vec3 specular = lv_light.m_Color.rgb * spec * lv_specular;
  113.  
  114.                 // attenuation
  115.                 float distance = length(lv_light.m_Position.xyz - lv_fragPos);
  116.                 float attenuation = 1.0 / (1.0 + lv_light.m_linear * distance + lv_light.m_quadratic * distance * distance);
  117.                 lv_diffuse *= attenuation;
  118.                 specular *= attenuation;
  119.                 lv_lightning += lv_diffuse + specular;
  120.  
  121.  
  122.             }
  123.  
  124.         }
  125.  
  126.     }
  127.  
  128.     imageStore(lv_outputImage,lv_uv,vec4(lv_lightning, 1.f));
  129.  
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement