#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