Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Прозрачность в текстурах

Прозрачность в текстурах

DeadRipperПостоялецwww12 янв. 201814:41#0
Всем привет, наверное все сталкивались с такой проблемой, допустим есть у нас текстура белой снежинки на прозрачном фоне, когда рисуешь в одной программе - все прозрачные пиксели становятся черными выходном PNG файле.
И вот если рисовать такие текстуры на квадах например и скейлить их , либо просто использовать фильтрацию - то видно сероватые границы по краям белой снежинки (из за усреднения черного пикселя с альфой 0 и белого с альфой FF).
Такое решается легко - берешь и рисуешь белый фон с прозрачностью 1% (чтоб он точно сохранил цвет пикселей, так как при 0% некоторые программы запихивают туда неизвестно что , например всегда белый или всегда черный цвет).
Но как быть если изображение многоцветное, каждый раз дорисовывать в альфу нужный цвет рядом?

Может быть есть какие то утилитки, которые модифицируют цвет полностью прозрачных пикселей в текстурах на цвет рядом стоящиx? Заточенные на устранение именно таких артефактов в играх

P.S . Вспомнил чето, спорили с художницей в конторе по поводу этого - она говорит - я пиксели удаляла и там их нет!). A я говорю что есть, и даже цвет в них есть, только они прозрачные . LOL больше она не работает у нас :(

Правка: 12 янв. 2018 14:43

MikleМодераторwww12 янв. 201815:16#1
DeadRipper
> некоторые программы запихивают туда неизвестно что
Фотошоп, что уж.
DeadRipper
> Может быть есть какие то утилитки, которые модифицируют цвет полностью
> прозрачных пикселей в текстурах на цвет рядом стоящиx?
Такое пишется на коленке за 10 минут.
DeadRipperПостоялецwww12 янв. 201815:34#2
Mikle
Такое пишется на коленке за 10 минут.

Да, если ничего готового нет, то наверное придется на каком нибудь питоне забацать
}:+()___ [Smile]Постоялецwww12 янв. 201816:36#3
DeadRipper
> Но как быть если изображение многоцветное, каждый раз дорисовывать в альфу нужный цвет рядом?
Вместо разных костылей надо использовать premultiplied alpha.
DeadRipperПостоялецwww12 янв. 201816:57#4
}:+()___ [Smile]
> Вместо разных костылей надо использовать premultiplied alpha.
не совсем понял как это поможет бороться с усреднением цвета при скейле и фильтрациях?
}:+()___ [Smile]Постоялецwww12 янв. 201817:43#5
DeadRipper
> не совсем понял как это поможет бороться с усреднением цвета при скейле и фильтрациях?
Оно просто всегда будет работать правильно, без дополнительных костылей, типа цвета полной прозрачности.
FordPerfectПостоялецwww12 янв. 201821:50#6
}:+()___ [Smile]
Увидел слово "прозрачность", увидел ник }:+()___ [Smile], и сразу угадал, что будет написано в посте.

Ты хотя-бы мысль разворачивай, или ссылки правильные давай. А то люди же не в курсе.

Например:
http://tomforsyth1000.github.io/blog.wiki.html#%5B%5BPremultiplie… 20alpha%5D%5D
http://tomforsyth1000.github.io/blog.wiki.html#%5B%5BPremultiplie… art%202%5D%5D

DeadRipper
Да, в premultiplied alpha скейл и фильтрация Just Work.
Т. е. усредняется правильно, и никаких специальных телодвижений.

Iron ManПостоялецwww13 янв. 20186:28#7
}:+()___ [Smile]
> premultiplied alpha
А как оно вообще использовать, если по-русски в двух словах? :)
По мне так вообще правильнее в Фотошопе подготовить фон под прозрачность и не задавать потом вопросов, почему онанизм не удовлетворяет так, как секс с хорошей женщиной :)))

Правка: 13 янв. 2018 6:28

PaulShПостоялецwww15 янв. 20185:42#8
FordPerfect
> ссылки правильные давай
https://knarkowicz.wordpress.com/2009/11/18/premultiplied-alpha/
You didn’t mention one thing – using premultiplied alpha increases DXT5 compression artifacts (DXT5 texture alpha channel is compressed with greater fidelity than the RGB channels). So it’s not so great for textures with smooth alpha gradients.

Изображение

