如何在C ++中绘制光线跟踪像素?

时间:2012-07-02 08:32:15

标签: graphics pixel tracing

我目前正在尝试用C ++学习光线跟踪。我从两本书中获得帮助:一本是Ray Tracing from the Ground Up by Kevin Suffern,另一本是Physically Based Rendering by Matt Pharr。这两本书非常适合学习基础知识,以及后来的高级内容。

我可以使用Suffern的书的用户界面创建一些基本形状。然而,当我尝试自己编写所有代码时,事情变得疯狂。我意识到我甚至不知道如何打开一个窗口并填充像素。你有什么好的资源可以推荐给我教我用C ++绘图的基础知识。

3 个答案:

答案 0 :(得分:3)

您可以生成图像文件而不是绘制到窗口。 PPM格式是最简单的格式。浏览器通常可以显示PPM。 Safari确实。

如果要生成PNG文件,请使用libpng

答案 1 :(得分:1)

SDL可能适合您:http://www.libsdl.org/

答案 2 :(得分:0)

您可以分配自己的图像缓冲区,将像素写入其中,然后根据需要保存到文件/绘制到窗口。我希望Pharr的书有自己的版本隐藏在某处,由Literate Programming提供。

更具体地说:GUI API和图像文件格式库通常能够读取以行主阵列顺序存储的简单图像缓冲区数据。我建议使用RGBA像素格式,如下所示:

template<class T> class image_rgba {
  unsigned m_rows, m_cols;
  T *m_data;

public:
  image_rgba(unsigned rows, unsigned columns)
    : m_rows(rows)
    , m_cols(columns)
    , m_data(new T[rows*columns*4])
  {}
  ~image_rgba()  { delete[] m_data; }

  typedef T pixel[4];
  pixel index_pixel_ref(unsigned row, unsigned col)  {
    assert(row<m_rows && col<m_cols);
    return m_data + (m_cols*row+col)*4;
  }
}

(请注意,我没有测试过上述内容 - 最好将其视为伪代码......)