Я пишу простой трассировщик пути, и я хочу сделать предварительный просмотр с 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).
Проблема расстояние между сценой и камерой. Я имею в виду, что это не постоянно. В некоторых случаях изображение трассировки пути выглядит «ближе» к объектам, а в некоторых случаях наоборот.
Я ничего не нашел в Google.