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

3
我目前正在学习C++中的光线追踪。我得到了两本书的帮助:一本是Kevin Suffern的《从零开始的光线追踪》,另一本是Matt Pharr的《基于物理的渲染》。这两本书非常适合学习基础和高级内容。
我可以使用Suffern书中的用户界面创建一些基本形状。然而,当我试图自己编写所有代码时,事情变得有些混乱。我意识到我甚至不知道如何打开一个窗口并在其中填充像素。你有什么好的资源推荐,可以教我C++绘图的基础知识吗?
3个回答

4
你可以生成图像文件而不是绘制到窗口。 PPM 格式是生成最简单的格式,浏览器通常能够显示PPM。Safari可以。
如果想要生成PNG文件,请使用 libpng

据我所知,PPM不支持.PNG或.JPEG文件,是吗?如果我想创建其中之一,该怎么办? - hevele
我查了一下,但现在对我来说似乎太复杂了,或者我需要好好睡一晚上。不过还是谢谢你,我会在不久的将来尝试理解它。但如果您知道任何更简单的libpng来源,仍然非常感激。 - hevele

1

0

您可以分配自己的图像缓冲区,将像素写入其中,然后根据需要保存到文件/绘制到窗口。我预计Pharr书籍中也有类似的版本,这要归功于文学编程。

更具体地说: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;
  }
}

(请注意,我尚未测试上述代码--最好将其视为伪代码...)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接