Устранить искажения типа "рыбий глаз" при расчете векторов для лучевого анализа

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

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

0 ответов

Другие вопросы по тегам