2011-10-06 178 views
1

我想創建一個OpenGL應用程序與水波和折射。我需要投射來自太陽和相機的光線,並找出它們相交的地方,或者我需要從海底開始,找出我必須去哪個方向(如果有的話),以便擊中太陽或相機。我有點卡住了,任何人都可以給我一個OpenGL光線投射或高級幾何中的速成課程的入門嗎?我不想讓海底處於恆定的深度,我不希望水波是簡單的正弦波。OpenGL水折射

+0

我的一個想法是首先投射一個初始射線並查看它的着陸點。然後使用相對於第一條光線的小步驟,使用衍生物來查看下一條光線將要着陸的位置。但我是OpenGL的新手,所以我不知道我可以訪問多少信息。我甚至會如何開始投射射線,我的意思是如果沒有片段我只想投射一些射線,我該如何運行片段着色器? –

回答

3

一件事:你想達到的效果可以用的OpenGL實現,但它不是一個功能的OpenGL 。 OpenGL本身只是一個複雜的三角形來屏幕繪製API。您獲得了一些輸入數據並編寫了一個程序,該程序使用OpenGL API根據輸入數據執行相對簡單的柵格化繪圖操作。着色器給它一些空間;您可以在片段着色器中實施光線跟蹤器。

在你的情況下,這意味着,你必須實現一些算法來生成你想要的圖片。對於水是必須的某種光線追蹤或假折射方法才能獲得看水的效果。焦散需要一個完整的特徵光子映射器,或者你基於水面的二階導數假效果很好。

有一個WebGL的演示,呈現驚人的好看,互動水:http://madebyevan.com/webgl-water/這裏是它在YouTube上http://www.youtube.com/watch?v=R0O_9bp3EKQ

視頻該演示使用真實光線追蹤(水面,球體和游泳池的光線追蹤) ,基於投影水面高度圖的二階導數,焦散是「假焦散」效應。

+0

「全」光線追蹤幾乎總是太昂貴,所以我們必須經常欺騙某個地方。這個演示很好,但是當水的運動很大時你可以看到它的極限。可惜,這是非常好的。 – spraff

+1

+1「OpenGL本身只是一個複雜的三角形來屏幕繪製API」。它應該以72pt大膽寫入任何人開始 – Kromster

1

沒有什麼特別的OpenGL相關的。

您是否在談論caustics?這裏是another good Gamasutra article

反射通常通過將鏡頭反射到鏡面並渲染爲紋理來實現,您可以應用畸變,然後使用它來紋理化水面。這隻適用於小波浪。

什麼你在這裏後是大量的小辦法:-)

+0

哦,我想在OpenGL中做這件事,因爲我希望代碼是可移植的。我可以用軟件輕鬆完成,但這可能會減慢速度。 –

+0

是的,焦散是我正在尋找的一部分。如果我之前閱讀過這篇文章,聽起來似乎是熟悉的鐘聲,但我對「審美」算法不感興趣,我想要真正的交易。 –

+0

哎呀,是的,我已經閱讀過那篇文章,我在滾動時識別屏幕截圖。我不喜歡它,似乎是一個愚蠢的方法,結果也不是一個好例子。但是,儘管感謝分享,但遲早我必須瞭解如何做到這一點。 –

0

欺騙Techincally,你認爲是光波/光子反彈的表面,並通過媒介傳播的結果。對於「實打實」你必須從Sun與各射線直接追蹤光的路徑如下:

  • 擊中水面
  • 折射+反映,反映進入相機(*) ,折射部分更進一步
  • 命中海底
  • 反映
  • 碰到水底下
  • 反映+折射,折射部分失控的水,命中相機(*),再次反射進入海底,反射ects等

(*)其實,大多數射線會錯過相機,但這將是過於昂貴,所以這是一個騙子。

對至少三種波長 - 「紅色」,「綠色」和「藍色」進行此操作。他們每個人都會有不同的折射和反映。將三者結合起來可以得到整個畫面。

然後,您只需使用進入相機的光線創建一個紋理,並將其覆蓋在OpenGL中。

這是一個直接,簡單,計算量非常大的方法,可以近似於焦散以外的物理。第一