OpenGL中的多重取樣

2021-07-03 23:54:01 字數 1984 閱讀 5493

抗鋸齒處理的最大優點之一就是它能夠使多邊形的邊緣更為平滑,使渲染效果顯得更為逼真和自然。點和直線的抗鋸齒處理是得到廣泛支援的,但遺憾的是,對多邊形的平滑處理並沒有在所有平台上都得到實現。並且,即使在可以使用gl_polygon_smooth的時候,對整個場景進行抗鋸齒處理也沒有想象中的那麼方便。這是因為,抗鋸齒處理是基於混合操作的,這就需要從前到後對所有的圖元進行排序,這是十分麻煩的。

在opengl中還有乙個功能,稱為多重取樣(multisampling),可以用來解決抗鋸齒處理中的這個問題。支援多重取樣的opengl

實現中,在已經包含了顏色、深度、模板值的幀緩衝區中還會新增乙個額外的緩衝區,所有的圖元在每個畫素上都進行多次取樣,其結果就儲存在這個新增的緩衝區中。每次當畫素進行更新時,就會針對這些取樣值進行解析,以產生乙個單獨的值。這個處理屬於是在「幕後發生的事情」,它會帶來額外的記憶體和處理器開銷,會對效能造成一定的影響。因此,有些opengl實現可能並不支援多渲染環境中的多重取樣處理。

為了進行多重取樣,首先必須獲得乙個支援多重取樣幀緩衝區的渲染環境,這在不同的平台中獲取方法可能各不相同。glut提供了乙個位段(glut_multisample),允許請求這種幀緩衝區。例如,為了請求乙個多重取樣、完全顏色、帶深度的雙緩衝幀緩衝區,可以呼叫:

glutinitdisplaymode(glut_double | glut_rgb | glut_depth | glut_multisample);

然後,我們可以使用glenable/gldisable組合來開啟或關閉多重取樣:

// 開啟多重取樣

glenable(gl_multisample); 

// 關閉多重取樣

gldisable(gl_multisample);

關於多重取樣還需要特別注意的乙個地方是當它被啟用時,點、直線和多邊形的平滑特性都將被忽略(如果開啟了的話)。這意味著在使用多重取樣時,就不能同時使用點、直線和多邊形的平滑處理了。但是在有些情況下,點和直線如果採用平滑處理可能會比使用多重取樣得到的效果更好。因此,當我們繪製點和直線時,可以關閉多重取樣,在繪製其它實心幾何圖形時再開啟多重取樣。**如下所示:

// 關閉多重取樣

gldisable(gl_multisample);

// 開啟頂點的平滑處理

glenable(gl_point_smooth);

// 繪製一些平滑的點

// ... 

// 關閉頂點的平滑處理

gldisable(gl_point_smooth);

// 開啟多重取樣

glenable(gl_multisample);

注意,如果沒有多重取樣緩衝區,opengl就會把gl_multisample當做是被禁用的。

多重取樣緩衝區在預設情況下使用片段的rgb值,並不包括顏色的alpha成分。我們可以通過呼叫glenable方法配合下面的引數來修改這個行為:

gl_sample_alpha_to_coverage     使用alpha值

gl_sample_alpha_to_one     把alpha值設為1,並使用它

gl_sample_coverage     使用glsamplecoverage函式所設定的值

當啟用了gl_sample_coverage時,glsamplecoverage函式允許指定乙個特定的值,它是與片斷覆蓋值進行位與(and)操作的結果。

void glsamplecoverage(glclampf value, glboolean invert);

這種對多重取樣的優化並不是嚴格由opengl規範所規定的,其確切的結果可能因不同的opengl實現而異。

opengl中的狀態排序

開啟或關閉不同的opengl特性將會修改驅動程式的內部狀態,這種狀態的改變可能會對渲染的效能造成影響。所以,對效能非常敏感的程式設計師常常會不辭辛苦地對所有的繪圖命令進行排序,使需要相同狀態的幾何圖形在一起進行繪製。這種狀態排序的手段是遊戲程式設計師非常常用的提高渲染速度的方法之一。

未完待續...

OpenGL多重取樣的初始化問題

首先,opengl中多邊形反走樣需要開啟多重取樣才能正常的反走樣,否則設定無效 以下 只需在視窗尺寸發生變化時,執行一次即可 glenable gl point smooth glhint gl point smooth hint,gl nicest glenable gl line smooth ...

機器學習中的 上取樣 下取樣 過取樣 欠取樣

這是兩種解決分類訓練過程中資料量不平衡的取樣方法 拿二分類舉例,期望陽性樣本數量 陰性樣本數量 1 1,但實際上陽性樣本數量 陰性樣本數量 1000 100 將100資料複製10份,達到兩個樣本數量之比為1000 1000 將1000資料隨機抽取100份,達到兩個樣本數量之比為100 100 卷積神...

Direct3D 多重取樣抗鋸齒

多重取樣抗鋸齒 multisampling atialiasing 針對光柵化顯示器抗鋸齒的方法有多種,在d3d中採用的多重取樣方法。即在每個畫素點內部,設定多個取樣點,繪製多邊形邊緣時,針對每個取樣點判斷是否被多邊形覆蓋,最終的顏色值從取樣點中取均值,以對多邊形的邊緣進行 模糊化 從而減輕鋸齒效果...