2013-10-24 42 views
-1

我有一個包含23百萬條記錄的表格,其格式如下{atomName,x,y,z,transparent}。對於解決方案,我決定使用OpenGL。我需要諮詢如何提高圖形

我的任務來渲染它。在第一次迭代中,我使用了塊「glBegin/glEnd」,並繪製了每個原子點的顏色。此解決方案工作。但是我得到了0.002 fps。

然後我嘗試使用VBO。我形成了三個緩衝區:頂點,顏色和索引。此解決方案工作。我有60 fps,但我不舒服綁定緩衝區,我正在繪製點,而不是球體。

然後我讀了關於VAO,它可以簡化綁定緩衝區。好的,它工作。我有舒適的約束力。

現在我想繪製球體,而不是點。我認爲,相對於可能構建球體的頂點集合中的每個點形成(具有一定準確性)。但是如果我有2300萬個頂點,我必須計算出12個或更多個頂點與每個點相關。 23 000 000 * 4(float)= 1 Gb的數據,也許這不是一個好的解決方案。

我應該做的最好的下一步行動是什麼?我不能完全理解,在這個任務中適用的着色器或以其他方式存在。

+0

我覺得紋理點精靈可能工作,因爲你的球體從每個視角都是相同的。 –

+0

你是說我應該在每個點(x,y,z)輸出球體的精靈? – ObiSan

+1

紋理點精靈基本上是具有紋理的點。所以它可能(可能)是你已經做了,但你在它之上拍了紋理。這會讓你的原子看起來更加球形。看看這裏http://www.informit.com/articles/article.aspx?p=770639&seqNum=7。或者只是谷歌「紋理點精靈」來得到我的意思。 –

回答

1

關於您的拉絲工藝

我的任務來呈現它。在第一次迭代中,我使用了塊「glBegin/glEnd」,並繪製了每個原子點的顏色。此解決方案工作。但是我得到了0.002 fps。

想一想:對於您的2300萬條記錄中的每條記錄,您至少會直接調用一個函數(glVertex),並且可能會隱式地調用幾個函數調用。更糟糕的是,glVertex可能導致上下文切換。這意味着什麼,你的CPU爲它必須處理的每個頂點命中幾個減速塊。目前,一流的CPU具有約3GHz的時鐘頻率和10條指令的流水線長度。當你做一個上下文切換時,流水線會停滯,最糟糕的情況是,它需要一條流水線來實際處理一條指令。讓我們考慮你必須執行至少1000條指令來處理單個glVertex調用(實際上這是一個相當樂觀的估計)。僅此而已,意味着你每秒處理最多300萬個頂點。所以在2300萬個頂點已經少於一個FPS。

但是你也在那裏得到了上下文切換,這增加了更多的負擔。可能還有很多分支會導致進一步的管線沖刷。

這就是glVertex調用。你在那裏也有顏色。

而你想知道即時模式很慢嗎?

當然很慢。使用立即模式已經超過15年。 Vertex Arrays自OpenGL-1.1開始提供。

此解決方案工作。我有60 fps,

是的,因爲所有的數據現在駐留在GPU自己的內存中。 GPU是大規模並行和優化的,可以處理這類數據並執行它們的操作。

,但我有不舒服的結合緩衝

好了,OpenGL是不是一個高水平的場景圖形庫。這是一箇中低級繪圖API。您可以像使用複雜的鉛筆一樣在數字畫布上繪畫。

然後我讀到VAO

好,VAOs是爲了凝聚屬於一個整體,因此使用它們是有道理的緩衝區對象。

現在我想繪製球體,而不是點。

你有兩個選擇:

  • 使用點精靈紋理。這意味着您的點將在繪製時得到區域,並且該區域會應用紋理。我認爲這對你來說是最好的方法。給定正確的着色器,你甚至可以給你的點精靈正確的深度值,這樣你的「球體」實際上就像深度緩衝區中的球體相交。

  • 另一種選擇是使用實例化一個球體幾何體,使用原子記錄作爲實例化過程的控制數據。這會處理真實的球體幾何。不過,我擔心目前實施一個實例化繪圖過程對於您的技能水平來說可能有些過於先進。

關於畫23萬點

認真你們有什麼樣的顯示器,我們可以繪製2300萬區分點?你的典型電腦屏幕將有大約2000×1500點。您現在可以購買的最高分辨率顯示屏具有約4k×2.5k像素,即1000萬個像素。假設您的原子均勻地分佈在一個平面上:以2300萬個原子繪製每個像素將會多次透支。你根本無法以這種方式顯示2300萬個獨立原子。另一種看待這種情況的方式是,顯示器的像素網格意味着空間採樣,並且不能再現小於平均採樣距離兩倍的任何事物(採樣定理)。

因此,只繪製一部分數據,即實際上可見的子集是絕對有意義的。此外,如果你放大很遠(即你有完整的數據集),那麼合併原子就很有意義。

將數據排序爲空間細分結構確實很有意義。在你的情況下,我認爲八叉樹是一個不錯的選擇。