繁体   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