Настройка лучей в 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
, являющейся обратной матрицей вида.