Java 渲染非立方体沙盒游戏的最佳方法?

Java 渲染非立方体沙盒游戏的最佳方法?,java,opengl,3d,lwjgl,voxel,Java,Opengl,3d,Lwjgl,Voxel,在我的游戏中,世界是由立方体组成的,但是立方体被分成5部分:一个四面体和4个角。每种类型的块都有两种颜色。是当一个角被切割时块的外观,尽管每个角/面可能与其他角/面具有不同的颜色 问题是,在四面体面上,我希望三角形之间的边是无缝的。所以我不能使用纹理。(我可以,但它们需要高分辨率,如果我想设置颜色的动画(例如在水上),这不是一个选项) 我发现了以下方法: 在每个四面体面上绘制每个三角形,然后在每个立方体面上绘制每个正方形(使用VBO等工具) 太多的多边形!随之而来的是滞后。这只是绘制四面体 在

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

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

我发现了以下方法:

  • 在每个四面体面上绘制每个三角形,然后在每个立方体面上绘制每个正方形(使用VBO等工具)
    太多的多边形!随之而来的是滞后。这只是绘制四面体

  • 在世界几何体上使用片段着色器
    数学很简单:对于每个轴,找出立方体中的点是否小于0.5,然后对结果进行异或运算。这决定了使用哪种颜色。我有延迟,但我认为我的代码不好

  • 世界几何体上的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;
}
#版本150核心
在vec4 pass_位置;
在vec4中,通过颜色1;
在vec4中,通过颜色2;
out vec4 out_颜色;
真空总管(真空){
如果((模块(abs(通过位置x),1f)
问题是,在四面体面上,我希望三角形之间的边是无缝的。因此我不能使用纹理。(我可以,但它们需要高分辨率,如果我想设置颜色动画(例如在水上),这不是一个选项)

事实并非如此。请记住,OpenGL不能看到整个对象,只能看到单个三角形。因此,在渲染切割面时,只渲染其平坦的“无肉”对应面并没有什么不同

内部四面体上的任何硬边都不会出现纹理折痕,因为几何边要强烈得多。因此,我要做的是让一个单独的二维平面纹理空间与四面体表面对齐,这是共面的所有面共享的(旁注:应用此选项,可以使用顶点位置的顶点着色器生成纹理坐标)

这就是说:简单的2D平面纹理最终会遇到一些限制。由于您正在有效地实现隐式曲面细分器的变体(创建曲面的标量场为二进制值),因此考虑碎片着色器中的程序体积纹理生成是有意义的

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

事实并非如此。请记住,OpenGL不能看到整个对象,只能看到单个三角形。因此,在渲染切割面时,只渲染其平坦的“无肉”对应面并没有什么不同

内部四面体上的任何硬边都不会出现纹理折痕,因为几何边要强烈得多。因此,我要做的是让一个单独的二维平面纹理空间与四面体表面对齐,这是共面的所有面共享的(旁注:应用此选项,可以使用顶点位置的顶点着色器生成纹理坐标)


这就是说:简单的2D平面纹理最终会遇到一些限制。因为您正在有效地实现隐式曲面细分器的变体(创建曲面的标量字段为二进制值)考虑碎片着色器中的程序体积纹理生成是有意义的。

你能发布你的碎片着色器代码吗?@DrewMcGowen Done。我还使用一个简单的顶点着色器应用投影/视图矩阵,并将位置和颜色传递给fs。你能发布你的碎片着色器代码吗?@DrewMcGowen Done。我也是使用简单的顶点着色器应用投影/视图矩阵,并通过“无缝”将位置和颜色传递给fs我的意思是我不想看到一个人texels@rcg238:然后使用GL_LINEAR_MIPMAP_LINEAR filtering。如果要避免重复性,请使用多个纹理,每个纹理提供不同的细节层。通过使用不同的素因子缩放每个层的纹理坐标,可以生成非常长的重复周期。例如3层按素因子19、23和29缩放的s仅在19·23·29=12673个单位后才会重复。您甚至可以对其他纹理坐标应用稍有不同的素因子(使纹理倾斜)。@rcg238:或者,完全不同的方法是使用“Megatextures”(谷歌为之,他们在他们的Tech5引擎中通过Id软件得到了普及。)通过“无缝”我的意思是我不想看到一个人texels@rcg238:然后使用GL_LINEAR_MIPMAP_LINEAR filtering。如果要避免重复性,请使用多个纹理,每个纹理提供不同的细节层。通过使用不同的素因子缩放每个层的纹理坐标,可以生成非常长的重复周期。例如3层按素因子19、23和29缩放的s仅在19·23·29=12673个单位后重复。您甚至可以稍微应用