Нахождение длины луча, пересекающего бесконечную плоскость

Я пытаюсь использовать шейдер постобработки для создания водоемов. Уровень воды будет равен y = 0, и все, что ниже этой границы, будет затронуто шейдером. Я буду отбрасывать лучи из положения камеры в шейдере и получать расстояние от земли каждого луча. Затем я использую эту информацию, чтобы рассчитать, сколько воды вы видите, чтобы вычислить цвет поверхности. Проблема в том, что я понятия не имею, как обнаружить и вычислить расстояние, пройденное лучом до пересечения с y = 0. Есть ли способ для меня добиться этого эффекта.

Неверный код

float rayGroundIntersect(float3 rayOrigin, float3 rayDir) {
    if (rayDir.y <= 0) {
        return maxFloat;
    }
    float a = rayOrigin.y / rayDir.y;
    float l = length(rayDir.xz * a);
    return l;
}

Аналогичный успешный проект, но на сфере.


person Ethan Ma    schedule 04.01.2021    source источник
comment
Вы нашли решение этой проблемы? Если мой ответ помог, рассмотрите возможность принять его.   -  person Ruzihm    schedule 06.01.2021
comment
Ваш ответ сработал отлично. Большое спасибо!   -  person Ethan Ma    schedule 06.01.2021


Ответы (1)


На основе этого ответа от Trillian

float rayGroundIntersect(float3 rayOrigin, float3 rayDir) {
    float denom = dot(float3(0,1,0), rayDir);
    if (abs(denom) > 0.0001f)
    {
        // negate normal instead of rayOrigin
        float t = dot(rayOrigin, float3(0,-1,0)) / denom; 
        return t >= 0 ? t : maxFloat;
    }
    return maxFloat;
}
person Ruzihm    schedule 04.01.2021