java - 如何在 LWJGL 中在 3D 上渲染具有透明度的 2D 纹理

标签 java opengl 3d 2d orthographic

我一直在尝试将一些纹理渲染为 3D 世界前 HUD 的一部分。我已经设置了方法,以便可以轻松地在 2D 和 3D 之间进行更改(setPerspective() 和 setOrtho())。大多数纹理工作正常,并且按照我想要的方式显示,但是我在处理包含透明度的纹理时遇到了一些困难。纹理的透明部分不会变得透明,而是与背景颜色相同。

我在某处读到,我必须首先渲染背景,但是当我这样做时,由于某种原因,HUD 似乎根本没有显示。

public static void render() {

    glClear(GL_COLOR_BUFFER_BIT | GL_BIT_BUFFER_BIT);
    glLoadIdentity();

    glClearColor(0.75f, 1, 1, 0);

    setOrtho();
    //2D Here

    setPerspective();
    //3D Here

}

是的,我的代码中确实有这个;

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

最佳答案

该混合模式取决于顺序。

您正在根据颜色缓冲区中已有的值进行混合,并可能同时写入深度缓冲区。深度缓冲区不用于重新排序多边形,只是为了测试它们创建的片段是否可见。由于深度测试会产生二元决策(根据已绘制的内容接受/拒绝),因此在混合半透明多边形时,这确实会让事情变得困难。

如果您不从后到前对半透明多边形进行排序并首先绘制所有不透明多边形,那么您的半透明多边形可能会遮挡物体而不是正确混合。

这篇文章关于Transparency Sorting可能会更清楚地解释我刚才所说的内容。

关于java - 如何在 LWJGL 中在 3D 上渲染具有透明度的 2D 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18680976/

相关文章:

opengl - 与保留模式 OpenGL3 相比,WebGL2 在哪些方面是直接的?

android - 在 Android 应用程序中导入并显示 WRL 文件中的模型

c++ - 我需要什么来构建光线追踪 3d 图像的简单 3d 编辑器

java - 在UTF-8流中间打开InputStreamReader

C++ OpenGL (freeglut)

java - 在spring-batch中动态配置Job

c++ - 视差映射 - GLSL- OpenGL

google-maps - 在 Google map 中使用 3D

java - Mapstruct:根据 id 加入

java - saveAll() 太慢了。带 Spring 启动的 Cassandra 数据库。为什么?