2012-07-02 27 views
2

我目前正在嘗試在C++中學習光線跟蹤。我從兩本書中獲得幫助:一個是Ray Tracing from the Ground Up by Kevin Suffern,另一個是Physically Based Rendering by Matt Pharr。這兩本書很適合學習基礎知識,以及後來的高級內容。如何在C++中繪製光線追蹤的像素?

我可以用Suffern的書的用戶界面創建一些基本的形狀。但是,當我試圖自己編寫所有代碼時,情況就變得很糟糕。我意識到我甚至不知道如何打開窗口並在其上填充像素。你有沒有什麼好的資源可以教會我用C++繪製基礎知識。

回答

3

您可以生成圖像文件而不是繪製到窗口。 PPM格式是最簡單的格式。瀏覽器通常可以顯示PPM。 Safari做的。

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

+0

我的理解,PPM確實不支持.PNG或.JPEG文件,對不對?如果我想創建其中一個,我應該怎麼做? –

+0

@MertToka,我編輯了我的答案。 – lhf

+0

我查了一下,但現在對我來說似乎太複雜了,或者我得睡個好覺。不過謝謝,我會盡力在不久的將來了解它。但是如果你知道任何libpng的簡單源代碼,它仍然是非常值得讚賞的。 –

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; 
    } 
} 

(請注意,我沒有測試以上 - 最好把它當作僞...)