將每個像素點划分為更細的子采樣點,根據子采樣點的覆蓋率最終計算出像素的顏色
SSAA:首先判斷子采樣點是否在三角形內部,同時對每個子采樣點維護一個深度值和顏色值(深度值初始化為無窮大,顏色值初始化為{0,0,0}),對每個像素通過覆蓋測試和遮擋測試的每個子采樣點都要經過一次着色計算,並且存入顏色緩沖區,得到了每個采樣點的顏色之后,我們將每個像素點內部所細分的采樣點的顏色值全部加起來再求均值,作為該像素點的抗走樣之后的顏色
偽代碼如下:
for(x in bounding box)
{
for(y in bounding box)
{
for (int j = 0; j < n; j++)
{
index=getindex(x,y)+j;(子采樣點索引值擴大四倍)
if(子采樣點在三角形內部)
{插值得到當前子采樣點深度值zp;}
if(zp<深度緩沖區的深度值)
{
插值得到每個子采樣點所需的屬性;
對每個子采樣點做一次着色運算
更新子采樣點深度緩沖區的深度值;
將子采樣點的顏色存入顏色緩沖區;
}
}
像素點顏色+=所有子采樣點顏色/n
}
}
}
MSAA:
MSAA的真正工作方式是,每個像素只運行一次片段着色器,無論多少子樣本被三角形所覆蓋。片段着色器運行着插值到像素中心的頂點數據,最后顏色被儲存近每個被覆蓋的子樣本中,每個像素的所有顏色接着將平均化,每個像素最終有了一個唯一顏色。在前面的圖片中4個樣本中只有2個被覆蓋,像素的顏色將以三角形的顏色進行平均化,顏色同時也被儲存到其他2個采樣點,最后生成的是一種淺藍色。
注意:MSAA在實際操作的時候,同樣會維護所有子采樣點的color buffer和depth buffer,每次對pixel中心計算shading的時候(對pixel中心計算shading的時候一樣要判斷子采樣點是否在三角形內部,維護中心深度值),會根據depth值(因為可能不止一個三角形擁有這個像素)和三角形覆蓋關系判斷是否把顏色值寫入。
偽代碼如下:
for(x in bounding box)
{
for(y in bounding box)
{
for (int j = 0; j < n; j++)
{
index=getindex(x,y)+j;(子采樣點索引值擴大四倍)
if(子采樣點在三角形內部)
{
插值得到當前像素中心深度值z_interpolated;
{
if(z_interpolated<深度緩沖區像素中心點的深度值)
{更新深度緩沖區的深度值;
計算像素中心顏色;
將像素中心顏色存入顏色緩沖區
}
}
}
for (int j = 0; j < n; j++)
{
index=getindex(x,y)+j;(子采樣點索引值擴大四倍)
插值得到當前子采樣點深度值zp;
if(子采樣點在三角形內部)
{
if(zp<深度緩沖區的深度值)
{
更新深度緩沖區的深度值;
復制像素中心顏色到子采樣點顏色緩沖區;
}
}
像素點最終顏色+=所有子采樣點顏色/n
}
}
}
參考鏈接:
https://blog.csdn.net/qq_38065509/article/details/105598277