1

在我的游戏中,世界是由立方体组成的,但立方体被分成 5 个部分:一个四面体和 4 个角。每种类型的块有两种颜色。如果一个角被切掉,这就是一个块的样子,尽管每个角/面可能有不同的颜色。

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

我找到了这些方法:

  • 在每个四面体面上绘制每个三角形,然后在每个立方体面上绘制每个正方形(使用 VBO 和所有这些东西)
    多边形太多!出现滞后。这只是渲染四面体。

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

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

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

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

这些选项中哪个最有效?我认为使用 3d2d 纹理可能是最好的选择,但如果我得到延迟,我想确定这是因为我使用了糟糕的代码而不是低效的方法。

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

#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;
}
4

1 回答 1

1

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

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

内部四面体上的任何硬边都不会出现纹理折痕,因为几何边缘要强得多。所以我要做的是有一个与四面体表面对齐的单独的 2D 平面纹理空间,它由与此共面的所有面共享(附带说明:应用这个,您可以使用来自的顶点着色器生成纹理坐标顶点位置)。

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

于 2013-07-25T21:26:48.533 回答