Існує дві можливі причини виникнення цього типу проблем, залежно від конкретної проблеми. Я перерахую обидва:
1. Ви бачите інші кольори текстури по краях плиток.
Мені це здається проблемою в цьому випадку, тому що всі крайові пікселі є одним із трьох кольорів, які правдоподібно мають вашу текстуру: білий, чорний та коричневий.
Якщо ви використовуєте кілька зображень плитки безпосередньо поруч із однією текстурою (атласом текстури), як я вважаю, ви це робите, це неминуче. Це відбувається тому, що GPU не ідеально поєднує інтерполяцію по краю трикутника з інтерполяцією вздовж текстури, і ви отримуєте невеликі шматочки сусідньої текстури.
Ви можете зробити ряд речей.
- Використовуйте текстуру масиву замість атласу текстури. Текстура масиву складається з стека двовимірних зображень однакового розміру, і ви визначаєте третю координату, щоб вибрати одне; він призначений саме як заміна текстурних атласів без проблеми з фільтруванням. Однак текстури масиву - це новіша функція, можливо, недоступна у використаній вами версії 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 мільйонів блоків від початку).
- Використовуйте фактичні цілі числа для обчислень вершин координат; це дає вам ще більший спектр