2014-11-03 28 views
1

我想盡可能逼真地渲染一個場景,在這個場景中點光線照到一個物體,並以相同的角度反射到臉部的法線(入射角=反射角)並在其他地方照亮場景。如何用threejs實現真實的反射

現在,我知道在threejs反射通常處理CubeCamera - 材料按例子我在網上找到,但它並不完全適用於我的情況下,我可以從一個點觀察場景,我可能無法觀察到物體在另一個鏡子狀表面上的反射。

考慮this example prototype我正在研究:如果在場景中從牆上突出的盒子具有鏡像材料(用CubeCamera完成),我將無法看到綠色立方體的反射除非相機處於特定的位置,否則是底面;但是,在現實生活中,如果光源照射的物體通過另一個物體附近,它將部分地照亮它,就好像它是一個光源本身(當然取決於物體的反射率指數)等等現象應該從任何角度都可見,接收間接照明的物體是可見的。

因此,我想出了在立方體中添加PointLight的想法,但這當然會對環境產生不良影響。

我會盡量說明與下面的順序我的目標:

Step1

1)在這裏,我將從此稱其爲陽臺另一邊是正確的黑暗,而區域標有紅色'x'的是立方體有孩子PointLight的後果,它們閃耀着四面八方。

Step2

2)在此,陽臺的遠面仍然是黑暗和底部之一被接收作爲多維數據集經過甚至更多的光,這是可取的,但立方體後面的牆壁實際上應該是暗(我還沒有添加陰影,我首先想要獲得照明),以及它下面的地面和燈柱。

Step3

3)最後,當立方體已通過陽臺,這對於我們現在都一個反射光線不反彈只是普通的錯陽臺的側面和底面被點亮,它來自的方式。同樣適用於燈柱。

現在我意識到所有發生的錯誤都是由於立方體本身發出的光線,我希望你能幫助我的是確定一種產生物理準確反射光線的方法。
我想避免使用環境光或其他黑客來模擬真實場景並儘可能堅持物理;我懷疑我想要實現的計算量很大,更不用說在實時用例中進行動畫製作,但這不是一個問題,因爲我只是試圖開發一個概念驗證,而不是一定應該快速執行。

從我所收集的,我也許應該編寫自定義頂點和片段着色器用於接收間接照明,右邊的材料?不幸的是,我不知道從哪裏開始,任何人都可以將我指向正確的方向?乾杯。

回答

2

如果你不想去的體積渲染,那麼你有3種選擇(我知道)

  1. 光線追蹤

    ,你必須使用光線跟蹤渲染(回光線)來實現這一點。這也將包括陰影,透明材料,反射照明和更多,如果編碼正確。除非你想要做精確的大氣散射,那麼就是這樣。

    • 背面光線追蹤是每每個屏幕像素的一種(或3)射線(多個)。它要快得多,但不是那麼精確。(仍然足夠精確)
    • 光線跟蹤是每個光源的每個3D角度單位(立體弧度)的空間。它速度慢但精確(如果光線密度足夠高)。

    如果鑄造的光線遇到任何障礙物,則其顏色會發生變化(由於障礙物屬性),並且新光線會作爲反射光線進行投射。如果材料是透明的,那麼也會折射射線......每次擊打或折射都會影響光強度,所以當強度低於某個閾值或某層遞歸時(每條射線限制最大折射數量),您可以停止以避免無限循環,並且你可以操縱性能/品質...

  2. 標準的多邊形描繪

    採用這種方法(我想你正在使用它現在),你不得不即興發揮。反射和照明效果可以類似於陰影技術來完成。對於每個表面,您必須以反射方向渲染場景。使用陰影也可以做到這一點,但是隻需渲染光線方向或使用陰影貼圖即可。如果你的反射面數量過大,那麼這種方法也不是實現折射反射的方法,你必須遞歸渲染,使得每個多邊形的渲染通過也是瘋狂的。

  3. 立方體貼圖

    您可以按每個對象使用立方體貼圖。它與第2項類似,但是在產生立方體貼圖而不是每一幀的時候,瘋狂只做一次......如果你有太多的物體,那麼這也不是這樣。您只能將立方體貼圖用於具有反射表面的物體,以使其易於管理。此外,如果物體正在移動,那麼你必須重新生成立方體貼圖偶爾...

+0

好吧,聽起來像我可能想使用** raytracing **,「慢但精確」的一個;有關如何使用THREE.js實現它的任何線索? – 2014-11-04 10:52:15

+0

@AndreaAloi我不用JAVA編碼,所以我無法幫助。要麼使用像Canvas一樣的2D像素API(用於SW渲染),要麼使用OpenGL + GLSL + GLM。只有在需要照片真實/光度精度時才使用光線跟蹤。後面的光線跟蹤可以在RealTime中以非常接近它的結果的方式完成,因此通常選擇它會更好......兩個引擎都是相似的,所以如果結果不夠好,您可以用不太大的努力從backtratratra重寫到raytrace 。在這裏,應該有一些libs,但是我不使用JAVA,而且這個站點也不允許這樣的問題 – Spektre 2014-11-04 11:04:36

+0

好的,非常感謝您的建議,我會從這裏拿走它,也許會發布另一個更具體的問題。請注意,在我的情況下,語言不是Java,而是JavaScript,我並不是要求提供關於是否使用特定程序的建議 - 本網站確實禁止 - 但是如果有人知道某個網站或資源的位置我可以在three.js中找到關於光線跟蹤的方式的文檔,這是恕我直言的完全合法。 :) – 2014-11-04 12:22:31