[英]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漸變。
這是我建議的偽代碼:
glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_TRUE);
鎖定顏色通道glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_TRUE);
glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
顏色通道glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
glBlend(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA)
這應該給你留下一個黑色紋理,混合漸變到它下面的任何東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.