3D 空间中的 OpenGL“分层”条件/相对透明度Java

问题描述

我正在尝试将 OpenGL 作为一种爱好来学习,为此,我正在尝试为游戏 minecraft一个体素游戏)制作一个 mod,它添加了独特渲染的块。

在游戏中,不透明块和半透明块都用四边形渲染。为了正确渲染透明,游戏首先渲染不透明块,然后渲染按距离排序的半透明块。因此,它们被游戏单独分类,并被渲染引擎单独渲染为不同的“RenderLayers”

为了我的模组,我创建了一个单独的渲染层,当不透明块(如石头)被设置为渲染时,将使这些块半透明。此外,已经半透明的块将以乘法的方式变得更加半透明。这是通过使用应用于整个图层的片段着色器来完成的。

通常会像这样渲染的块:

Original rendering

分类到新的渲染层时像这样渲染。

Modified rendering

如图所示,应用着色器后,现在半透明块后面的所有块都变得可见。然而,这不是我想要的行为。相反,我希望最初不透明的块遮挡同一渲染层中的其他块,就好像它们一开始就不是半透明的一样,尽管可以看到来自其他“正常”渲染层的块。而且,原本半透明的块应该仍然可以看到后面的相同渲染层的块。

从本质上讲,我想重现将两张不同图层独立拍摄的照片(其中一张不透明度较低)合并后会得到的效果

比如上面的情况,会是这张图(普通图层):

layer 1

被这张图片(特殊图层)覆盖,增加了透明度。

layer 2

做到这一点:

correct

如您所见,虽然彩色玻璃后面的石头保留了色调,但最中间的石头后面的第二个石块并未显示在最终图片中。这是通过在 photoshop 中合并照片手动完成的,但这种“效果”正是我想要的。

这怎么可能用 OpenGL 实现?

澄清:

在上面的图片示例中,

  • 石块被归入“特殊层”
  • 蓝色的彩色玻璃块也被归类为“特殊层”
  • 周围的草块和黄色混凝土块是“正常”层的一部分

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...