FordPerfectПостоялецwww15 янв. 20186:40#9
PaulSh
Гм.
http://tomforsyth1000.github.io/blog.wiki.html#%5B%5BPremultiplie… 20alpha%5D%5D :
Then you go to encode it as a DXTn texture, and you hit more problems. First of all, DXT1 can encode alpha=0 texels, but it can't encode them with any colour other than black. So all your flood-filling was pointless, and black is going to bleed in. I've actually seen this in shipping games - the edges of translucent stuff is bizarrely dark. For example, you get a brightly-lit green leaf rendered against a bright blue sky, so the result of any blending between them should be bright, but there's a dim "halo" around the leaves. Silly developer!

Now OK, DXT1 isn't all that useful for alpha textures because although the top-level mipmap might only have alpha=0 or alpha=1, as soon as you start to make mipmap levels you need some intermediate levels. So let's try DXT3 or DXT5. Same problems with both of those. First of all, the bleeding of course, so fine, you write a flood-filler, whatever. The next problem is when you come to compress the texture. Your flood filler has made sure neighbouring texels are something like the solid ones, but they will be different, especially if the flood-filler has had to blend them. But DXTn compression does badly as the number of colours increases, and the flood-filler just added texel colours. What's worse, they're not particular significant colours (as mostly they're invisible, it's just the "halo" effect you're trying to prevent). But it's hard to tell most DXTn compressors about this, so they see a bunch of texels that have very different colours, and try to satisfy all of them. What happens visually is that you get significantly worse compression around the translucent edges of textures than in the opaque middle, which is very counter-intuitive.

No dark halos. And since when alpha=0, the colour we WANT to encode is black, DXT1 does exactly the right thing. Lucky that, eh? Well no, not really - DXT1 is meant to be used with premultiplied alpha (even though the docs don't say this).

Better still, when you encode the texture into DXT3, all the edge texels are black, whatever their neighbours are. So that's just a single colour for the encoder to fit, rather than a bunch of them. In general, this leads to more consistent compression quality for translucent textures.

By the way - DirectX has the two "premultiplied alpha" compressed texture formats DXT2 and DXT4. I'm not sure why they added them - they are rendered identically to DXT3 and DXT5. The fact that they're different formats is meant to be used as meta-data by the application using them. Thing is - you usually need far far more meta-data than that - is the texture a normal map, does the alpha channel hold translucency or is it a specular map instead, etc. Seems pointless to me. It looks like they're going away in DX10 which is good (DXT2/3 become BC2, DXT4/5 become BC3). In general I'd avoid using DXT2 and DXT4 - I have seen (early) drivers that did something strange when you used them - I think it was actually trying to do the multiply for me, which is not what I wanted. Stick to DXT3 and DXT5 for sanity.

Но да - с т. з. диапазона у straight alpha разрешение лучше; но нет overbright.

VitorioПостоялецwww15 янв. 20187:50#10
Iron Man
> А как оно вообще использовать, если по-русски в двух словах? :)
Если лень обрабатывать исходные изображения, то можно в движке при загрузке текстур программно умножать каждую компоненту цвета(r,g,b) на значение альфы. Затем выставить режим смешения glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) и все взлетит.
DeadRipperПостоялецwww15 янв. 201813:03#11
Всем большое спасибо, кажется я понял почему артефактов не будет.
Вся магия теперь в новом режиме смешения, и усредненный цвет теперь правильно сплюсуется с бекграундом?
DeadRipperПостоялецwww15 янв. 201813:03#12
FordPerfect
> FordPerfect
Отдельное спасибо за статьи
FordPerfectПостоялецwww16 янв. 20181:54#13
DeadRipper
>Вся магия теперь в новом режиме смешения, и усредненный цвет теперь правильно сплюсуется с бекграундом?
Да. Причина в том, что в premultiplied alpha значение RGB - это аддитивная (экстенсивная) физическая величина, а в straight alpha - интенсивная.
Альфа - не совсем аддитивная, но конкретно в случае фильтрации (сумма весов равна 1) - тоже работает.

>Отдельное спасибо за статьи
Распространяем Свет ИстиныTM, one programmer at a time.

Iron ManПостоялецwww16 янв. 20187:15#14
Vitorio
> Если лень обрабатывать исходные изображения, то можно в движке при загрузке текстур программно умножать каждую компоненту цвета(r,g,b) на значение альфы.
> Затем выставить режим смешения glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) и все взлетит.
Т.е. переложить свои временные затраты на игроков :))) тогда точно можно забыть о крутом, оптимизированном движке :)
Особенно, когда грузишь компрессированные DDS-текстуры с MIP-уровнями напрямую в видеопамять...

Правка: 16 янв. 2018 7:16

/ Форум / Программирование игр / Общее

2001—2018 © GameDev.ru — Разработка игр