14 layout(std430, binding= 0) readonly buffer triangleData
20 bool intersect(
const Triangle triangle,
const vec3 o,
const vec3 d,
const float tmax, out
float rt, out
float ru, out
float rv )
23 float det=
dot(triangle.ab, pvec);
24 float inv_det= 1.0f / det;
26 vec3 tvec= o - triangle.a;
27 float u=
dot(tvec, pvec) * inv_det;
29 float v=
dot(d, qvec) * inv_det;
32 rt=
dot(triangle.ac, qvec) * inv_det;
38 if(any(greaterThan(
vec3(u, v, u+v),
vec3(1, 1, 1))) || any(lessThan(
vec2(u, v),
vec2(0, 0))))
41 return (rt < tmax && rt > 0);
44 uniform mat4 invMatrix;
47 layout(binding= 0, rgba8) writeonly uniform image2D image;
50 layout( local_size_x= 8, local_size_y= 8 ) in;
54 vec2 position=
vec2(gl_GlobalInvocationID.xy);
57 vec4 oh= invMatrix *
vec4(position, 0, 1);
58 vec4 eh= invMatrix *
vec4(position, 1, 1);
61 vec3 o= oh.xyz / oh.w;
62 vec3 d= eh.xyz / eh.w - oh.xyz / oh.w;
67 for(
int i= 0; i < triangles.length(); i++)
70 if(intersect(triangles[i], o, d, hit, t, u, v))
79 imageStore(image, ivec2(gl_GlobalInvocationID.xy),
vec4(hitu, hitv, 0, 1));
float dot(const Vector &u, const Vector &v)
renvoie le produit scalaire de 2 vecteurs.
Vector cross(const Vector &u, const Vector &v)
renvoie le produit vectoriel de 2 vecteurs.
triangle pour le bvh, cf fonction bounds() et intersect().
vecteur generique, utilitaire.
vecteur generique, utilitaire.
vecteur generique 4d, ou 3d homogene, utilitaire.