Добрый день! О прозрачности в DX написано много, даже есть статья на Геймдеве. Но есть несколько вопросов.
1. Правильно ли я понимаю, что при использовании любой полупрозрачности (альфа-канал в вершинах\материале\текстурах) необходимо сначала обрабатывать непрозрачные полигоны, а затем выводить полупрозрачные в порядке их перекрывания друг друга. И этого никак не избежать?
2. Если использовать альфа-тест, то выводить можно в любом порядке, т.е. абсолютно прозрачная часть текстуры просто не обрабатывается. Так?
Ramm
> 1. Правильно ли я понимаю, что при использовании любой полупрозрачности
> (альфа-канал в вершинах\материале\текстурах) необходимо сначала обрабатывать
> непрозрачные полигоны, а затем выводить полупрозрачные в порядке их
> перекрывания друг друга. И этого никак не избежать?
Да. сортировать нужно в порядке от дальних к ближним. Избежать можно через механизм Order-independent transparency.
>2. Если использовать альфа-тест, то выводить можно в любом порядке, т.е. абсолютно прозрачная часть текстуры просто не обрабатывается. Так?
Да. Еще рекомендую присмотреться к Alpha to Coverage, Alpha test дает грубый результат при отбрасывании пиксеслей.
Andrey
> Еще рекомендую присмотреться к Alpha to Coverage, Alpha test дает грубый
> результат при отбрасывании пиксеслей.
Молодец, уже знаешь для чего нужен a2c :)
Если ещё расскажешь как работает TransparencyAA 10.1 - скажу что ты крутой перец !
Подключаю альфа-тест:
DeviceDirect.SetRenderState(D3DRS_ALPHATESTENABLE, 1); DeviceDirect.SetRenderState( D3DRS_ALPHAREF, 8); DeviceDirect.SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
Использую BMP-файл с двумя цветами - желтым и белым, загружаю текстуру с помощью
D3DXCreateTextureFromFileEx(devicedirect, 'Floppy.bmp', D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, D3DCOLOR_RGBA( 255,255,255,255), nil, nil, textura);
т.е. отмечаю, что белый - это прозрачный. Отключаю свет. Леплю текстурку на кубик.
На выходе получаю это:
Откуда берется темная обводка? ДХ ее сжимает в jpg?=) Как с этим бороться?
innuendo
> Если ещё расскажешь как работает
ты будешь в каждом моем сообщении у меня просить что-то рассказать? Еще раз да кто ты такой :)) ??
>TransparencyAA 10.1 - скажу что ты крутой перец !
Мне глубоко пофигу что ты скажешь, о
"великий"
программист 3D графики.
Andrey
Через сколько лет разберёшься с TransparencyAA 10.1 ?
Ramm
> Откуда берется темная обводка? ДХ ее сжимает в jpg?=)
Не, он просто берёт твой цвет, который ты указал как прозрачный, и заменяет его в текстуре на чёрный — D3DCOLOR_RGBA(0,0,0,0).
Color key предполагает, что ты будешь его использовать вместе со включенным блендингом в режиме предумноженной альфы (D3DRS_SRCBLEND = D3DBLEND_ZERO, D3DRS_DESTBLEND = D3DBLEND_SRCALPHA). Но так как ты вырезаешь дырки альфатестом, то в результате наблюдаешь, как твой жёлтый на краях интерполируется с чёрным.
В качестве быстрого решения, можно изменить D3DRS_ALPHAREF на 255, тогда альфатест срежет всю черноту, и оставит только то, что полностью жёлтое. Ну или запилить свой color key, чтобы он вместо черного заливал прозрачные области цветом из соседних непрозрачных пикселей.
DeviceDirect.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO); DeviceDirect.SetRenderState( D3DRS_DESTBLEND, D3DBLEND_SRCALPHA);
Не помогает.
По идее, чтобы отключить смешивание, нужно вызвать:
DeviceDirect.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); DeviceDirect.SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ZERO);
Но это тоже не помогает.
DeviceDirect.SetRenderState(D3DRS_ALPHAREF, 255);
Режет... Лишнего, вроде, не берет... Вроде...
Ramm
> Откуда берется темная обводка?
Потому, что включена фильтрация текстуры
> Как с этим бороться?
Использовать PNG с альфаканалом, весь рисунок - в альфаканале, а RGB полностью жёлтый. Соответственно грузить без всяких ColorKey.
Либо отключить фильтрацию.
Ramm
> Не помогает.
Для этого сам блендинг тоже включить надо (D3DRS_ALPHABLENDENABLE = TRUE).
BUzer
> Для этого сам блендинг тоже включить надо (D3DRS_ALPHABLENDENABLE = TRUE).
Я включил и не выключал)
Mikle
> Потому, что включена фильтрация текстуры
Отключил - рамка исчезла.
Mikle
> Использовать PNG с альфаканалом, весь рисунок - в альфаканале, а RGB полностью
> жёлтый. Соответственно грузить без всяких ColorKey.
Загрузил PNG с альфа-каналом. Если не отключать фильтрацию - появляется рамка. Без фильтрации все нормально.
Andrey
> Да. сортировать нужно в порядке от дальних к ближним.
Это жутко угнетает. Это же полный пэ надо в рантайме вычислять, что перекрывается, а что нет. Алгоритм вроде алгоритма Робертса.
Ramm
> Это же полный пэ надо в рантайме вычислять, что перекрывается, а что нет
Достаточно сравнения квадратов расстояния до камеры. Но в любом случае будут ошибки при перекрытии полигонов.
Ramm
> Я включил и не выключал)
Отключи альфа-тест. Со включенным, твои альфы будут только 0 и 255.
BUzer
> D3DRS_DESTBLEND = D3DBLEND_SRCALPHA
А разве не D3DBLEND_INVSRCALPHA?
Ramm
> Загрузил PNG с альфа-каналом. Если не отключать фильтрацию - появляется рамка.
> Без фильтрации все нормально.
А в PNG точно ВЕСЬ спрайт жёлтый, а не только те места, где альфа ненулевая?
Или, может быть, у тебя в PNG premultipled alpha?
Andrey
> Избежать можно через механизм Order-independent transparency.
Как вариант weight sum ( с потерей качества )
Тема в архиве.