簡體   English   中英

使用混合創建由黑色包圍的多個透明區域

[英]Using blending to create multiple areas of transparency surrounded by black

我一直在openGL中玩一下,我想知道如何拍攝一張圖片(例如黑色背景),然后在頂部渲染一個較小的白色漸變,但讓白色漸變透明(而不是白色)並從黑色背景中刪除。 在中心留下透明漸變的黑色背景。 如果有幫助,我正在使用LWJGL。

有沒有辦法混合這樣做?

編輯:好的,有沒有辦法減去兩張圖像,我在圖像周圍繪制黑色? 所以我有我的白色漸變,將其改為透明,然后在周圍繪制黑色?

固定功能通常使用現代GL驅動程序中的着色器實現(有舊的ATI演示文稿,SM2.0 +着色器用於所有固定功能)。

像這樣的接近平凡的混合片段着色器

in vec2 TexCoord;

uniform sampler2D Texture0;
uniform sampler2D Texture1;

out vec4 out_FragColor;

void main()
{
     vec4 Color = texture(Texture0, TexCoord);

     /// The mask contains (R,G,B,A) - image + transparency
     /// for both the mask and the source
     vec4 Mask  = texture(Texture1, TexCoord);

     /// Mask is also significant as a color source, not only the alpha
     out_FragColor = Color * ( 1.0 - Mask.a ) + Mask * Mask.a;

     /// Thanks to Tim's comment, the last line can be done simpler:
     /* out_FragColor = mix(Color, Mask, Mask.a); */
}

應該按照你想要的方式混合圖像。

這對於現代硬件來說並不過分,即使與GL ES 2.0硬件也完全兼容。

編輯:

來自我的一個項目的圖像(用於創建漸弱反射的簡單蒙版)。

我們使用這個面具

陰影面具

並獲得此圖像的最終結果: 圖庫

在特定情況下可能實現您想要的效果,但一般來說,一旦“繪制黑色背景”,之后就無法使其變得透明。 您無法刪除或刪除已繪制的像素。

如果您可以在黑色背景之前繪制漸變,則可以將alpha存入幀緩沖區,然后在繪制黑色背景時對目標alpha進行采樣。 你需要有一個真正的alpha紋理,因為在繪制時你無法真正將白色漸變轉換為alpha漸變。

這是我建議的偽代碼:

  1. 在背景中繪制你想要的任何東西
  2. 用alpha漸變創建紋理
  3. 使用glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_TRUE);鎖定顏色通道glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_TRUE);
  4. 在背景上繪制alpha漸變
  5. 使用glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);顏色通道glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
  6. 使用以下混合選項繪制'黑色紋理': glBlend(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA)

這應該給你留下一個黑色紋理,混合漸變到它下面的任何東西。

暫無
暫無

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

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