Я пытаюсь написать ядро opencl для raymarching.Все работает, за исключением заметных искажений «рыбий глаз» на результирующих изображениях, как показано в этом примере: (Предполагается, что это куб)
Проблема заключается в том, как я строю вектор направления для каждого луча.
В настоящее время я даю ядру направление камеры в виде высоты тона и рыскания (pitch
и yaw
в моем коде).
Затем на основе fov (fov
), координат пикселя, который вычисляет ядро (ix
и iy
), а также ширины и высоты всего кадра (width
, height
) Я получаю шаг и рыскание для направления луча.
Наконец, я строю единичный вектор с использованием высоты и рыскания, заданных предыдущими вычислениями.
(varfloat
представляет либо float, либо double в зависимости от того, работает ли ядро с двойным или одиночным плавающимточная точность)
Для изображения выше fov
было Pi / 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
Может кто-нибудь сказать мне, как я должен бытьвычисление высоты и рыскания для вектора направления, чтобы устранить искажение?