我想創建一個OpenGL應用程序與水波和折射。我需要投射來自太陽和相機的光線,並找出它們相交的地方,或者我需要從海底開始,找出我必須去哪個方向(如果有的話),以便擊中太陽或相機。我有點卡住了,任何人都可以給我一個OpenGL光線投射或高級幾何中的速成課程的入門嗎?我不想讓海底處於恆定的深度,我不希望水波是簡單的正弦波。OpenGL水折射
回答
一件事:你想達到的效果可以用的OpenGL實現,但它不是一個功能的OpenGL 。 OpenGL本身只是一個複雜的三角形來屏幕繪製API。您獲得了一些輸入數據並編寫了一個程序,該程序使用OpenGL API根據輸入數據執行相對簡單的柵格化繪圖操作。着色器給它一些空間;您可以在片段着色器中實施光線跟蹤器。
在你的情況下,這意味着,你必須實現一些算法來生成你想要的圖片。對於水是必須的某種光線追蹤或假折射方法才能獲得看水的效果。焦散需要一個完整的特徵光子映射器,或者你基於水面的二階導數假效果很好。
有一個WebGL的演示,呈現驚人的好看,互動水:http://madebyevan.com/webgl-water/這裏是它在YouTube上http://www.youtube.com/watch?v=R0O_9bp3EKQ
視頻該演示使用真實光線追蹤(水面,球體和游泳池的光線追蹤) ,基於投影水面高度圖的二階導數,焦散是「假焦散」效應。
沒有什麼特別的OpenGL相關的。
您是否在談論caustics?這裏是another good Gamasutra article。
反射通常通過將鏡頭反射到鏡面並渲染爲紋理來實現,您可以應用畸變,然後使用它來紋理化水面。這隻適用於小波浪。
什麼你在這裏後是大量的小辦法:-)
哦,我想在OpenGL中做這件事,因爲我希望代碼是可移植的。我可以用軟件輕鬆完成,但這可能會減慢速度。 –
是的,焦散是我正在尋找的一部分。如果我之前閱讀過這篇文章,聽起來似乎是熟悉的鐘聲,但我對「審美」算法不感興趣,我想要真正的交易。 –
哎呀,是的,我已經閱讀過那篇文章,我在滾動時識別屏幕截圖。我不喜歡它,似乎是一個愚蠢的方法,結果也不是一個好例子。但是,儘管感謝分享,但遲早我必須瞭解如何做到這一點。 –
欺騙Techincally,你認爲是光波/光子反彈的表面,並通過媒介傳播的結果。對於「實打實」你必須從Sun與各射線直接追蹤光的路徑如下:
- 擊中水面
- 折射+反映,反映進入相機(*) ,折射部分更進一步
- 命中海底
- 反映
- 碰到水底下
- 反映+折射,折射部分失控的水,命中相機(*),再次反射進入海底,反射ects等
(*)其實,大多數射線會錯過相機,但這將是過於昂貴,所以這是一個騙子。
對至少三種波長 - 「紅色」,「綠色」和「藍色」進行此操作。他們每個人都會有不同的折射和反映。將三者結合起來可以得到整個畫面。
然後,您只需使用進入相機的光線創建一個紋理,並將其覆蓋在OpenGL中。
這是一個直接,簡單,計算量非常大的方法,可以近似於焦散以外的物理。第一
- 1. OpenGL半透明固體沒有折射?
- 2. GLEW和OpenGL折舊
- 3. 如何在OpenGL中實現折射表面?
- 4. Opengl折射,紋理重複在橢球物體上
- 5. Raytracer折射Bug
- 6. OpenGL射燈
- 7. 折射庫組件
- 8. OpenGL:哪些OpenGL實現不流水?
- 9. OpenGL紋理映射
- 10. OpenGL紋理映射
- 11. 創建反射Opengl
- 12. OpenGL的紋理水平
- 13. 射線追蹤 - 折射錯誤
- 14. 色差反射/折射 - 眼睛校正
- 15. 使用Three.CubeCamera的折射
- 16. OpenGL紋理映射問題
- 17. android OpenGL ES座標映射
- 18. OpenGL紋理映射錯誤
- 19. OpenGL C#球發射器
- 20. 的OpenGL紋理映射
- 21. openGL的紋理映射
- 22. 對於射線追蹤折射/反射,不應該透射率+反射率= 1?
- 23. Java的括號折射率匹配
- 24. 折射率匹配多個文件
- 25. 在CPP陣列負折射率
- 26. EF挫折映射視圖對象
- 27. 未歸一化的折射向量
- 28. html5 css3玻璃效果與折射
- 29. OpenGL座標映射到設備座標
- 30. 在OpenGL中將紋理映射到VBO
我的一個想法是首先投射一個初始射線並查看它的着陸點。然後使用相對於第一條光線的小步驟,使用衍生物來查看下一條光線將要着陸的位置。但我是OpenGL的新手,所以我不知道我可以訪問多少信息。我甚至會如何開始投射射線,我的意思是如果沒有片段我只想投射一些射線,我該如何運行片段着色器? –