我在渲染我的太陽系時遇到了一些問題。OpenGL渲染不同的對象
我有小物體和一個大物體,它位於比小物體大10e9倍的距離。我如何渲染所有這些? (我想看看太陽,當我圍繞我的小物體時)
glm::perspective(m_fInitialFoV, 4.0f/3.0f, near, far);
如果far/near大,所有對象都閃爍。
我在渲染我的太陽系時遇到了一些問題。OpenGL渲染不同的對象
我有小物體和一個大物體,它位於比小物體大10e9倍的距離。我如何渲染所有這些? (我想看看太陽,當我圍繞我的小物體時)
glm::perspective(m_fInitialFoV, 4.0f/3.0f, near, far);
如果far/near大,所有對象都閃爍。
最好的辦法是按比例分組對象並分別渲染它們。例如,太陽系可以使用地球的尺度,即半徑爲6378.1 km
,而距離太陽的尺度爲147.09x10^6 km
。
正火這些圍繞地球的半徑,我們得到:
Earth's Radius: 1.0 unit
Distance from sun: 23061.72 units
正常化的原則同樣適用於其他太陽系天體:
Venus' Radius: 0.9488405638 units
Distance from sun: 16851.41 units
Pluto's Radius: 0.186105580 units
Distance from sun: 695633.4 units
你也應該設置你的深度合併這樣的數字。只要身體之間有很大的空間,就不會出現錯誤和z戰鬥。 所以:
正如您所看到的,您可以根據比例和多個層次對場景進行分組。例如,您可以獲取本地恆星組的座標列表,首先將它們渲染爲點,清除深度,然後呈現您所在系統的主體,再次清除深度,並將本地對象渲染爲你的職位。你還應該考慮,像冥王星這樣的行星在地球上幾乎看不到,所以你可以簡單地使用更小的深度範圍進行繪圖。
比多遍渲染更簡單的解決方案是使用對數深度緩衝區。以某種精度爲代價,您可以按指數規模擴展可用深度範圍。在此處查看更多信息:http://outerra.blogspot.com/2009/08/logarithmic-z-buffer.html
您不能在圖形計算中使用天文距離;沒有足夠的精度來處理它們。 –
爲了完善@ColonelThirtyTwo:寫道:當進行天文渲染時,它通常歸結爲假定所有對象都處於無限遠處並且只關心角度方向。 – datenwolf
如果下一個選項是可能的?: 如果主體太遠,傳輸和縮放對象在相機對象的半徑矢量上的方式是可見的。如果攝像機移動,投影也會移動。 – TuringMachine