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.