文章目錄
- 前言
- 正文
- 為什么要有顏色混合?
- 顏色混合常見實現方式?
- 上述顏色混合注意點
- 結尾:喜歡的小伙伴點點關注+贊哦!
前言
本章節補充一下顏色混合的內容,主要包含:為什么要有顏色混合?顏色混合常實現方式?
正文
為什么要有顏色混合?
當需要渲染透明或半透明物體時,需要引入顏色混合,同時它也是顏色RGBA的alpha的體現!
顏色混合常見實現方式?
每個像素的顏色由RGBA構成,其中第四分量我們通常叫做alpha,也叫做透明度,一般取值范圍 [ 0 , 1 ] [0,1] [0,1]? 。
接下來舉個最簡單的顏色混合表達形式:
已知屏幕中 ( x , y ) (x,y) (x,y) 位置處的像素顏色RGB分量為 d s t C o l o r ? \vec {dstColor} dstColor ,它的透明度為 d s t A l p h a dstAlpha dstAlpha ,當我們需要在此位置渲染的像素顏色為 s r c C o l o r ? \vec {srcColor} srcColor,透明度為 s r c A l p h a srcAlpha srcAlpha ,則通過一下公式計算出最終顏色:
b l e n d C o l o r = s r c A l p h a ? s r c C o l o r ? + ( 1 ? s r c A l p h a ) ? d s t C o l o r ? blendColor = srcAlpha * \vec {srcColor} + (1-srcAlpha) * \vec {dstColor} blendColor=srcAlpha?srcColor+(1?srcAlpha)?dstColor
此時我們用待渲染像素顏色的alpha值直接表明顏色權重,我們簡單舉個例子:
? 當繪制不透明物體時, s r c A l p h a = 1 srcAlpha = 1 srcAlpha=1,此時原本屏幕的像素顏色就相當于被忽略了;
? 當繪制全透明物體時, s r c A l p h a = 0 srcAlpha = 0 srcAlpha=0?,此時相當于沒有畫此像素;
? 當繪制透明物體時, s r c A l p h a = ( 0 , 1 ) srcAlpha = (0,1) srcAlpha=(0,1),此時相當于將底色和目標色進行線性插值,從而得到一種混合的效果;
當然了,這些公式都可以發散,例如寫成如下:
b l e n d C o l o r = ( 1 ? s r c A l p h a ) ? s r c C o l o r ? + s r c A l p h a ? d s t C o l o r ? blendColor = (1 - srcAlpha) * \vec {srcColor} + srcAlpha * \vec {dstColor} blendColor=(1?srcAlpha)?srcColor+srcAlpha?dstColor
根據具體的需要決定!
上述顏色混合注意點
上述的實現方式,屬于最簡單的方式。細心的朋友很容易想到,某個像素的繪制受到底色的制約。也就是說,假如需要繪制透明物體,必須將不透明物體先繪制上去,然后才能達到混合的效果,所以咱們需要注意混合的繪制次序,如下:
- 先繪制不透明物體,保證底色正確
- 有遠及近繪制半透明物體,保證近距離透明物體不會遮擋遠距離透明物體(按攝像機距離排序)
效果圖:
結尾:喜歡的小伙伴點點關注+贊哦!
你們的點贊就是我創作的最大動力!希望對各位小伙伴能夠有所幫助哦,永遠在學習的道路上伴你而行, 我是航火火,火一般的男人!