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

Прозрачность, альфа-проверка, DirectX9

Страницы: 1 2 3 Следующая »
#0
11:05, 26 фев 2016

Добрый день! О прозрачности в DX написано много, даже есть статья на Геймдеве. Но есть несколько вопросов.
1. Правильно ли я понимаю, что при использовании любой полупрозрачности (альфа-канал в вершинах\материале\текстурах) необходимо сначала обрабатывать непрозрачные полигоны, а затем выводить полупрозрачные в порядке их перекрывания друг друга. И этого никак не избежать?
2. Если использовать альфа-тест, то выводить можно в любом порядке, т.е. абсолютно прозрачная часть текстуры просто не обрабатывается. Так?

#1
11:28, 26 фев 2016

Ramm
> 1. Правильно ли я понимаю, что при использовании любой полупрозрачности
> (альфа-канал в вершинах\материале\текстурах) необходимо сначала обрабатывать
> непрозрачные полигоны, а затем выводить полупрозрачные в порядке их
> перекрывания друг друга. И этого никак не избежать?
Да. сортировать нужно в порядке от дальних к ближним. Избежать можно через механизм Order-independent transparency.
>2. Если использовать альфа-тест, то выводить можно в любом порядке, т.е. абсолютно прозрачная часть текстуры просто не обрабатывается. Так?
Да. Еще рекомендую присмотреться к Alpha to Coverage, Alpha test дает грубый результат при отбрасывании пиксеслей.

#2
11:32, 26 фев 2016

Andrey
> Еще рекомендую присмотреться к Alpha to Coverage, Alpha test дает грубый
> результат при отбрасывании пиксеслей.

Молодец, уже знаешь для чего нужен a2c :)

Если ещё расскажешь как работает TransparencyAA 10.1 - скажу что ты крутой перец !

#3
11:59, 26 фев 2016

Подключаю альфа-тест:

    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);

т.е. отмечаю, что белый - это прозрачный. Отключаю свет. Леплю текстурку на кубик.
На выходе получаю это:
желтый | Прозрачность, альфа-проверка, DirectX9
Откуда берется темная обводка? ДХ ее сжимает в jpg?=) Как с этим бороться?

#4
12:38, 26 фев 2016

innuendo
> Если ещё расскажешь как работает
ты будешь в каждом моем сообщении у меня просить что-то рассказать? Еще раз да кто ты такой :)) ??
>TransparencyAA 10.1 - скажу что ты крутой перец !
Мне глубоко пофигу что ты скажешь, о

"великий"

программист 3D графики.

#5
12:46, 26 фев 2016

Andrey

Через сколько лет разберёшься с TransparencyAA 10.1  ?

#6
13:07, 26 фев 2016

Ramm
> Откуда берется темная обводка? ДХ ее сжимает в jpg?=)
Не, он просто берёт твой цвет, который ты указал как прозрачный, и заменяет его в текстуре на чёрный — D3DCOLOR_RGBA(0,0,0,0).
Color key предполагает, что ты будешь его использовать вместе со включенным блендингом в режиме предумноженной альфы (D3DRS_SRCBLEND = D3DBLEND_ZERO, D3DRS_DESTBLEND = D3DBLEND_SRCALPHA). Но так как ты вырезаешь дырки альфатестом, то в результате наблюдаешь, как твой жёлтый на краях интерполируется с чёрным.
В качестве быстрого решения, можно изменить D3DRS_ALPHAREF на 255, тогда альфатест срежет всю черноту, и оставит только то, что полностью жёлтое. Ну или запилить свой color key, чтобы он вместо черного заливал прозрачные области цветом из соседних непрозрачных пикселей.

#7
14:56, 26 фев 2016
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);

Режет... Лишнего, вроде, не берет... Вроде...

#8
15:20, 26 фев 2016

Ramm
> Откуда берется темная обводка?
Потому, что включена фильтрация текстуры
> Как с этим бороться?
Использовать PNG с альфаканалом, весь рисунок - в альфаканале, а RGB полностью жёлтый. Соответственно грузить без всяких ColorKey.
Либо отключить фильтрацию.

#9
15:47, 26 фев 2016

Ramm
> Не помогает.
Для этого сам блендинг тоже включить надо (D3DRS_ALPHABLENDENABLE = TRUE).

#10
16:37, 26 фев 2016

BUzer
> Для этого сам блендинг тоже включить надо (D3DRS_ALPHABLENDENABLE = TRUE).
Я включил и не выключал)
Mikle
> Потому, что включена фильтрация текстуры
Отключил - рамка исчезла.
Mikle
> Использовать PNG с альфаканалом, весь рисунок - в альфаканале, а RGB полностью
> жёлтый. Соответственно грузить без всяких ColorKey.
Загрузил PNG с альфа-каналом. Если не отключать фильтрацию - появляется рамка. Без фильтрации все нормально.
Andrey
> Да. сортировать нужно в порядке от дальних к ближним.
Это жутко угнетает. Это же полный пэ надо в рантайме вычислять, что перекрывается, а что нет. Алгоритм вроде алгоритма Робертса.

#11
17:50, 26 фев 2016

Ramm
> Это же полный пэ надо в рантайме вычислять, что перекрывается, а что нет
Достаточно сравнения квадратов расстояния до камеры. Но в любом случае будут ошибки при перекрытии полигонов.

#12
18:41, 26 фев 2016

Ramm
> Я включил и не выключал)
Отключи альфа-тест. Со включенным, твои альфы будут только 0 и 255.

BUzer
> D3DRS_DESTBLEND = D3DBLEND_SRCALPHA
А разве не D3DBLEND_INVSRCALPHA?

#13
19:28, 26 фев 2016

Ramm
> Загрузил PNG с альфа-каналом. Если не отключать фильтрацию - появляется рамка.
> Без фильтрации все нормально.
А в PNG точно ВЕСЬ спрайт жёлтый, а не только те места, где альфа ненулевая?
Или, может быть, у тебя в PNG premultipled alpha?

#14
22:04, 26 фев 2016

Andrey
> Избежать можно через механизм Order-independent transparency.
Как вариант weight sum ( с потерей качества )

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

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