13 gl_Position=
vec4(positions[gl_VertexID], 1.0);
14 position= positions[gl_VertexID].xy;
19 #ifdef FRAGMENT_SHADER
35 bool intersect(
const Triangle triangle,
const vec3 o,
const vec3 d,
const float tmax, out
float rt, out
float ru, out
float rv )
38 float det=
dot(triangle.ab, pvec);
39 float inv_det= 1.0f / det;
41 vec3 tvec= o - triangle.a;
42 float u=
dot(tvec, pvec) * inv_det;
44 float v=
dot(d, qvec) * inv_det;
47 rt=
dot(triangle.ac, qvec) * inv_det;
53 if(any(greaterThan(
vec3(u, v, u+v),
vec3(1, 1, 1))) || any(lessThan(
vec2(u, v),
vec2(0, 0))))
56 return (rt < tmax && rt > 0);
59 uniform mat4 mvpInvMatrix;
60 uniform
int triangle_count;
63 out
vec4 fragment_color;
68 vec4 oh= mvpInvMatrix *
vec4(position, 0, 1);
69 vec4 eh= mvpInvMatrix *
vec4(position, 1, 1);
72 vec3 o= oh.xyz / oh.w;
73 vec3 d= eh.xyz / eh.w - oh.xyz / oh.w;
79 for(
int i= 0; i < triangle_count; i++)
82 if(intersect(triangles[i], o, d, hit, t, u, v))
91 fragment_color=
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.