我目前正在尝试学习 C++ 中的光线追踪。我从两本书中得到帮助:一本是Kevin Suffern 的 Ray Tracing from the Ground Up,另一本是Matt Pharr 的基于物理的渲染。这两本书非常适合学习基础知识,然后是高级知识。
我可以使用 Suffern 书中的用户界面创建一些基本形状。但是,当我尝试自己编写所有代码时,事情就变得疯狂了。我意识到我什至不知道如何打开一个窗口并在上面填充像素。你有什么好的资源可以推荐,可以教我用 C++ 绘图的基础知识。
我目前正在尝试学习 C++ 中的光线追踪。我从两本书中得到帮助:一本是Kevin Suffern 的 Ray Tracing from the Ground Up,另一本是Matt Pharr 的基于物理的渲染。这两本书非常适合学习基础知识,然后是高级知识。
我可以使用 Suffern 书中的用户界面创建一些基本形状。但是,当我尝试自己编写所有代码时,事情就变得疯狂了。我意识到我什至不知道如何打开一个窗口并在上面填充像素。你有什么好的资源可以推荐,可以教我用 C++ 绘图的基础知识。
SDL might work for you: http://www.libsdl.org/
您可以分配自己的图像缓冲区,将像素写入其中,然后根据需要保存到文件/绘制到窗口。我希望 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;
}
}
(请注意,我没有测试上述内容——最好将其视为伪代码......)