渲染非立方沙箱游戏的最佳方式?

时间:2013-07-25 20:20:18

标签: java opengl 3d lwjgl voxel

在我的游戏中,世界由立方体组成,但立方体分为5个部分:四面体和4个角。每种类型的块都有两种颜色。 This是一个方块在切割一个角落时的样子,尽管每个角落/脸部的颜色可能与其他角落不同。

问题是,在四面体面上,我希望三角形之间的边缘是无缝的。所以我不能使用纹理。 (我可以,但他们需要高分辨率,如果我想为颜色设置动画(例如在水面上),这不是一个选项。)

我找到了这些方法:

  • 在每个四面体上绘制每个三角形,然后在每个立方体面上绘制每个正方形(使用VBO和所有东西)
    聚合物太多了!滞后随之而来。这只是渲染四面体。

  • 在世界几何体上使用片段着色器
    数学很简单:对于每个轴,查找立方体中的点是否小于0.5并且结果是xor。这决定了使用哪种颜色。我有滞后,但我认为我的代码很糟糕。

  • 世界几何上的3D纹理
    鉴于它与我的情况完全匹配,这似乎是最好的选择,但我真的不知道。

  • 将实例化几何与上述任何一种一起使用 我不确定这个;我读过大规模的实例可能很慢。如果我想优化跳过隐藏的表面,我需要31个网格或更多网格(这可能是不必要的)。

  • 使用几何着色器
    我读过几何着色器在大尺度上表现不佳。

哪些选项最有效?我认为使用3d 2d纹理可能是最好的选择,但是如果我得到延迟,我想确定它是因为我使用的是错误的代码而不是低效的方法。

编辑:这是我的着色器代码

#version 150 core

in vec4 pass_Position;
in vec4 pass_Color1;
in vec4 pass_Color2;

out vec4 out_Color;

void main(void) {
    if ((mod(abs(pass_Position.x),1f)<=0.5f)^^(mod(abs(pass_Position.y),1f)<=0.5f)^^(mod(abs(pass_Position.z),1f)<=0.5f)) out_Color = pass_Color1;
    else out_Color = pass_Color2;
}

1 个答案:

答案 0 :(得分:1)

  

问题是,在四面体面上,我希望三角形之间的边缘是无缝的。所以我不能使用纹理。 (我可以,但他们需要高分辨率,如果我想为颜色设置动画(例如在水面上),这不是一个选项。)

情况不一定如此。请记住,OpenGL看不到整个对象,只看到单个三角形。因此,当渲染那个切割面时,它只是渲染其平坦的“无肉”对应物并没有什么不同。

内四面体上的任何硬边都不会受到纹理折痕的影响,因为几何边缘要强得多。所以我要做的是让一个单独的2D平面纹理空间与四面体表面对齐,这是由与此共面的所有面共享的(在侧面注释:应用它可以使用顶点着色器生成纹理坐标)顶点位置)。

话虽如此:简单的2D平面纹理最终会遇到一些限制。由于您正在有效地实现隐式曲面tesselator的变体(使用标量字段创建表面为二进制值),因此在片段着色器中考虑程序性体积纹理生成是有意义的。