我的游戏目前使用 Graphics2D 进行大量绘图和文本渲染,但我想使用 LWJGL 中提供的一些功能,比如GL11.glBegin(...)
制作自定义形状,也许还可以使用一些很酷的纹理功能。
是否有可能做到这一点?如果是这样,我需要从 LWJGL 添加哪些代码才能使其功能与我已有的功能一起工作?
我的游戏目前使用 Graphics2D 进行大量绘图和文本渲染,但我想使用 LWJGL 中提供的一些功能,比如GL11.glBegin(...)
制作自定义形状,也许还可以使用一些很酷的纹理功能。
是否有可能做到这一点?如果是这样,我需要从 LWJGL 添加哪些代码才能使其功能与我已有的功能一起工作?
可以这样做,但这不是一个简单的方法。Graphics2D 是 Java 绘图 API 的一部分,而 LWJGL 只是 OpenGL API 的 Java 包装器。我的意思是,归根结底,OpenGL 期望输入是顶点和在 GPU 上组装成三角形的索引。过去我已经编写了几个工具来将矢量图形转换为多边形,所以这基本上是你可以做的:
1)将 Graphics2D 形状路径记录为数据结构。然后将它们转换为必须连续的多边形轮廓点集(数组)。例如,如果您的 2d 形状由 2 条直线边缘和 2 条贝塞尔线组成,您可以记录直线的起点/终点,并使用此方法将贝塞尔曲线分解为线段(直线)。为什么您需要将其全部设为线段?因为稍后,您将对这些多边形进行三角剖分。
2)下一部分是对您在前一阶段创建的多边形集进行三角剖分。在这里您可以使用许多三角剖分库之一: Poly2Tri - 是一个强大的库,还具有 Java 端口,可以对凸多边形集和凹多边形集进行三角剖分。还处理孔。如果您使用旧的(固定的)OpenGL 管道,另一种选择是使用 Glu Tessellator。在这种情况下,您甚至不需要寻找任何外部库,因为 glu 是 LWJGL API 的一部分。
基本上这就是你所需要的。但这确实是一个非常原始的设置。例如,在 GPU 上渲染 2D 图形时普遍存在的问题之一是共面表面。所以如果你有深度缓冲区和几个共面您将获得“Z-fighting”工件的平面飞机。要解决此问题,您应该禁用深度写入(这不太可能在 3d 引擎中执行),或者使用模板测试(有更多关于深度/颜色的 hack写乒乓球,但它很复杂)。但是另一个更“几何方法”的选项是在对重叠的多边形进行三角剖分之前在重叠的多边形之间进行多边形裁剪操作。在这里你可以使用像Polygon Clipper这样的库。
所以,正如你所看到的,你想要做的不是几分钟的事情,而且还有更多的挑战,比如性能、几何和 uv 映射问题等。但它绝对是可行的。