2016-06-07 5 views
0

Я пишу простой трассировщик пути, и я хочу сделать предварительный просмотр с OpenGL. Но поскольку конвейер OpenGL использует матрицу проекций, изображения, полученные с помощью OpenGL и трассировки Path, немного отличаются.Как сделать камеру OpenGL и камеру Ray-tracer одинаковым образом?

для рендеринга OpenGL я использую основной трубопровод, в котором окончательная матрица преобразования:

m_transformation = PersProjTrans * CameraRotateTrans * CameraTranslationTrans * TranslationTrans * RotateTrans * ScaleTrans 

Параметры для перспективной проекции являются: 45.0f, WINDOW_WIDTH, WINDOW_HEIGHT, 0.01, 10000.0f.

И в моем пути трейсера я генерировать лучи от камеры, как это:

m_width_recp = 1.0 /0m_width; 
m_height_recp = 1.0/m_height; 
m_ratio = (double)m_width/m_height; 

m_x_spacing = (2.0 * m_ratio)/(double)m_width; 
m_y_spacing = (double)2.0/(double)m_height; 
m_x_spacing_half = m_x_spacing * 0.5; 
m_y_spacing_half = m_y_spacing * 0.5; 

x_jitter = (Xi1 * m_x_spacing) - m_x_spacing_half; 
y_jitter = (Xi2 * m_y_spacing) - m_y_spacing_half; 

Vec pixel = m_position + m_direction * 2.0; 
pixel = pixel - m_x_direction * m_ratio + m_x_direction * (x * 2.0 * m_ratio * m_width_recp) + x_jitter; 
pixel = pixel + m_y_direction - m_y_direction*(y * 2.0 * m_height_recp + y_jitter); 

return Ray(m_position, (pixel-m_position).norm()); 

Вот изображения, созданные OpenGL (1) и Path Tracer (2). enter image description here enter image description here

Проблема расстояние между сценой и камерой. Я имею в виду, что это не постоянно. В некоторых случаях изображение трассировки пути выглядит «ближе» к объектам, а в некоторых случаях наоборот.

Я ничего не нашел в Google.

ответ

1

Инвертируйте матрицу проекций проекции, используемую для рендеринга OpenGL, и используйте это для преобразования положений пикселя экрана в лучи для вашего лучевого индикатора.

 Смежные вопросы

  • Нет связанных вопросов^_^