500行C++代碼實現軟件渲染器 - 0.引言

直接閱讀源代碼並不容易理解,建議閱讀維基之後再來實現你自己的渲染器。只有當你弄懂了所有的技術細節之後,你纔會知道渲染器如何工作。我很樂意通過郵件得到讀者的反饋。如果你有任何問題,歡迎與我聯繫([email protected])。如果你是一名教師,希望在課堂上使用本材料,我對此非常歡迎,不必授權,只需要通過郵件告知我即可,因爲這能夠幫助我改進本課程。

本系列文章中,我希望通過寫一個渲染器來展示OpenGL是如何工作的。我經常碰到一些人,他們難以跨過學習OpenGL/DirectX的第一道坎,這確實令人吃驚。因此,我準備了這個系列文章。我的學生學習了這些文章之後都能實現一個比較好的渲染器。

本系列文章的任務是:不使用任何三方庫(尤其是圖形學方面的),渲染出類似以下圖片的效果。

提醒:這是一個練習材料,它會引導你簡單重複OpenGL庫的架構,實現一個軟件渲染器。我並不會向你展示如何使用OpenGL寫程序,我只會向你展示OpenGL如何工作。因爲我深信,不理解三維渲染庫的底層實現,根本不可能寫出高效的程序。

我會將最終的代碼量控制在500行左右。我的學生需要10-20個小時的編時間來實現這樣一個渲染器。我們使用一個多邊形網格文件和圖片紋理作爲輸入,同時輸出一個經過渲染的模型。由於沒有圖形接口,我們的程序只生成一張圖片。

由於我們的目標是儘量減少外部依賴,我只給了我的學生一個處理TGA文件的類。TGA是最簡單的圖片格式之一,支持RGB/RGBA/黑白格式。因此,在開始的時候,我們將獲得一個簡單的方式來處理圖片。你會注意到,在最開始,我們用到的功能僅僅是爲像素設置顏色值,當然,讀寫圖片的功能除外。

沒有繪製線和三角形的功能,我們將手動實現這些。我將把我和學生同時寫的源代碼提供出來。但是我不建議使用這些代碼,因爲不太好理解。完整的代碼在GitHub上,你可以在這裏看到我給學生提供的代碼。

#include "tgaimage.h"
const TGAColor white = TGAColor(255, 255, 255, 255);
const TGAColor red   = TGAColor(255, 0,   0,   255);
int main(int argc, char** argv) 
{
    TGAImage image(100, 100, TGAImage::RGB);
    image.set(52, 41, red);
    image.flip_vertically(); // i want to have the origin at the left bottom corner of the image
    image.write_tga_file("output.tga");`
    return 0;
}

輸出的文件output.tga看起來是這樣的:

https://raw.githubusercontent.com/ssloy/tinyrenderer/gh-pages/img/00-home/reddot.png

預告:使用本課程渲染器生成的其他效果圖

https://raw.githubusercontent.com/ssloy/tinyrenderer/gh-pages/img/00-home/demon.png

https://raw.githubusercontent.com/ssloy/tinyrenderer/gh-pages/img/00-home/diablo-glow.png

https://raw.githubusercontent.com/ssloy/tinyrenderer/gh-pages/img/00-home/boggie.png

https://raw.githubusercontent.com/ssloy/tinyrenderer/gh-pages/img/00-home/diablo-ssao.png

感謝原作者Dmitry V. Sokolov的授權,原文鏈接:https://github.com/ssloy/tinyrenderer/wiki

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章