Я работаю над проектом, где я переношу свой код 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
матрицей обратного просмотра.