2013-07-25 4 views
1

В моей игре мир сделан из кубов, но кубы разделены на 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; 
} 
+0

Можете ли вы опубликовать свой фрагмент шейдерного кода? –

+0

@DrewMcGowen Done. Я также использую простой вершинный шейдер для применения матриц проекции/просмотра и передачи позиции и цветов в fs. – rcg238

ответ

1

Проблема, на тетраэдрическое лице, я хочу, чтобы ребра между треугольниками быть бесшовными. Поэтому я не могу использовать текстуры. (Я мог бы, но они должны были быть high-res, и если я хочу оживить цвета (например, на воде), это не вариант).

Это не обязательно так. Помните, что OpenGL не видит целые объекты, а только отдельные треугольники. Поэтому, когда вы оказываете это разрезанное лицо, это ничем не отличается от того, чтобы просто сделать его плоский, «бесплотный» аналог.

Любой жесткий край на внутреннем тетраэдре не страдает от складки текстуры, поскольку геометрический край намного сильнее. Так что я бы сделал, чтобы иметь отдельное 2D-плоскостное пространство текстуры, выровненное с тетраэдрическими поверхностями, которое разделяется всеми лицами, копланарными к этому (на стороне примечания: применяя это, вы могли бы сгенерировать координаты текстуры с помощью вершинного шейдера из вершинная позиция).

Это, как говорится: простые 2D плоские текстуры, в конечном счете, нанесут некоторые ограничения. Поскольку вы эффективно реализуете вариант неявного поверхностного тесселятора (со скалярным полем, создающим двоичную оценку), имеет смысл подумать о процедурной генерации объемной текстуры в шейдере фрагмента.

+0

Под «бесшовным» я имею в виду, что я не хочу видеть отдельные тексели – rcg238

+1

@ rcg238: тогда используйте GL_LINEAR_MIPMAP_LINEAR-фильтрацию. Если вы хотите избежать повторения, используйте несколько текстур, каждый из которых обеспечивает различный уровень детализации. Путем масштабирования текстурных координат каждого слоя с использованием отдельного основного фактора вы можете генерировать очень длительные периоды повторения. Например, 3 слоя, масштабированные первичными факторами 19, 23 и 29, будут повторяться только после 19 · 23 · 29 = 12673 единиц. Вы можете даже применять несколько разные первичные коэффициенты для других координат текстуры (перекос текстуры). – datenwolf

+1

@ rcg238: Или совсем другой подход будет заключаться в использовании «Megatextures» (Google для этого, они были популяризированы Id Software в их Engine 5 Engine). – datenwolf

Смежные вопросы