30 const float len2 = glm::dot(direction, direction);
31 if (len2 <= 0.000001f)
32 return {0.0f, 0.0f, 1.0f};
34 const glm::vec3 axis = glm::normalize(direction);
41 const float cosMax = std::cos(angle);
42 const float cosTheta = glm::mix(1.0f, cosMax, u1);
43 const float sinTheta = std::sqrt(1.0f - cosTheta * cosTheta);
45 const float phi = 2.0f * glm::pi<float>() * u2;
48 const glm::vec3 local{
49 std::cos(phi) * sinTheta,
50 std::sin(phi) * sinTheta,
55 const glm::vec3 helper =
56 std::abs(axis.z) < 0.999f
57 ? glm::vec3(0.0f, 0.0f, 1.0f)
58 : glm::vec3(1.0f, 0.0f, 0.0f);
60 const glm::vec3 tangent = glm::normalize(glm::cross(helper, axis));
61 const glm::vec3 bitangent = glm::cross(axis, tangent);
64 const glm::vec3 world =
69 return glm::normalize(world);