java - 使用混合创建多个被黑色包围的透明区域

标签 java opengl lwjgl

我一直在玩 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 )。

我们用这个面具

Shade mask

并得到这张图片中的最终结果:Gallery

关于java - 使用混合创建多个被黑色包围的透明区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11181688/

相关文章:

java - LWJGL 添加照明后显示白屏

java - 如何在 Slick2D 中向图像/ Sprite 添加碰撞?

java - 使用变换矩阵旋转顶点

java - 线程化 TCP 服务器 - 试图维护用户存储库的数据一致性

java - SQLite数据库什么时候创建的?

java - 当我试图知道我的方法中是否有注释时,它返回 null(即使有)

java - 文档 - 如何在 hibernate hbm.xml 文件中声明 transient 方法?

java - 使用 Windows 时 glDrawElements 上的 EXCEPTION_ACCESS_VIOLATION

c# - 在 C# -opengl 中导入 3D 模型

java - 我可以在我的 Java 应用程序中使用 OpenGL 吗?如果是,如何?