Что-то делаю не так, подскажите.
Есть картинка с альфа-каналом, набор спрайтов. Полупрозрачность не используется (т.е. фон польностью прозрачный, спрайты полностью непрозрачны, нет плавных переходов).
При отрисовке используется Blending с функцией glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), загружаю картинку с параметрами GL_LINEAR/GL_LINEAR/GL_REPEAT/GL_REPEAT.
Если выводить спрайты один-к-одному (без растягиваний, сжиманий, поворотов), тогда все отлично отображается. Если же хоть немного повернуть или увеличить размер квада, вокруг спрайта появляется белая обводка:
Надеюсь, видно её.
Если установить фильтрацию текстуре в GL_NEAR, конечно, обводка пропадает. Пробовал варианты с TexEnv, ничего не меняется.
Можно как-нибудь убрать артефакт?
попробуй premultipled alpha, т.е. ONE и ONE_MINUS_SRC_ALPHA, в шейдере умножай на выходе цвет на алфьу
me
Думаю в картинке в соседних прозрачных пикселях цвет rgb просто белый. И если выводится не тексель-в-пиксель, то при линейной фильтрации просто захватывает чуть-чуть этих соседних пикселей и получается белый контур.
Mr F
У меня FFP.
alorken
То есть нужно редактировать картинку и больше никак?
Вроде бы да, проблема в этом, заменил цвет на черный и стало выглядеть лучше. Спасибо.
me
> У меня FFP.
> То есть нужно редактировать картинку и больше никак?
Вот же:
Mr F
> попробуй premultipled alpha, т.е. ONE и ONE_MINUS_SRC_ALPHA
Sergio
> Вот же
С этой функцией прозрачность не работает, т.е. виден белый прямоугольник вокруг спрайта.
me
> вокруг спрайта появляется белая обводка:
png?
google -> pngfix
з.ы. в hge есть для этого утилита pngopt
leonardo98
> png?
Пробовал с png и tga, от формата не зависит.
Ну, собственно, по наводке alorken и Mr F погуглил, оказывается проблема довольно известная, и решается с помощью premultipled alpha.
Всем спасибо за помощь.
me
Просто, конкретно для png, таких утилит видел несколько штук.
А уж тем таких на gd - сотни.
Mr F
> попробуй premultipled alpha, т.е. ONE и ONE_MINUS_SRC_ALPHA, в шейдере умножай
> на выходе цвет на алфьу
чем это должно помочь? цвет же всё равно интерполируется между нормальным цветом и белым(прозрачным), если спрайт кривой. если на чёрном фоне нормально, то на белом всплывут косяки. вроде, единственное решение же - фиксить сами спрайты, чтобы там, где 100% прозрачности, был тот же цвет, что и рядом у непрозрачных текселей.
Тема в архиве.