У мене є 2D-ігровий двигун, який малює кавові карти, малюючи плитки із зображення набору плиток. Оскільки за замовчуванням OpenGL може обгортати лише всю текстуру ( GL_REPEAT
), а не лише її частину, кожна плитка розбивається на окрему текстуру. Потім області однієї плитки виводяться поруч один з одним. Ось як це виглядає, коли працює за призначенням:
Однак як тільки ви вводите дробове масштабування, з'являються шви:
Чому це відбувається? Я подумав, що це пов'язано з лінійною фільтрацією, яка змішує межі квадратиків, але це все одно відбувається при точковій фільтрації. Єдине рішення, яке я знайшов поки що, - це забезпечити, щоб усі позиціонування та масштабування відбувалося лише за цілими значеннями, і використовувати точну фільтрацію. Це може погіршити візуальну якість гри (особливо, якщо розміщення підпікселів більше не працює, тому рух не такий плавний).
Те, що я спробував / вважав:
- антиалізинг зменшує, але не повністю усуває шви
- вимкнення міповідтворення не впливає
- візуалізуйте кожну плитку окремо і видавіть краї на 1px - але це деоптимізація, оскільки вона не може більше відтворювати області плиток за один раз, і створює інші артефакти по краях областей прозорості
- додайте 1px рамку навколо вихідних зображень та повторіть останні пікселі - але вони вже не є потужністю двох, викликаючи проблеми сумісності із системами без підтримки NPOT
- написання користувацького шейдера для обробки кахельних зображень - але що б ви зробили інакше?
GL_REPEAT
має захоплювати піксель з протилежного боку зображення на межах, а не вибирати прозорість. - геометрія точно суміжна, помилок округлення з плаваючою точкою немає.
- якщо шейдер фрагмента важко закодований, щоб повернути той самий колір, шви зникають .
- якщо текстури встановлені
GL_CLAMP
замістьGL_REPEAT
, шви зникають (хоча візуалізація неправильна). - якщо текстури встановлені
GL_MIRRORED_REPEAT
, шви зникають (хоча рендерінг знову неправильний). - якщо я роблю фон червоним, шви все ще білі. Це дозволяє зробити вибірку непрозорого білого кудись, а не прозорість.
Тож шви з’являються лише тоді, коли GL_REPEAT
встановлено. Чомусь лише в цьому режимі, на краях геометрії спостерігається деяка обдувка / протікання / прозорість. Як це може бути? Вся текстура непрозора.
GL_NEAREST
вибіркою в R
координатному напрямку також працюють так само добре, як і масиви текстур для більшості речей цього сценарію. Mipmapping не спрацює, але, судячи з вашої програми, вам, мабуть, не потрібні карти.