Устранить искажения типа «рыбий глаз» при расчете векторов для лучевого анализа - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь написать ядро ​​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

Может кто-нибудь сказать мне, как я должен бытьвычисление высоты и рыскания для вектора направления, чтобы устранить искажение?

...