簡體   English   中英

自定義混合模式

[英]Custom blend mode

我並沒有真正獲得glBlendFunc()函數及其工作原理。

是否有一種混合模式可以讓目標黑色變為黑色,同時覆蓋其他任何DST顏色?

我有一個黑白畫布,其中包含着色的邊緣和形狀。 我想在畫布上的任何地方繪制畫筆,但不要覆蓋邊緣,因此一旦圖像完全着色,它們就會保持黑色。 理想情況下,由於目標的邊緣周圍有一些灰色以保持平滑,因此灰色陰影將帶有畫筆顏色。

謝謝!

我相信您需要的是glBlendFunc(GL_DST_COLOR, GL_ZERO)

為您解釋混合功能的工作原理:混合時,您有兩種顏色,即源和目標。 來源是您嘗試應用的顏色(文本顏色,純色...)。 目標是緩沖區上當前的顏色。 glBlendFunc的2個參數說明在將源色和目標色相加在一起以得到結果色之前如何對其進行乘法。

因此,在glBlendFunc(GL_DST_COLOR, GL_ZERO)的情況下,具有黑白目標緩沖區(如您所述)的行為如下:

  • 如果目標顏色是白色(1,1,1,1),並且您將應用某種顏色,例如(.1,.2,.3、1),則結果將是R = (.1, .2, .3, 1)*(1,1,1,1) + (1,1,1,1)*(0,0,0,0) = (.1, .2, .3, 1)
  • 如果目標顏色為黑色(0,0,0,0),並且您將應用某種顏色,例如(.1,.2,.3、1),則結果將為R = (.1, .2, .3, 1)*(0,0,0,0) + (0,0,0,0)*(0,0,0,0) = (0, 0, 0, 0)
  • 如果目標顏色為灰色(.5,.5,.5,1.0),並且您將應用某些顏色(例如..,。2,.3、1),則結果將為R = (.1, .2, .3, 1)*(.5,.5,.5,1.0) + (.5,.5,.5,1.0)*(0,0,0,0) = (.05, .1, .15, 1)

這種情況有些特殊,但在大多數情況下,僅使用Alpha通道。 例如,最常見的混合是glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ,這意味着源顏色將與源阿爾法相乘,而目標顏色將與1.0源阿爾法相乘,因此白色形狀在灰色背景RGB上的alpha值為.75 .5(任何alpha)將導致RGB全部為1.0*.75 + .5*(1.0-.75) = .75 + .125 = .875

請注意,如果您需要在疊加層上使用其他混合類型,則此過程可能會花費您一些時間。 在這種情況下,您將需要查看模板緩沖區。 另一個問題是,您可能不想在未繪制疊加層的地方看到黑色和白色部分。 在這種情況下,您可以簡單地使用目標alpha進行混合: glColorMask可以幫助您僅繪制緩沖區的alpha通道,在其中可以將alpha .0用於“黑色”區域,將1.0用於“白色”區域,在緩沖區上繪制形狀時,可以使用glBlendFunc(GL_DST_ALPHA, GL_ZERO)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM