В моей игре мир сделан из кубов, но кубы разделены на 5 частей: тетраэдр и 4 угла. Каждый тип блока имеет два цвета. This - это то, что блок может выглядеть, если один угол был разрезан, хотя каждый угол/лицо может иметь разные цвета от остальных.Лучший способ визуализации некубической игры в песочнице?
Проблема в том, что на трехгранных гранях я хочу, чтобы края между треугольниками были бесшовными. Поэтому я не могу использовать текстуры. (Я мог бы, но они должны были быть high-res, и если я хочу оживить цвета (например, на воде), это не вариант).
Я нашел эти подходы:
Рисунок каждый треугольник на каждом четырехгранной лице, то каждый квадрат на каждом кубическом лице (с помощью VBO и все, что вещи)
Слишком много полигонов! Наступает лаг. И это было только предоставление тетраэдров.Использование фрагмента шейдер на мировой геометрии
Математика проста: для каждой оси, найти, если точка находится менее чем на 0,5 внутри куба и XOR результаты. Это определяет, какой цвет использовать. У меня есть отставание, но я думаю, что мой код плох.3D-текстуры на мировой геометрии
Это, кажется, лучший вариант, учитывая, насколько он соответствует моей ситуации, но я действительно не знаю.Использование экспериментальной геометрии с любым из перечисленных выше
Я не уверен в этом; Я читал, что instancing может быть медленным в больших масштабах. Мне понадобится 31 сетка или больше, если я хочу оптимизировать пропущение скрытых поверхностей (что, вероятно, вообще не нужно).Использование геометрического шейдера
Я читал, что геометрические шейдеры плохо работают на больших масштабах.
Какой из этих вариантов был бы наиболее эффективным? Я думаю, что использование 3d и 2d текстуры могут быть лучшим вариантом, но если я получу отставание, я хочу быть уверенным, что это потому, что я использую плохой код, а не неэффективный подход.
Edit: Вот мой код шейдера
#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;
}
Можете ли вы опубликовать свой фрагмент шейдерного кода? –
@DrewMcGowen Done. Я также использую простой вершинный шейдер для применения матриц проекции/просмотра и передачи позиции и цветов в fs. – rcg238