(GLSL) Трассировка лучей за один уик-энд, как добавить глубину резкости для просмотра матрицы?

#graphics #glsl #shader #raytracing

#графика #glsl #шейдер #трассировка лучей

Вопрос:

У меня есть настройка шейдера для генерации лучей из матрицы просмотра и проекции, поступающей из GLM, функция GLSL выглядит следующим образом:

 Ray Camera_getRay(inout uvec4 useed) {
    vec3 rayNDC = vec3(
        ((2.0f * fragCoord.x) / iResolution.x - 1.0f),
        (1.0f - (2.0f * fragCoord.y) / iResolution.y),
        1.0f
    );

    vec4 rayClip = vec4( rayNDC.x, rayNDC.y * -1, -1.0f, 1.0f );

    vec4 rayCamera = inverse(projection) * rayClip;
    rayCamera.z = -1.0f, rayCamera.w = 0.0f;

    vec3 direction = normalize((inverse(view) * rayCamera).xyz);

    return Ray(position, direction);
}
  

Я пытаюсь добавить рандомизированное смещение, как описано в главе «Размытие при расфокусировке«.

Я зашел так далеко:

 float aperture = 0.1;
float lens_radius = aperture / 2;
vec3 rd = lens_radius * sampleUnitDisk(useed);
  

Но я не уверен, что делать rd дальше, мне просто добавить его в положение луча? нужно ли мне также добавлять ее к направлению луча? Должен ли я изменять матрицу просмотра? Любая помощь приветствуется.

Ответ №1:

В моем трассировщике лучей я добавляю (2D) рандомизированное смещение к положению глаза (гарантируя, что движение происходит в плоскости, параллельной виртуальной плоскости обзора), а затем вычисляю направление луча через первоначально намеченную точку проекции.

https://github.com/raybellis/RRT/blob/master/rrt/camera.cpp#L66