我一直在玩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 硬件也 100% 兼容。
编辑:
我的一个项目中的图像(用于创建渐隐反射的简单蒙版)。
我们使用这个面具
并在此图像中获得最终结果:图库
在特定情况下可能实现您想要的,但一般来说,一旦您“绘制黑色背景”,之后就无法使其透明。您无法移除或擦除已绘制的像素。
如果你可以在黑色背景之前绘制渐变,那么你可以将 alpha 存入帧缓冲区,然后在绘制黑色背景时对目标 alpha 进行采样。不过,您需要有一个真正的 alpha 纹理,因为在绘制时您无法真正将白色渐变转换为 alpha 渐变。
这是我建议的伪代码:
glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_TRUE);
glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
glBlend(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA)
这应该会给你留下一个黑色的纹理,它下面的任何东西都有一个混合的渐变。