2015-10-23 4 views
0


Я пишу небольшой рендер рендеринга карт OpenGL на C# с OpenTK. Чтобы отобразить плитки, я сначала создаю массив вершин, а затем буфер вершин.
В следующий раз я перебираю все плитки и зависит от типа плитки. Я добавляю два треугольника в буфер вершин с соответствующими вершинами (текстурные координаты, цвет, положение).
Чтобы избежать перетаскивания текстуры, я использую одну большую текстуру со всеми текстурами плитки с названием текстурного атласа.
Но у меня проблема при работе с атласом текстуры.
Проблема в том, что я получаю некоторые артефакты на краю некоторых фрагментов, если я увеличиваю масштаб и передвигаю камеру.
Решения, которые я нашел в Интернете были ...OpenGL 4.4 текстурные атласные артефакты

  1. ... для расчета текстуры COORDS с половиной коррекции пикселей.
  2. ... использовать массив текстура

Первый я пытался, но он не работал, как ожидалось (Более объяснено ниже).
Второй, я не знаю, как работать с массивами текстур, и я не мог найти много о массивах текстур в Интернете.

Я использовал следующие фильтры текстур:

GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest); 
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest); 

текстуры Coords расчета с половины коррекции пикселей: расчет

text_coord_x = (0.5f + pixel_x)/texture_width; 
text_coord_y = (0.5f + pixel_x)/texture_height; 

Texture Coords без половины коррекции пикселей:

text_coord_x = pixel_x/texture_width; 
text_coord_y = pixel_y/texture_height; 

Одна плитка с половины коррекции пикселей:
One tile with half pixel correction

Одна плитка без половины коррекции пикселей:
One tile without half pixel correction

Несколько плиток с половины коррекции пикселей:
Multiple tiles with half pixel correction

Несколько плиток без половины коррекции пикселей:
Multiple tiles without half pixel correction

ответ

1

Для решить вашу проблему с границей на атласе вы должны оставили N пиксельной границы вокруг каждый спрайта. Эта граница должна содержать информацию о пикселях, которая зависит от того, что вам нужно. Эта граница может быть сгенерирована 3d-программами лотов.

Например блендера можно испечь несколько текстур в одну с вариантами разницы:

enter image description here

Кроме N пикселей ширина зависит от мип уровней будущих атласе. Поэтому, если вы добавите одну пиксельную границу, вы можете использовать только один уровень mip (нулевой уровень mip). Для двоих - вы можете использовать уровень 0 mip и 1 mip и т. Д. Убедитесь, что уровень использования mip не превышает ширину границы.

+0

Спасибо, что это было бы решением, которое я, вероятно, должен использовать, но нет ли лучшего способа? Например, файл плитки minecraft не содержит границ, и в игре нет артефактов. Знать кого-то, как это было исправлено? – Michael

+0

Не могли бы вы описать свой случай подробно? Что вы хотите сделать? – MrShoor

+0

Интересно, как minecraft использует атлас текстуры без границ или paddings без каких-либо артефактов в игре. – Michael