使用混合创建由黑色包围的多个透明区域

时间:2012-06-24 22:26:26

标签: java opengl lwjgl

我一直在openGL中玩一下,我想知道如何拍摄一张图片(例如黑色背景),然后在顶部渲染一个较小的白色渐变,但让白色渐变透明(而不是白色)并从黑色背景中删除。在中心留下透明渐变的黑色背景。如果有帮助,我正在使用LWJGL。

有没有办法用混合来做到这一点?

编辑:好的,有没有办法取代两张图片,我在图像周围绘制黑色?所以我有我的白色渐变,将其改为透明,然后在周围绘制黑色?

2 个答案:

答案 0 :(得分:2)

固定功能通常使用现代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硬件也能100%兼容。

编辑:

我的一个项目中的图像(用于创建渐弱反射的简单蒙版)。

我们使用这个面具

Shade mask

并在此图片中获得最终结果:Gallery

答案 1 :(得分:0)

有可能在特定情况下达到你想要的效果,但一般来说,一旦你“画出黑色背景”,之后就无法让它变得透明。您无法删除或删除已经绘制的像素。

如果您可以在黑色背景之前绘制渐变,则可以将Alpha存入帧缓冲区,然后在绘制黑色背景时对目标alpha进行采样。你需要有一个真正的alpha纹理,因为在绘制时你无法真正将白色渐变转换为alpha渐变。

这是我建议的伪代码:

  1. 在背景中绘制任何你想要的东西
  2. 使用alpha渐变创建纹理
  3. 使用glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_TRUE);
  4. 锁定颜色通道
  5. 在背景上绘制alpha渐变
  6. 使用glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
  7. 取消屏蔽颜色通道
  8. 使用以下混合选项绘制'黑色纹理':glBlend(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA)
  9. 那应该给你留下一个黑色纹理,混合渐变到它下面的任何东西。