【问题标题】:Using blending to create multiple areas of transparency surrounded by black使用混合创建多个被黑色包围的透明区域
【发布时间】:2012-06-24 22:26:25
【问题描述】:

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

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

编辑:好的,有什么方法可以代替减去两个图像,而是在图像周围画黑色?所以我有我的白色渐变,将其更改为透明,然后在其周围绘制黑色?

【问题讨论】:

  • 固定功能?我知道着色器会矫枉过正?还是我错了?

标签: java opengl lwjgl


【解决方案1】:

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

编辑:

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

我们使用这个面具

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

【讨论】:

  • 仅供参考,程序的最后一行实际上以builtin function mix(Color, Mask, Mask.a) 的形式存在。可能效率更高。
  • 谢谢,蒂姆。我们刚刚在一些“不完全符合”的 GL ES 硬件上使用 mix() 和其他不错的函数时遇到了很多问题。所以我们经常手动做这样的事情:)
  • 我们也从未听说过 ATI 卡上的简单过滤纹理提取中的错误(具有显式 MIP 级别 0 的纹理 3DLod 在 X1600 上工作,但纹理 3D 失败 - 这是一个永远无法修复的错误一个驱动程序,他们很感激地给我们寄了一张从来没有 HD3xxx 卡,而不是修复我们的错误报告:))))。这一切都是突然出现的,所以为了确保我们坚持最低限度。更重要的是,OP要求一个解决方案,它很简单。因此,如果他一般不熟悉 GLSL,“展开” mix() 调用并没有什么坏处。
【解决方案2】:

在特定情况下可能实现您想要的效果,但一般来说,一旦您“绘制黑色背景”,之后就无法使其透明。您无法移除或擦除已绘制的像素。

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

这是我建议的伪代码:

  1. 在背景中画出你想要的任何东西
  2. 使用 alpha 渐变创建纹理
  3. glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_TRUE);锁定颜色通道
  4. 在背景上绘制 alpha 渐变
  5. 使用glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); 取消屏蔽颜色通道
  6. 使用以下混合选项绘制“黑色纹理”:glBlend(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA)

这应该会给你留下一个黑色纹理,它下面的任何东西都有一个混合渐变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2017-09-23
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多