OpenGL: искаженные текстуры, когда они не делятся на 2 - PullRequest
2 голосов
/ 24 августа 2009

У меня есть игровой движок, который использует OpenGL для отображения. Я запрограммировал небольшое меню для него, а затем заметил что-то странное после рендеринга текста. http://img43.imageshack.us/i/garbagen.png/

Как видите, шрифт несколько не читается, но нижние части (например, "Тесты") выглядят так, как задумано. Кажется, положение на экране влияет на читабельность, так как края обрезаются. Шрифт 9x5, значение, которое я делю на 2, чтобы получить ширину / высоту и визуализировать объект из центра. Таким образом, с 4,5x2,5 пикселя (я использую поплавки для x, y, ширины и высоты простых прямоугольников), текстура портится, если визуализируется где-то, кроме x.5 или около того. Тем не менее, пока это происходит только на двух компьютерах, но я не хотел бы, чтобы эта ошибка появлялась, так как делает текст нечитаемым. Я могу сделать это 4.55x2.55 (добавив немного дополнительного размера при делении на 2), и тогда он будет отображаться адекватно на всех машинах (или, по крайней мере, не так часто в проблемных двух), но я боюсь этого это хак, слишком грубый, чтобы держать его, и он не решает проблему полностью, и он может масштабировать текст, делая шрифт выглядящим ... "толстым". Итак, мой вопрос ... есть ли способ предотвратить это, не меняя эти значения на целые? (Мне нужны небольшие отличия от предложений поплавков в сравнении). Могу ли я узнать, какая ширина / высота делится на два, а какие нет, обрабатывают их по-разному? Если это действительно проблема с видеокартой, можно ли ее обойти? Извините, если чего-то не хватает в этом вопросе, я не прибегаю к частым опросам в Интернете и не занимаюсь программированием. Я буду рад предоставить любую строку или кусок кода, который может потребоваться.

Ответы [ 3 ]

0 голосов
/ 24 августа 2009

Попытка сделать подобные пиксельные вещи может быть трудной в OpenGL из-за различных разрешений, фильтрации текстур и т. Д.

Некоторые вещи, которые вы можете попробовать:

  • Нарисуйте свой шрифт в одну большую текстуру (скажем, 512x512).
  • Нарисуйте глифы большего размера, чем вам нужно, и сглаживание, используя альфа-канал (прозрачность).
  • Оставьте некоторое свободное пространство (4 или 8 пикселей) вокруг каждого символа. Если вы толкнете их прямо друг против друга (как если бы вы рисовали шрифт для программного рендеринга еще в дни DOS), то фильтрация заставит их кровоточить друг в друга.
  • Или вы могли бы использовать другой подход и сделать их из отрезков. Это может работать лучше для шрифтов в масштабах, с которыми вы имеете дело.
0 голосов
/ 25 августа 2009

Если вам нужно нарисовать текст по нецелым координатам, вы должны включить фильтрацию текстур.Используйте glTexParameterfv , чтобы установить GL_TEXTURE_MIN_FILTER и GL_TEXTURE_MAG_FILTER на GL_LINEAR.Ваш текст будет размытым, но этого нельзя избежать, не прибегая к идеальным (= целочисленным) координатам пикселей.

Обратите внимание, что ваш обходной путь 0,05 не изменяет способ, которым эффективные координаты округляются до целых.При использовании GL_NEAREST текстурной фильтрации нет такого понятия, как смещение на полпикселя.Даже если вы укажете эти координаты, фильтр текстуры будет округлять их для вас.Вы просто толкаете его в правильном направлении с дополнительными 0,05.

0 голосов
/ 24 августа 2009

Для лучшей надежности я бы нашел способ устранить дроби. У меня только небольшой опыт работы с XNA и MDX, поэтому я не знаю, есть ли для этого веские причины, но почему вы идете по центру, а не по углу?

...