Поэтому я пытаюсь написать Raytracer как личный проект, и у меня есть базовая рекурсия, геометрия сетки и пересечение треугольника лучей вниз.
Я пытаюсь получить правдоподобное изображение из этого, но сталкиваюсь с проблемой, что все строки пикселей одинаковы, давая мне прямые вертикальные линии.
Я обнаружил, что все позиции пикселей, сгенерированные с помощью функции камеры, одинаковы на оси y, но не могу найти проблему с моей векторной математикой здесь (я использую свою структуру Vertex в качестве векторов, ее ленивая, я знаю):
void Renderer::CameraShader()
{
//compute the width and height of the screen based on angle and distance of the near clip plane
double widthRad = tan(0.5*m_Cam.angle)*m_Cam.nearClipPlane;
double heightRad = ((double)m_Cam.pixelRows / (double)m_Cam.pixelCols)*widthRad;
//get the horizontal vector of the camera by crossing the direction angle with an
Vertex cross = ((m_Cam.direction - m_Cam.origin).CrossProduct(Vertex(0, 1, 0)).Normalized(0.0001))*widthRad;
//get the up/down vector of the camera by crossing the horizontal vector with the direction vector
Vertex crossDown = m_Cam.direction.CrossProduct(cross).Normalized(0.0001)*heightRad;
//generate rays per pixel row and column
for (int i = 0; i < m_Cam.pixelCols;i++)
{
for (int j = 0; j < m_Cam.pixelRows; j++)
{
Vertex pixelPos = m_Cam.origin + (m_Cam.direction - m_Cam.origin).Normalized(0.0001)*m_Cam.nearClipPlane //vector of the screen center
- cross + (cross*((i / (double)m_Cam.pixelCols)*widthRad*2)) //horizontal vector based on i
+ crossDown - (crossDown*((j / (double)m_Cam.pixelRows)*heightRad*2)); //vertical vector based on j
//cast a ray through according screen pixel to get color
m_Image[i][j] = raycast(m_Cam.origin, pixelPos - m_Cam.origin, p_MaxBounces);
}
}
}
Я надеюсь, что комментарии в коде проясняют, что происходит.
Если кто-нибудь увидит проблему, помогите
Проблема заключалась в том, что мне пришлось вычесть происхождение камеры из точки направления. Это теперь фактически делает sillouettes, так что, я думаю, я могу сказать, что это исправлено 🙂