我在OpenGL ES中繪製行星,並遇到一些有趣的性能問題。一般問題是:如何最好地在一個球體上渲染「非常詳細」的紋理?在OpenGL ES中繪製非常高分辨率的紋理對象(球體)
(球體保證;我感興趣的特定領域的優化)
基例:
- 窗口是約。 2048×1536(例如iPad3的)
- 紋理地圖爲地球是24000 X 12000像素(美國的一半大小適合屏幕的整個寬度的區域)
- 環球在一切顯示從放大(USA填滿屏幕) (全球可見)
- 我需要最少3個紋理圖層(1個用於行星表面,1個用於晝夜差異,1個用於用戶界面(高亮不同區域)
- 某些圖層是動畫的(即它們必須在運行時迅速加載和放下紋理)
Limitati附件:
- 高端片劑被限制爲4096×4096的紋理
- 高端片劑被限制爲8個同步紋理單元
問題:
- 總共,這是天真地500萬像素的紋理數據
- 拆分成較小的紋理效果不佳,因爲設備只有8個單元;只有一個紋理圖層,我可以分成8個紋理單元,並且所有紋理都小於4096x4096 - 但僅允許單個圖層將圖層渲染爲單獨的幾何圖形效果不佳,因爲它們需要使用基於片段的圖元進行混合,着色器
......此刻,唯一的想法,我有一個聽起來可行的是:
- 分裂球成N×M的「球塊」和渲染每一個作爲獨立的幾何
- 縮小時使用mipmap來渲染低分辨率紋理
- ...依靠簡單剔除削減了大部分放大時,並mipmap以使用小型(ER)的紋理時,他們不能被剔除
...但它似乎應該有成爲更簡單的方式/更好的選擇?
將在這裏使用球體騙子的幫助:http://stackoverflow.com/questions/10488086/drawing-a-sphere-in-opengl-es/10506172#10506172?這極大地簡化了幾何圖形,但是需要片段着色器中的查找功能將方形紋理映射到球面。它還提供了在所有縮放比例下都非常平滑的內容。 –
這不是指扔掉所有的OpenGL和編寫軟件光線跟蹤庫嗎?你說「一個球體從各個角度看起來都差不多」,但實際上它看起來與每個角度都有獨特的不同 - 這是紋理貼圖! – Adam
從任何方向看,無紋理的球看起來都是相同的,這就是讓你擺脫幾何形狀並計算一組每像素法線,高度等的方法。對於紋理來說,球體在給定幀中的旋轉與像素位置可以被饋送到片段着色器中的每像素紋理映射函數中。你會注意到,我的答案中的所有上述內容都是在OpenGL ES中完成的,所以除了幾何圖形生成外,你什麼也不扔掉。我之前用這種方式做了這個紋理化的工作,它運行良好。 –