Настройка лучей в CUDA с использованием матриц, поставляемых OpenGL


Я работаю над проектом, в котором я переношу свой код CUDA для использования как модуль в большом приложении, которое поддерживает свой собственный Состоянии OpenGL. Мой модуль в основном является визуализатором объема. Теперь я столкнулся с проблемой, что я должен настроить лучи рендерера громкости, чтобы точно имитировать камеру OpenGL, так что мой объемный рендеринг соответствует остальной части отрисованной сцены.

В точке, где вызывается мой код CUDA, есть матрица просмотра (без матрицы вида модели) и проекции набор матриц. Я уже извлек параметры усечения и положение камеры в мировом пространстве.

u *= -c_pp.right;
v *= -c_pp.top;

Ray eyeRay;
eyeRay.o = make_float3(c_camPosition); //origin
eyeRay.d = normalize(make_float3(u, v, -c_pp.near)); //direction

u и v - нормализованные координаты экрана, идущие от -1 до 1. c_pp описывает вид усеченного конуса с помощью top, right и near. Теперь я ищу подходящую матрицу, с которой мне нужно умножить так что eyeRay.d показывает в правильном направлении. До сих пор используя матрица просмотра или ее транспонированный или инвертированный вариант неудачный.

Обновление :

Изменил u *= -c_pp.right на u *= c_pp.right и все работает путем умножения eyeRay.d с обратной матрицей просмотра.

Полный фиксированный код:

u *= c_pp.right;
v *= -c_pp.top;

Ray eyeRay;
eyeRay.o = make_float3(c_camPosition); //origin
eyeRay.d = make_float3(u, v, -c_pp.near)); //direction
eyeRay.d = mul(c_invViewMatrix, eyeRay.d);

С c_inViewMatrix, являющейся обратной матрицей вида.

1 4

1 ответ:

На этот вопрос ответил оригинальный плакат inline. Ответ состоит в том, чтобы изменить u *= -c_pp.right на u *= c_pp.right (изменение знака). Смотреть выше.

Я добавил этот ответ, чтобы уменьшить количество неотвеченных вопросов в теге CUDA, чтобы сделать его более полезным.