Есть две возможные причины для этого типа проблемы, в зависимости от того, какая именно это проблема. Я перечислю оба:
1. Вы видите другие цвета от вашей текстуры по краям плитки.
Это выглядит для меня как проблема в данном случае, потому что все краевые пиксели являются одним из трех цветов, которые правдоподобно присутствуют в вашей текстуре: белый, черный и коричневый.
Если вы используете несколько плиточных изображений рядом друг с другом в одной текстуре (текстурном атласе), как я полагаю, вы делаете, это неизбежно. Это происходит потому, что графический процессор не совсем совпадает с интерполяцией по краю треугольника с интерполяцией по текстуре, и вы получаете маленькие кусочки соседней текстуры.
Есть несколько вещей, которые вы можете сделать.
- Используйте текстуру массива вместо текстурного атласа. Текстура массива состоит из стопки двухмерных изображений одинакового размера, и вы выбираете третью координату, чтобы выбрать одну; он предназначен именно для замены текстурных атласов без проблем с фильтрацией. Однако текстуры массивов - более новая функция, которая может быть недоступна в используемой версии OpenGL.
- Создайте 1-пиксельную границу в каждой из ваших текстурных плиток, которая повторяет цвет смежного обычного пикселя. (Это, по сути, переопределение GL
CLAMP[_TO_EDGE]
, но таким образом, который учитывает атласы текстур - ваше использование их не имеет никакого эффекта, потому что большинство ваших краев плитки не на краю текстуры.) Это решение, которое я использую в своей собственной записи в жанре кубики . Я не знаю особых недостатков, кроме того, что он использует больше текстурной памяти.
- Очень немного вставьте ваши текстурные координаты, чтобы они не доходили до края текстурной плитки. Выполнение этого слишком много приведет к заметной тонкости краев текстуры по сравнению с пикселями в середине.
- Используйте одну текстуру для каждого типа плитки. Это налагает затраты на переключение текстур.
2. Вы видите сквозь промежутки между плитками.
Я не думаю, что это проблема в данном случае, так как сквозь дыры не видно зеленой земли, но я включил ее для полноты картины.
Это может произойти, если вы не предоставляете точно такие же координаты для вершин встречных ребер соседних плиток, что обычно возникает из-за ошибки с плавающей точкой. Например, если у вас есть плитки размером 0,6 и вы вычислили правый край плитки в x=100
с (100*0.6) + 0.6
, а левый край плитки в x=101
с (100*0.6)
, вы не получите тот же самый ответ, и разница может быть видна как маленькие пятнышки пробелы.
Решение состоит в том, чтобы гарантировать, что ваша арифметика последовательна; некоторые способы сделать это:
- Убедитесь, что вы не (даже косвенно) вычисления
index*size + size
, а только (index+1)*size
.
- Убедитесь, что ваша арифметика точна; Самый простой способ сделать это - сделать размер плитки ровно 1,0, что даст точную целочисленную арифметику, даже если вы выполняете вычисления с 32-разрядными числами с плавающей запятой (в любом случае, до 16 миллионов блоков от начала координат).
- Используйте фактические целые числа для вычисления координат вершины; это дает вам еще больший диапазон.