CAL樣例程序里面出現(xiàn)很多sample指令,google到的簡單介紹:
Antialias
(抗鋸齒)
雖然減小像素的大小可以使圖像可以更加精細(xì),一定程度上減輕了鋸齒,但是只要像素的大小大到可以互相彼此區(qū)分,那么鋸齒的產(chǎn)生是不可避免的!抗鋸齒的方法一般是多點(diǎn)(注意此處是“點(diǎn)”而不是“像素”,后面可以看出它們間的區(qū)別)采樣。
一、???????
理論與方法:
1
.
Oversampling
(重復(fù)取樣):
(
1
)方法:
首先,將場景以比你的顯示器(前緩沖)更高分辨率進(jìn)行渲染:
假設(shè)當(dāng)前的(前
/
后緩沖)的分辨率是
800
×
600
,那么可以先將場景渲染到
1600
×
1200
的渲染目標(biāo)上(紋理);
然后,從高分辨率的渲染目標(biāo)得到低分辨率的場景渲染結(jié)果:
?????
此時(shí)取每
2
×
2
個(gè)像素塊顏色的平均值為最終渲染的像素顏色值。
(
2
)優(yōu)點(diǎn):可以顯著地改善鋸齒導(dǎo)致的失真。
(
3
)缺點(diǎn):需要更大的緩沖,同時(shí)填充緩沖導(dǎo)致性能消耗變大;
??????????
進(jìn)行多個(gè)像素的取樣,導(dǎo)致性能下降;
??????????
由于以上缺點(diǎn),
D3D
并沒有采用這種抗鋸齒方法。
2
.
Multisampling
(多取樣):
(
1
)方法:
只需要對像素進(jìn)行一次取樣,而是在每個(gè)像素中取
N
個(gè)點(diǎn)(取決于具體的取樣模型),該像素的最終顏色
=
該像素原先的顏色
*
多邊形覆蓋的點(diǎn)數(shù)
/
總的取樣點(diǎn)數(shù);
(
2
)優(yōu)點(diǎn):可以改善鋸齒帶來的失真的同時(shí)而不會增加取樣次數(shù),同時(shí)比起
Oversampling
它也不需要更大的后備緩沖。
(
3
)缺點(diǎn):原本當(dāng)一個(gè)多邊形覆蓋了一個(gè)像素的中心點(diǎn)時(shí),該像素的顏色才會由該多邊形決定(在像素管線階段典型的就是尋址到合適的紋理顏色與頂點(diǎn)管線輸出的顏色進(jìn)行調(diào)制),但是
Multisampling
中,如果該多邊形覆蓋了其中一部分取樣點(diǎn)卻未覆蓋像素中心點(diǎn),該像素顏色仍然由此多邊形決定。如此一來,紋理尋址可能出現(xiàn)錯(cuò)誤,這對于紋理集(
atlas
)會出現(xiàn)另一種失真效果:多邊形邊緣顏色錯(cuò)誤!
3
.
Centriod Sampling
(質(zhì)心采樣):
(
1
)方法:
????
為了解決在使用
Multisampling
導(dǎo)致的在紋理集中進(jìn)行紋理尋址帶來的錯(cuò)誤,不再采用像素中心的顏色作為“該像素原先的顏色”,而是用“該像素中被多邊形覆蓋的那些取樣點(diǎn)的中心點(diǎn)的顏色”。這樣就保證了被渲染的像素點(diǎn)始終是多邊形的內(nèi)部(也就是說紋理地址不會超出多邊形的范圍)。
(
2
)如何使用:
????????
①任何有COLOR語義作為輸入的Pixel Shader會自動運(yùn)用質(zhì)心采樣;
???? ②在Pixel Shader的輸入?yún)?shù)的語義后中手動加入 _centroid 擴(kuò)展,例如:
?? float4 ?TexturePointCentroidPS( float4 TexCoord : TEXCOORD0_centroid ) : COLOR0
{
? return tex2D( PointSampler, TexCoord );
}
( 3 )注意:
??? 質(zhì)心采樣主要用于采用紋理集的 Multisampling ,對于一整張紋理對應(yīng)一個(gè)的多邊形網(wǎng)格的情況,采用質(zhì)心采樣反而會導(dǎo)致錯(cuò)誤!