cubemap_roughness_inc.glsl 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #define M_PI 3.14159265359
  2. layout(push_constant, std430) uniform Params {
  3. uint face_id;
  4. uint sample_count;
  5. float roughness;
  6. bool use_direct_write;
  7. float face_size;
  8. }
  9. params;
  10. vec3 texelCoordToVec(vec2 uv, uint faceID) {
  11. mat3 faceUvVectors[6];
  12. // -x
  13. faceUvVectors[1][0] = vec3(0.0, 0.0, 1.0); // u -> +z
  14. faceUvVectors[1][1] = vec3(0.0, -1.0, 0.0); // v -> -y
  15. faceUvVectors[1][2] = vec3(-1.0, 0.0, 0.0); // -x face
  16. // +x
  17. faceUvVectors[0][0] = vec3(0.0, 0.0, -1.0); // u -> -z
  18. faceUvVectors[0][1] = vec3(0.0, -1.0, 0.0); // v -> -y
  19. faceUvVectors[0][2] = vec3(1.0, 0.0, 0.0); // +x face
  20. // -y
  21. faceUvVectors[3][0] = vec3(1.0, 0.0, 0.0); // u -> +x
  22. faceUvVectors[3][1] = vec3(0.0, 0.0, -1.0); // v -> -z
  23. faceUvVectors[3][2] = vec3(0.0, -1.0, 0.0); // -y face
  24. // +y
  25. faceUvVectors[2][0] = vec3(1.0, 0.0, 0.0); // u -> +x
  26. faceUvVectors[2][1] = vec3(0.0, 0.0, 1.0); // v -> +z
  27. faceUvVectors[2][2] = vec3(0.0, 1.0, 0.0); // +y face
  28. // -z
  29. faceUvVectors[5][0] = vec3(-1.0, 0.0, 0.0); // u -> -x
  30. faceUvVectors[5][1] = vec3(0.0, -1.0, 0.0); // v -> -y
  31. faceUvVectors[5][2] = vec3(0.0, 0.0, -1.0); // -z face
  32. // +z
  33. faceUvVectors[4][0] = vec3(1.0, 0.0, 0.0); // u -> +x
  34. faceUvVectors[4][1] = vec3(0.0, -1.0, 0.0); // v -> -y
  35. faceUvVectors[4][2] = vec3(0.0, 0.0, 1.0); // +z face
  36. // out = u * s_faceUv[0] + v * s_faceUv[1] + s_faceUv[2].
  37. vec3 result = (faceUvVectors[faceID][0] * uv.x) + (faceUvVectors[faceID][1] * uv.y) + faceUvVectors[faceID][2];
  38. return normalize(result);
  39. }
  40. vec3 ImportanceSampleGGX(vec2 xi, float roughness4) {
  41. // Compute distribution direction
  42. float Phi = 2.0 * M_PI * xi.x;
  43. float CosTheta = sqrt((1.0 - xi.y) / (1.0 + (roughness4 - 1.0) * xi.y));
  44. float SinTheta = sqrt(1.0 - CosTheta * CosTheta);
  45. // Convert to spherical direction
  46. vec3 H;
  47. H.x = SinTheta * cos(Phi);
  48. H.y = SinTheta * sin(Phi);
  49. H.z = CosTheta;
  50. return H;
  51. }
  52. float DistributionGGX(float NdotH, float roughness4) {
  53. float NdotH2 = NdotH * NdotH;
  54. float denom = (NdotH2 * (roughness4 - 1.0) + 1.0);
  55. denom = M_PI * denom * denom;
  56. return roughness4 / denom;
  57. }
  58. float radicalInverse_VdC(uint bits) {
  59. bits = (bits << 16u) | (bits >> 16u);
  60. bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
  61. bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
  62. bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
  63. bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
  64. return float(bits) * 2.3283064365386963e-10; // / 0x100000000
  65. }
  66. vec2 Hammersley(uint i, uint N) {
  67. return vec2(float(i) / float(N), radicalInverse_VdC(i));
  68. }