2017-03-27 120 views
1

我正在編寫一個現代的OpenGL應用程序,以可視化化學和凝聚態物理的3d原子模型(分子,週期系統...)。 我在幾年前開始工作,我的程序的第一個版本是在舊的OpenGL中,現在我正在將它更新到現代的OpenGL。OpenGL渲染質量與頂點數

我有一個關於OpenGL窗口渲染質量的問題。在以下示例中,我使用實例化繪圖繪製3D柱面和3D球體,在此模型中繪製的結合只繪製一個柱面,然後在頂點着色器 中正確地平移/縮放/旋轉以呈現所有鍵,同樣適用於呈現原子的球體。正如你所看到的,它的工作很好,而且這種方法的效率非常好,我可以順利地用數十萬個原子渲染模型。

但是我注意到一些奇怪的東西,不知怎的,渲染的質量似乎取決於場景中頂點(物體,原子和鍵)的數量,顯然三角形的數量是最重要的參數,但不是隻有一個......因爲質量在渲染很多頂點時下降......請參閱附加的快照:

要渲染場景中的球體,我使用50x50頂點和2x50作爲柱面(GL_TRIANGLE_STRIP in兩種情況)

1)在該測試模型中,我加載:96個原子,512個半鍵,:〜291200個頂點:

Initial model box

2)I放大專注於一個所選擇的原子,它的周邊,在該標度的結果是無懈可擊:

Zoom in initial model box

3)I重置視圖,並使用在構建器我的程序增加了箱子的數量 (我簡單地做了3個方向的複製空間)在這裏我選擇做20x20x20副本, 看到結果波紋管,原來的方框是高亮的。 在這場戲中有768000個原子,4096000半債券,因此:291200x20x20x20 = 2329600000個頂點 相當多,但它的工作原理,但似乎很奇怪...

New model: 20 x 20 x 20 boxes

4)我放大再次對我前採摘和存在在特定領域質量 其中3D對象(球體/圓柱體)疊加/重疊的減少模型的特定區域...

Zoom in the 20 x 20 x 20 boxes model

有人可以向我解釋我所看到的嗎?

注意1:在同一個窗口中,我可以將複製品數量減少回原始框,再次縮小 並查看結果無可挑剔。注意2:我的程序的舊版本仍然正常工作(舊的OpenGL,使用glutsphere和glutcylinders的顯示列表), 我可以做同樣的事情,渲染將花費更長的時間,但在當我放大20x20x20 盒子模型時,結果仍然很完美,就像單箱模型一樣,顯然我使用相同的圖形卡,驅動程序等。

回答

3

有人可以向我解釋我看到了什麼嗎?

您看到深度緩衝區的精度有限。只有很多位可以使用,並且在透視投影中應用了從Z距離到深度緩衝區值的垂直線性比例縮放。

最佳做法是將透視投影矩陣的近/深度範圍限制在屏幕上實際可見的範圍內,以便更好地使用深度緩衝區。也可以對深度緩衝區進行線性化處理(但會帶來性能問題)。您也可以嘗試乾淨地交叉粘貼和球體相交的幾何體,即將球體的頂點約束到圓柱體表面,在這些圓柱體表面處粘貼並類似地將粘貼的末端頂點約束到它們相遇的球體。這樣你避免重疊,因此這些文物。

+0

感謝您的確切答案,我只希望我能夠清楚地理解它的寫法,現在我知道發生了什麼,而不是如何糾正/改進它。我會專注於你的第一句話,並且「試圖限制近距離/深度範圍......」剩下的事情似乎對我來說太多了。你的觀點是正確的,我只是將投影改爲正字法和閃爍消失,你能通過任何改變指向教育資源,以更好地理解這一點並糾正它嗎? ...再次感謝 –

+0

@SébastienLeRoux:在http://dev.theomader.com/depth-precision/上提供了關於投影/渲染管線設置的一個非常好的解釋以及幾種緩解策略(也請查閱以前的章節之後)。一般來說,您應該儘可能將遠平面儘可能靠近視點和近平面。對於你所做的事情來說,確定模型的(軸對齊的)邊界框(每個球體座標的最小/最大值 -/+球體半徑)並且使用變換后角落的最小/最大距離是非常好的。 – datenwolf

+0

@SébastienLeRoux:同樣如果你想要Google,搜索條件是「深度精度」,「雙曲線深度」和「線性深度」。 – datenwolf