2012-07-02 6 views
2

J'essaie actuellement d'apprendre le ray-tracing en C++. Je reçois de l'aide de deux livres: l'un est Ray Tracing from the Ground Up by Kevin Suffern, et l'autre est Physically Based Rendering by Matt Pharr. Ces deux livres sont parfaits pour apprendre les bases et, plus tard, des trucs avancés.Comment dessiner des pixels pour le ray-tracing en C++?

Je pourrais créer quelques formes de base en utilisant l'interface utilisateur du livre de Suffern. Cependant quand j'ai essayé d'écrire tout le code par moi-même, les choses sont devenues sauvages. Je me suis rendu compte que je ne savais même pas comment ouvrir une fenêtre et remplir des pixels sur cela. Avez-vous une bonne ressource à recommander qui pourrait m'apprendre les bases du dessin en C++.

Répondre

3

Vous pouvez générer des fichiers image au lieu de dessiner sur des fenêtres. Le format PPM est le plus simple à générer. Les navigateurs peuvent généralement afficher PPM. Safari fait.

Si vous souhaitez générer des fichiers PNG, utilisez libpng.

+0

Comme je l'ai compris, PPM-t ne supporte pas les fichiers .PNG ou .JPEG, non? Que dois-je faire si je veux en créer un? –

+0

@MertToka, j'ai édité ma réponse. – lhf

+0

J'ai regardé ça mais ça me semble trop complexe pour le moment, ou je dois bien dormir. Merci, je vais essayer de le comprendre dans un proche avenir. Mais il est toujours très apprécié si vous connaissez des sources plus simples pour libpng. –

0

Vous pouvez allouer votre propre tampon d'image, écrire vos pixels, puis enregistrer le fichier/dessiner à la fenêtre au besoin. Je m'attends à ce que le livre de Pharr ait sa propre version cachée quelque part, grâce à Literate Programming. Plus concrètement: Les API de format GUI et de format de fichier d'image sont généralement capables de lire des données de tampon d'image simples, stockées dans l'ordre du tableau principal. Je recommande un format de pixels RGBA, quelque chose comme ce qui suit:

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

(notez que je ne l'ai pas testé ci-dessus - mieux de le traiter comme ... pseudocode)

Questions connexes