git clone https://github.com/ssloy/tinyrenderer.git &&
cd tinyrenderer &&
mkdir build &&
cd build &&
cmake .. &&
cmake --build . -j &&
./tinyrenderer ../obj/diablo3_pose/diablo3_pose.obj ../obj/floor.obj
渲染的圖像保存到framebuffer.tga
。
您可以在 Gitpod(GitHub 的免費線上開發環境)中開啟該專案:
打開時,編輯器將編譯並運行程序,並在編輯器的預覽中開啟生成的圖像。只需更改編輯器中的程式碼並重新運行腳本(使用終端的歷史記錄)即可查看更新的映像。
我的原始碼無關緊要。閱讀 wiki 並實現您自己的渲染器。只有當你經歷了所有的微小細節時,你才會知道發生了什麼事。
在本系列文章中,我想透過編寫 OpenGL 的克隆(一個非常簡化的克隆)來展示 OpenGL 的工作原理。令人驚訝的是,我經常遇到無法克服學習 OpenGL / DirectX 初始障礙的人。因此,我準備了一系列簡短的講座,之後我的學生展示了相當出色的渲染器。
因此,任務的表述如下:不使用第三方函式庫(尤其是圖形庫),得到如下圖所示的內容:
警告:這是一份訓練材料,將鬆散地重複 OpenGL 庫的結構。它將是一個軟體渲染器。我不想展示如何編寫 OpenGL 應用程式。我想展示 OpenGL 是如何運作的。我深信,如果不理解這一點,就不可能使用 3D 函式庫編寫高效的應用程式。
我會盡量讓最終的程式碼在500行左右。我的學生需要 10 到 20 個小時的程式設計時間才能開始製作這樣的渲染器。在輸入處,我們得到一個帶有多邊形線+帶有紋理的圖片的測試檔案。在輸出中,我們將得到一個渲染的模型——沒有圖形介面,程式只是產生一個圖像。
由於目標是最大程度地減少外部依賴性,因此我只為學生提供一門允許使用 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. write_tga_file ( " output.tga " );`
return 0 ;
}
output.tga 應該看起來像這樣: