2012-09-18 32 views
0

我正在使用Java編寫一個非常原始的3D圖形引擎,它基於1995年3D遊戲編程的黑色藝術。我已經到了可以將單色多邊形繪製到屏幕上並將相機移動到「場景」。我甚至有一個Z緩衝區,通過將這些像素按Z排序來正確處理半透明物體,只要我一次不會顯示太多半透明像素。我處於想要添加照明的地步。我想保持簡單,環境光看起來很簡單,定向光線也應該相當簡單。但我真的希望點光源能夠移動光源並施加非常原始的陰影(主要是我不希望光線穿過牆壁)。如何構建點光源?

我的問題是,我不知道最好的方法來解決這個問題。我想象一個點光源以規則角度投射光線,如果這些光線與多邊形相交,它將點亮該多邊形並停止向前移動。然而,當我想到一個場景中有多個光源和多個多邊形以及所有這些光線時,我想它會變得非常緩慢。我也不知道如何處理一個多邊形遠離光源的情況,如果它落在兩條光線之間。我會給每個光源一個最大距離,如果我給它足夠的光線,那麼在該距離內應該沒有任何兩個光線相距太遠而不能錯過多邊形的點,但這隻會增加我的問題,要執行的計算。

我給你的問題是:是否有一些技巧指出光源加速或者只是爲了更好地組織它?恐怕我只會得到嵌套for循環的噩夢。我不能使用openGL或Direct3D或任何其他祕籍,因爲我想寫我自己的。

如果你想查看我的結果到目前爲止,這裏是一個YouTube視頻。我已經修復了壞的相機旋轉。 http://www.youtube.com/watch?v=_XYj113Le58&feature=plcp

回答

0

實時三維應用照明(或者說 - 過去一般都是)通過非常簡單的近似方法完成 - 請參閱http://en.wikipedia.org/wiki/Shading。陰影是昂貴的 - 並且通常在光柵化3d引擎中已經通過shadow maps & Shadow Volumes完成。點光源使陰影更加昂貴。

動態實時光源最近才成爲遊戲中的常見功能 - 僅僅因爲它們給渲染系統帶來了如此沉重的負擔。這些遊戲利用專用圖形卡。所以我認爲如果你決定包含動態陰影投射點光源,你可能很難從你的引擎中獲得良好的性能。

今天,它是平常的兩種方式可以應用於照明:

  1. 傳統上,這一直是「向前渲染」。在這種方法中,對於每個頂點(如果您正在進行每個頂點的光照)或片段(如果您按照每個像素進行),您將計算每個光源的貢獻。
  2. 最近,「延遲」照明已經變得流行,其中幾何圖形和額外數據(如法線顏色信息)都被渲染到中間緩衝區 - 然後用於計算照明貢獻。這樣,照明計算不依賴於幾何計數。但是,它有很多其他開銷。

有很多選項。然而,實施比過去幾年中專用顯卡所使用的一些基本模型複雜得多的任何東西都將是具有挑戰性的!

我的建議是從簡單的東西開始 - 沒有陰影的基本照明。從那裏你可以擴展和優化。


你在做什麼光線三角相交測試?你是否只想點亮光線會達到的三角形? Ray-triangle 每個聚合物的每個光線的交點將會非常昂貴,我認爲。對於沒有陰影的照明,通常您只需遍歷每個面(或者如果您正在通過每個頂點完成每個頂點),並計算每個燈光的照明貢獻 - 您將在開始柵格化之前執行此操作在任何情況下通過所有的聚合物。

您可以使用任何照明模型來計算照明,這些照明模型非常簡單,如Lambertian reflectance - 它基於表面法線的點積和從表面到光線的方向矢量對錶面進行遮蔽。確保你的載體在相同的空間!這可能是你爲什麼會得到你的奇怪結果的原因。如果你的表面法線在世界空間中,一定要計算世界空間光線矢量。在某些空間中進行照明調節有許多優點,您可以稍後再看看,因爲現在我建議您只需掌握並運行基礎知識。還有看看Blinn-phong - 這是多年使用的着色模型顯卡。

對於陰影照明 - 查看我發佈的鏈接。他們的開發是因爲現實的照明計算起來非常昂貴。

順便說一下,LaMothe有一本名爲「3D遊戲編程大師高級3D圖形和柵格化技巧」的後續書。
這將帶您通過編程3D引擎的每一步。我不確定黑色藝術書的內容。

+0

感謝您的信息。我嘗試使用我發現的點光源和光線三角交點算法設置平面着色器。我的立方體的兩側呈現不同的陰影,但與光線平行的邊比面對光源的面明亮,並且我立方體另一側的面也被點亮。我懷疑我沒有做交叉路口檢測權。我有一些優點,我只有320×240像素,並計劃保持多邊形數量低,但這將是艱難的。我忘記了大部分矩陣代數。 – user137

+0

你將不得不刷新你的矩陣數學/線性代數,這是什麼3D圖形是關於:P我已經更新了我的答案 - 我的答覆不適合評論。 – unohoo

+0

我想做交點測試,以便光線不能穿過牆壁。我不希望移動物體或傢俱等陰影。我想牆和地板將有更少的多邊形進行測試。我認爲使用黑色藝術書的燈光模型與朗伯模型相同,但我必須仔細檢查公式。對於陰影,我將使用gourad陰影,如果不是平面陰影。我可能不得不看另一本書,這本黑皮書使用了很多基於DOS和mode13H的技巧,這些技巧並沒有很好地轉化爲現代計算機。 – user137