'n Paar vrae oor straalsporing met opengl

Ek moet 'n beperkte vorm van straalsporing doen. Ek het nie refleksies nodig nie. Ek hoef net die kleur van 'n pixel te verander, afhangend van hoe dit by 'n voorwerp verbygaan, en breking. Ek hoef ook net te toets vir kruisings tussen die straal en sfere en skywe, niks anders nie.

Dit is die hooffunksie in my shader:

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);
}

My eerste vraag is oor die oorsprong van die straal. Hoe kry ek die ligging? Op die oomblik vroetel ek net totdat dit reg lyk, maar as ek die breedte of hoogte van die skerm verander, moet ek rondspeel totdat dit reg lyk.

My tweede vraag gaan oor die kruising tussen 'n straal en 'n skyf. Ek doen dit deur eers te kyk of die straal 'n vlak sny en dan of die snypunt binne die radius van die skyf is. My kode lyk so

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);
        }
}

Die probleem is dat as liggame [tel] .radius kleiner as of gelyk is aan die z-posisie van die oorsprong van die straal, dan verskyn daar niks.

if(det>0)
{
        if(distance(det*ray.direction,bodies[count].position)<=.76) 
        {
            return vec4(1.0,0.0,0.0,1.0);
        }
}

het dus sigbare skywe tot gevolg, terwyl die gebruik van die werklike radius niks tot gevolg het nie.

7
задан Paul Sonier 26 July 2011 в 21:47
поделиться