ПрограммированиеФорумГрафика

[OpenGL] Артефакты с blending

#0
16:07, 13 июня 2014

Что-то делаю не так, подскажите.

Есть картинка с альфа-каналом, набор спрайтов. Полупрозрачность не используется (т.е. фон польностью прозрачный, спрайты полностью непрозрачны, нет плавных переходов).
При отрисовке используется Blending с функцией glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), загружаю картинку с параметрами GL_LINEAR/GL_LINEAR/GL_REPEAT/GL_REPEAT.

Если выводить спрайты один-к-одному (без растягиваний, сжиманий, поворотов), тогда все отлично отображается. Если же хоть немного повернуть или увеличить размер квада, вокруг спрайта появляется белая обводка:

Изображение удалено

Надеюсь, видно её.
Если установить фильтрацию текстуре в GL_NEAR, конечно, обводка пропадает. Пробовал варианты с TexEnv, ничего не меняется.

Можно как-нибудь убрать артефакт?

#1
16:31, 13 июня 2014

попробуй premultipled alpha, т.е. ONE и ONE_MINUS_SRC_ALPHA, в шейдере умножай на выходе цвет на алфьу

#2
16:38, 13 июня 2014

me
Думаю в картинке в соседних прозрачных пикселях цвет rgb просто белый. И если выводится не тексель-в-пиксель, то при линейной фильтрации просто захватывает чуть-чуть этих соседних пикселей и получается белый контур.

#3
16:45, 13 июня 2014

Mr F
У меня FFP.

alorken
То есть нужно редактировать картинку и больше никак?
Вроде бы да, проблема в этом, заменил цвет на черный и стало выглядеть лучше. Спасибо.

#4
16:48, 13 июня 2014

me
> У меня FFP.
> То есть нужно редактировать картинку и больше никак?

Вот же:

Mr F
> попробуй premultipled alpha, т.е. ONE и ONE_MINUS_SRC_ALPHA

#5
16:54, 13 июня 2014

Sergio
> Вот же

С этой функцией прозрачность не работает, т.е. виден белый прямоугольник вокруг спрайта.

#6
21:53, 13 июня 2014

me
> вокруг спрайта появляется белая обводка:
png?
google -> pngfix

з.ы. в hge есть для этого утилита pngopt

#7
22:06, 13 июня 2014

leonardo98
> png?

Пробовал с png и tga, от формата не зависит.

Ну, собственно, по наводке alorken и Mr F погуглил, оказывается проблема довольно известная, и решается с помощью premultipled alpha.
Всем спасибо за помощь.

#8
10:26, 14 июня 2014

me
Просто, конкретно для png, таких утилит видел несколько штук.
А уж тем таких на gd - сотни.

#9
16:13, 14 июня 2014

Mr F
> попробуй premultipled alpha, т.е. ONE и ONE_MINUS_SRC_ALPHA, в шейдере умножай
> на выходе цвет на алфьу
чем это должно помочь? цвет же всё равно интерполируется между нормальным цветом и белым(прозрачным), если спрайт кривой. если на чёрном фоне нормально, то на белом всплывут косяки. вроде, единственное решение же - фиксить сами спрайты, чтобы там, где 100% прозрачности, был тот же цвет, что и рядом у непрозрачных текселей.

ПрограммированиеФорумГрафика

Тема в архиве.