OpenGL - білі краї на кубиках


12

У грі, подібній мені, що я створюю, я отримую білі краї на своїх кубиках:

введіть тут опис зображення

Це набагато помітніше при більш темних фактурах. Текстури встановлюються так: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Будь-яка допомога?


3
Чи можете ви показати якийсь код того, як ви виводите кожен куб і як розміщуєте кубики?
joncodo

1
Чи загортає текстури щось інше? Як виглядає текстура / розмір, до якого ви зобов’язуєтесь?
Чак Д

Я просто хотів зазначити, що я бачив, що це також відбувається у великих атласних текстурах, в яких використовуються невеликі плитки. Як приклад, скажімо, у вас є набір плит / атлас 1024 * 1024, а ви використовуєте плитки 32 * 32. Ви отримуєте помилки округлення, тому що десяткова крапка, яка відображає цю плитку, є дуже маленьким подвійним. Це робить точність майже неможливою. Рішення? Розбийте атлас плитки на окремі плитки. Це те, що чи раніше робив Minecraft. У них був один великий набір плиток, і під час виконання вони подрібнювали його до окремих текстур.
Критичний

Відповіді:


19

Існує дві можливі причини виникнення цього типу проблем, залежно від конкретної проблеми. Я перерахую обидва:

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 мільйонів блоків від початку).
  • Використовуйте фактичні цілі числа для обчислень вершин координат; це дає вам ще більший спектр

Для мене це виглядає як прогалини - жодна текстура не кровоточить (якщо це не зовсім висока текстура), враховуючи крихітні і гострі шматочки.
Маріо

Дякую, введення координат текстури трохи здається, що це виправляє.
Луїс Крус

@Mario Я припускаю, що це з НАЙБІЛЬшим збільшенням - відзначте різку межу на внутрішній частині плитки. Тож для цієї точки зору це нескінченна текстура роздільної здатності.
Кевін Рейд

Ви також можете використовувати текстурний масив, щоб уникнути комутаційних витрат.
danijar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.