cubemap_roughness_inc.glsl 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #define M_PI 3.14159265359
  2. layout(push_constant, binding = 1, 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 Roughness, vec3 N) {
  41. float a = Roughness * Roughness; // DISNEY'S ROUGHNESS [see Burley'12 siggraph]
  42. // Compute distribution direction
  43. float Phi = 2.0 * M_PI * Xi.x;
  44. float CosTheta = sqrt((1.0 - Xi.y) / (1.0 + (a * a - 1.0) * Xi.y));
  45. float SinTheta = sqrt(1.0 - CosTheta * CosTheta);
  46. // Convert to spherical direction
  47. vec3 H;
  48. H.x = SinTheta * cos(Phi);
  49. H.y = SinTheta * sin(Phi);
  50. H.z = CosTheta;
  51. vec3 UpVector = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);
  52. vec3 TangentX = normalize(cross(UpVector, N));
  53. vec3 TangentY = cross(N, TangentX);
  54. // Tangent to world space
  55. return TangentX * H.x + TangentY * H.y + N * H.z;
  56. }
  57. // https://graphicrants.blogspot.com.au/2013/08/specular-brdf-reference.html
  58. float GGX(float NdotV, float a) {
  59. float k = a / 2.0;
  60. return NdotV / (NdotV * (1.0 - k) + k);
  61. }
  62. // https://graphicrants.blogspot.com.au/2013/08/specular-brdf-reference.html
  63. float G_Smith(float a, float nDotV, float nDotL) {
  64. return GGX(nDotL, a * a) * GGX(nDotV, a * a);
  65. }
  66. float radicalInverse_VdC(uint bits) {
  67. bits = (bits << 16u) | (bits >> 16u);
  68. bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
  69. bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
  70. bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
  71. bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
  72. return float(bits) * 2.3283064365386963e-10; // / 0x100000000
  73. }
  74. vec2 Hammersley(uint i, uint N) {
  75. return vec2(float(i) / float(N), radicalInverse_VdC(i));
  76. }