Несколько вопросов о трассировке лучей с помощью opengl

Мне нужно сделать ограниченную форму трассировки лучей. Мне не нужны размышления. Мне нужно только изменить цвет пикселя, в зависимости от того, как он проходит мимо объекта и преломления. Мне также нужно только проверить наличие пересечений между лучом и сферами и дисками. Ничего другого.

Это основная функция моего шейдера:

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

Проблема в том, что если тела [count] .radius меньше или равно z-положению происхождения луча, то ничего не появляется. Так

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

приводит к видимым дискам, в то время как фактический радиус ничего не дает.

7 голосов | спросил user467526 27 J000000Wednesday11 2011, 00:43:50

0 ответов


Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132