在我的游戏中,世界是由立方体组成的,但立方体被分成 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;
}