2016-06-07 31 views
0

Ich schreibe einen einfachen Pfad Tracer und ich möchte eine Vorschau mit OpenGL machen. Da OpenGL-Pipelines jedoch die Projektionsmatrix verwenden, unterscheiden sich die mit OpenGL und Path tracing gerenderten Bilder ein wenig.Wie macht man OpenGL-Kamera und Ray-Tracer-Kamera das gleiche Bild?

Für OpenGL Rendering verwende ich die Grundpipeline, wobei die letzte Transformationsmatrix ist:

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

Parameter für perspektivische Projektion sind: 45.0f, WINDOW_WIDTH, WINDOW_HEIGHT, 0.01, 10000.0f.

Und in meinem Weg Tracer erzeugen I-Strahlen von der Kamera wie folgt aus:

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()); 

Hier sind Bilder von OpenGL gerendert (1) und Pfad Tracer (2). enter image description here enter image description here

Das Problem ist der Abstand zwischen der Szene und der Kamera. Ich meine, es ist nicht konstant. In einigen Fällen sieht das Pfadverfolgungsbild den Objekten "näher" und in einigen Fällen umgekehrt.

Ich habe nichts in Google gefunden.

Antwort

1

Invertieren Sie die Ansichts-Projektionsmatrix, wie sie für OpenGL-Rendering verwendet wird, und verwenden Sie diese, um Bildschirmpixelpositionen in Strahlen für Ihren Raytracer umzuwandeln.