我一直在玩 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% 兼容。
编辑:
我的一个项目中的图像(用于创建淡出反射的简单 mask )。
我们用这个面具
并得到这张图片中的最终结果:Gallery
关于java - 使用混合创建多个被黑色包围的透明区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11181688/