我一直在openGL中玩一下,我想知道如何拍摄一张图片(例如黑色背景),然后在顶部渲染一个较小的白色渐变,但让白色渐变透明(而不是白色)并从黑色背景中删除。在中心留下透明渐变的黑色背景。如果有帮助,我正在使用LWJGL。
有没有办法用混合来做到这一点?
编辑:好的,有没有办法取代两张图片,我在图像周围绘制黑色?所以我有我的白色渐变,将其改为透明,然后在周围绘制黑色?
答案 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%兼容。
编辑:
我的一个项目中的图像(用于创建渐弱反射的简单蒙版)。
我们使用这个面具
并在此图片中获得最终结果:Gallery
答案 1 :(得分:0)
有可能在特定情况下达到你想要的效果,但一般来说,一旦你“画出黑色背景”,之后就无法让它变得透明。您无法删除或删除已经绘制的像素。
如果您可以在黑色背景之前绘制渐变,则可以将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)
那应该给你留下一个黑色纹理,混合渐变到它下面的任何东西。