Устранить искажения типа "рыбий глаз" при расчете векторов для лучевого анализа
Я пытаюсь написать ядро opencl для raymarching. Все работает, за исключением заметных искажений "рыбий глаз" в результирующих изображениях, как видно в этом примере: (Предполагается, что это куб)
Проблема заключается в том, как я строю вектор направления для каждого луча.
В настоящее время я даю ядру направление камеры как тангаж и рыскание (pitch
а также yaw
в моем коде).
Потом по фов (fov
), координаты пикселя, который вычисляет ядро (ix
а также iy
) а ширина и высота всего кадра (width
, height
Я получаю поле и рыскание для направления луча.
Наконец, я строю единичный вектор с использованием высоты тона и рыскания, указанных в предыдущих вычислениях.
(varfloat
представляет float или double в зависимости от того, запущено ли ядро с двойной или одинарной точностью)
Для изображения выше, fov
был пи /3 и width
а также height
были оба 500.
unsigned int ix = get_global_id(0);
unsigned int iy = get_global_id(1);
//PROBLEM LIES IN THESE 3 LINES:
varfloat y = yaw - fov/2.0 + fov*ix/width; //get yaw using horizontal fov
varfloat f = (fov * height) / width; //calculate vertical fov from horizontal fov scaled proportionally based on width and height
varfloat p = pitch - f/2.0 + f*iy/height; //get pitch using vertical fov
varfloat3 direction = {sin(y)*cos(p), cos(y)*cos(p), sin(p)}; //unit vector for ray direction
Может кто-нибудь сказать мне, как я должен рассчитывать шаг и рыскание для вектора направления, чтобы устранить искажение?