在OpenGL ES中进行三角形相交测试,GLSL

时间:2019-02-06 23:45:48

标签: opengl-es glsl shader intersection

我在GitHub存储库中找到了此射线三角相交函数,用于我的射线跟踪实现。我知道这就是“Möllerand Trumbore”算法。我在徘徊,如果有人可以给我一个暗示,此函数的out参数实际上是什么(我的意思是数学上的意思)。代码如下:

bool IntersectTriangle(Ray ray, vec3 p0, vec3 p1, vec3 p2,
                        out float hit, out vec3 barycentricCoord, out vec3 triangleNormal)
{
    const vec3 e0 = p1 - p0;
    const vec3 e1 = p0 - p2;
    triangleNormal = cross( e1, e0 );

    const vec3 e2 = ( 1.0 / dot( triangleNormal, ray.Direction ) ) * ( p0 - ray.Origin );
    const vec3 i  = cross( ray.Direction, e2 );

    barycentricCoord.y = dot( i, e1 );
    barycentricCoord.z = dot( i, e0 );
    barycentricCoord.x = 1.0 - (barycentricCoord.z + barycentricCoord.y);
    hit   = dot( triangleNormal, e2 );

    return  /*(hit < ray.tmax) && */ (hit > INTERSECT_EPSILON) && all(greaterThanEqual(barycentricCoord, vec3(0.0)));
}

我知道重心坐标和三角形法线是什么,但是我在数学上不理解函数内的“命中”参数和“ e2”变量。

  1. const vec3 e2 = ( 1.0 / dot( triangleNormal, ray.Direction ) ) * ( p0 - ray.Origin );

  2. hit = dot( triangleNormal, e2 );

据我了解,命中变量是射线到三角形的命中位置吗?

link的存储库:

1 个答案:

答案 0 :(得分:1)

我可以回答您的部分问题。我相信这里的输出如下:

out vec3 barycentricCoord

交点P以重心坐标给出。

out vec3 triangleNormal

三角形法线(垂直于三角形面的矢量)。

out float hit

从交点到射线的距离。

此页面上有一些非常有用的信息,非常清楚,并提供了更深入的说明:

https://www.scratchapixel.com/lessons/3d-basic-rendering/ray-tracing-rendering-a-triangle/moller-trumbore-ray-triangle-intersection

它解释了很多有关计算以及数学表示的内容。但是从我所看到的那就是我对这些输出的解释。

我仍在细分这行:

const vec3 e2 = ( 1.0 / dot( triangleNormal, ray.Direction ) ) * ( p0 - ray.Origin );

但是这部分,

dot( triangleNormal, ray.Direction )

似乎正在检查射线和三角形法线是否垂直。如果它们是哪种,则表示该射线没有平行,因为射线与三角形平行。