3

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

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

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

4

2 回答 2

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% 兼容。

编辑:

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

我们使用这个面具

遮光罩

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

于 2012-06-26T20:27:41.273 回答
0

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

如果你可以在黑色背景之前绘制渐变,那么你可以将 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)

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

于 2012-06-30T20:33:35.460 回答