看到葉大的文章用JavaScript玩轉計算機圖形學(一)光線追蹤入門 - Milo Yip - 部落格園,裡面有幾個小例子,所以把這些效果用C++再實現一遍。

bajdcc/GameFramework,這一系列停更好久了,只是沒想到比較有趣的點子,拿它來練習再好不過,原因有:Direct2D渲染、支援lua指令碼、C++編寫。由於是光線追蹤,所以實際上可以說不依賴任何庫,只要有一個CPU就能完成計算。

目前只做了兩個效果,具體的講述移步部落格,我不再贅述。

程式碼:

https://

github。com/bajdcc/GameF

ramework/blob/master/CCGameFramework/base/pe2d/RenderSphere。cpp

(光線追蹤)

https://

github。com/bajdcc/GameF

ramework/blob/master/CCGameFramework/base/pe2d/PhysicsEngine2D。cpp#L73

(色彩圖)

色彩圖

【遊戲框架系列】簡單的圖形學(一)

【遊戲框架系列】簡單的圖形學(一)

色彩圖

這只是一個基本的例子,講述如何透過畫素操作來改變色彩。

我們一張圖就如同一個二階矩陣,每個顏色是一個int,就這麼簡單。

具體實現的過程:

視窗收到WM_PAINT訊息,開始啟用Direct2D繪製

我們的窗口裡面是樹狀關係的視窗/控制元件組,所以遞迴執行繪製操作

展示控制元件執行繪製操作

建立一個顏色陣列,修改之

根據陣列建立一個位圖,將它儲存供重用

利用Direct2D的渲染操作將該點陣圖渲染

簡單的光線追蹤

【遊戲框架系列】簡單的圖形學(一)

【遊戲框架系列】簡單的圖形學(一)

光線追蹤(左) 以及 法向量圖(右)

左邊的光線追蹤我一開始也沒有搞明白,等到實現之後才明白。

實現原理很簡單:

一個眼睛,一個球,沒有光

最終的結果要投影到一塊螢幕上,螢幕和眼睛是有一個距離的,就像拍照時手要比個相框一樣

眼睛、螢幕、球,萬事俱備(詳見用JavaScript玩轉計算機圖形學(一)光線追蹤入門 - Milo Yip - 部落格園 第一張圖)

最主要操作:

螢幕上給每個畫素標記一個點

眼睛與那些點形成一個射線(光線)

射線無限延長(追蹤),你把它看成鐳射

鐳射有可能就照在了球上,也有可能不在球上

對於照在球上的鐳射,我只要算一下

鐳射出發點(眼睛)到鐳射結束點(鐳射與球交點)的距離

即可。

將兩者距離(正數)最終對映到0-255,即RGB,根據RGB值確定畫素顏色

如果鐳射沒有打中球,對應畫素表現為黑色

理一下對映關係:

3D空間-->2D螢幕,距離-->畫素顏色

右邊是一個法向量圖,不同的是:並非由距離確定畫素顏色,而是由

該點法向量

確定顏色。

鐳射打中球時,我們計算出交點的座標,同時也計算出鐳射到該點的直線,其實就是法向量。

法向量方程有四個引數,但是這裡場景很簡單——球的法向量(單位向量)

經過球心

,所以其實只有三個引數,我們將三個引數(-1~1)對映到RGB。

後面要完成的:

用JavaScript玩轉計算機圖形學(二)基本光源 - Milo Yip - 部落格園

用 C 語言畫光(一):基礎

用 C 語言畫光(二):構造實體幾何