Learn OpenGL Anti Aliasing
阿新 • • 發佈:2021-01-24
超取樣抗鋸齒(Super Sample Anti-aliasing, SSAA):使用比正常解析度更高的解析度(即超取樣)來渲染場景,當影象輸出在幀緩衝中更新時,解析度會被下采樣(Downsample)至正常的解析度。這些額外的解析度會被用來防止鋸齒邊緣的產生。雖然它確實能夠解決走樣的問題,但是由於這樣比平時要繪製更多的片段,它也會帶來很大的效能開銷。所以這項技術只擁有了短暫的輝煌。
光柵化時,判斷畫素中心點是否位於要繪製的三角形內。
多重取樣抗鋸齒(Multisample Anti-aliasing, MSAA):多重取樣所做的正是將單一的取樣點變為多個取樣點(這也是它名稱的由來)。我們不再使用畫素中心的單一取樣點,取而代之的是以特定圖案排列的4個子取樣點(Subsample)。我們將用這些子取樣點來決定畫素的遮蓋度。當然,這也意味著顏色緩衝的大小會隨著子取樣點的增加而增加。
多重取樣緩衝:如果我們想要在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個子樣本