1. 程式人生 > 其它 >Learn OpenGL Anti Aliasing

Learn OpenGL Anti Aliasing

技術標籤:計算機圖形學opengl

超取樣抗鋸齒(Super Sample Anti-aliasing, SSAA):使用比正常解析度更高的解析度(即超取樣)來渲染場景,當影象輸出在幀緩衝中更新時,解析度會被下采樣(Downsample)至正常的解析度。這些額外的解析度會被用來防止鋸齒邊緣的產生。雖然它確實能夠解決走樣的問題,但是由於這樣比平時要繪製更多的片段,它也會帶來很大的效能開銷。所以這項技術只擁有了短暫的輝煌。

光柵化時,判斷畫素中心點是否位於要繪製的三角形內。

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

多重取樣抗鋸齒(Multisample Anti-aliasing, MSAA):多重取樣所做的正是將單一的取樣點變為多個取樣點(這也是它名稱的由來)。我們不再使用畫素中心的單一取樣點,取而代之的是以特定圖案排列的4個子取樣點(Subsample)。我們將用這些子取樣點來決定畫素的遮蓋度。當然,這也意味著顏色緩衝的大小會隨著子取樣點的增加而增加。

MSAA真正的工作方式是,無論三角形遮蓋了多少個子取樣點,(每個圖元中)每個畫素只執行一次片段著色器。片段著色器所使用的頂點資料會插值到每個畫素的中心,所得到的結果顏色會被儲存在每個被遮蓋住的子取樣點中。當顏色緩衝的子樣本被圖元的所有顏色填滿時,所有的這些顏色將會在每個畫素內部平均化。因為上圖的4個取樣點中只有2個被遮蓋住了,這個畫素的顏色將會是三角形顏色與其他兩個取樣點的顏色(在這裡是無色)的平均值,最終形成一種淡藍色。

多重取樣緩衝:如果我們想要在OpenGL中使用MSAA,我們必須要使用一個能在每個畫素中儲存大於1個顏色值的顏色緩衝(因為多重取樣需要我們為每個取樣點都儲存一個顏色)。所以,我們需要一個新的緩衝型別,來儲存特定數量的多重取樣樣本,它叫做多重取樣緩衝(Multisample Buffer)。

glfwWindowHint(GLFW_SAMPLES, 4);
glEnable(GL_MULTISAMPLE);

離屏MSAA
使用自己建立的幀緩衝進行離屏MSAA
多重取樣紋理附件
多重取樣渲染緩衝物件

unsigned int msaaFBO;
glGenFramebuffers(1, &msaaFBO);
glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);

unsigned int tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex)
; glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGB, width, height, GL_TRUE); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, tex, 0); glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, width, height); glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO); glBindFramebuffer(GL_READ_FRAMEBUFFER, multisampledFBO); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST);

自定義抗鋸齒演算法
將一個多重取樣的紋理影象不進行還原直接傳入著色器也是可行的。GLSL提供了這樣的選項,讓我們能夠對紋理影象的每個子樣本進行取樣,所以我們可以建立我們自己的抗鋸齒演算法。在大型的圖形應用中通常都會這麼做。

//要想獲取每個子樣本的顏色值,你需要將紋理uniform取樣器設定為sampler2DMS,而不是平常使用的sampler2D
uniform sampler2DMS screenTextureMS;
//使用texelFetch函式就能夠獲取每個子樣本的顏色值了
vec4 colorSample = texelFetch(screenTextureMS, TexCoords, 3);  // 第4個子樣本