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