关于opengl光线跟踪的几个问题

关于opengl光线跟踪的几个问题,opengl,glsl,raytracing,Opengl,Glsl,Raytracing,我需要做有限形式的光线追踪。我不需要思考。我只需要改变一个像素的颜色,这取决于它如何通过一个对象,以及折射。我也只需要测试光线与球体和圆盘之间的交点,其他什么都不需要 这是我的着色器中的主要功能: void main(void) { Ray ray; ray.origin=vec3(0.5,0.5,.75); ray.direction=vec3(gl_FragCoord.x/width,gl_FragCoord.y/height,-gl_FragCoord.z)-ra

我需要做有限形式的光线追踪。我不需要思考。我只需要改变一个像素的颜色,这取决于它如何通过一个对象,以及折射。我也只需要测试光线与球体和圆盘之间的交点,其他什么都不需要

这是我的着色器中的主要功能:

void main(void)
{
    Ray ray;
    ray.origin=vec3(0.5,0.5,.75);

    ray.direction=vec3(gl_FragCoord.x/width,gl_FragCoord.y/height,-gl_FragCoord.z)-ray.origin;
    ray.direction=normalize(ray.direction);

    gl_FragColor=trace(ray);
}
我的第一个问题是关于射线的起源。我怎么知道它的位置?现在,我只是摆弄屏幕直到它看起来合适,但是如果我改变屏幕的宽度或高度,我必须摆弄屏幕直到它看起来合适

我的第二个问题是关于射线和圆盘的交集。我首先检查光线是否与平面相交,然后检查交点是否在圆盘半径内。 我的代码如下所示

float intersectPlane(Ray ray,vec3 point,vec3 normal)
{
    return dot(point-ray.origin,normal)/dot(ray.direction,normal);
}
...

det=intersectPlane(ray,bodies[count].position,vec3(0,0,1));
if(det>0)
{
        if(distance(det*ray.direction,bodies[count].position)<=bodies[count].radius) 
        {
            return vec4(1.0,0.0,0.0,1.0);
        }
}
浮动相交平面(光线、vec3点、vec3法线)
{
返回点(点射线、原点、法线)/点(射线、方向、法线);
}
...
det=相交平面(光线,实体[count]。位置,向量3(0,0,1));
如果(det>0)
{

if(distance(det*ray.direction,body[count].position)至于你的第二个问题:不要使用距离,使用平方距离。它处理速度更快,我怀疑它可能会解决你的问题

  • 光线的原点确实取决于您,但是我建议您指定原点,以便像素位置与原点和对象的距离大致相等

  • 请注意光线的方向,这意味着您试图看到的对象必须在相机前面。(发送的光线必须击中对象。)


  • 光线和平面的交点计算如下:

    dist = dot( plane_origin - ray.origin, plane_NV ) / dot( ray.direction, plane_NV );
    plane_isect = ray.origin + ray.direction * dist;
    
    函数
    intersectPlane
    正确计算从光线原点到平面交点的距离,但在将交点与磁盘中心进行比较之前,不会计算交点

    要测试交点是否在半径范围内,必须执行以下操作:

    vec3 plane_isect = ray.origin + det * ray.direction;
    if ( distance( plane_isect, bodies[count].position ) <= bodies[count].radius ) 
    
    vec3平面\u isect=ray.origin+det*ray.direction;
    if(距离(平面,实体[计数]。位置)0)
    {
    vec3平面=射线原点+检测*射线方向;
    if(距离(平面,实体[count]。位置)
    
    vec3 plane_isect = ray.origin + det * ray.direction;
    if ( distance( plane_isect, bodies[count].position ) <= bodies[count].radius ) 
    
    det = intersectPlane( ray, bodies[count].position, vec3(0,0,1) );
    if ( det>0 )
    {
        vec3 plane_isect = ray.origin + det * ray.direction;
        if ( distance( plane_isect, bodies[count].position ) <= bodies[count].radius ) 
        {
            return vec4(1.0,0.0,0.0,1.0);
        }
    }