Альфа тест

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Альфа тест

Сообщение lellel » 30.08.2010 (Пн) 14:02

пишу на С++, но суть вопроса не меняется.
отрисовываю куб с текстурой, в текстуре альфа канал, везде одинаковая прозрачность около 0.5
включаю альфа тест (типа VB эквивалент кода)
Код: Выделить всё
    Call dev.SetRenderState(D3DRS_ALPHAREF, &H0)
    Call dev.SetRenderState(D3DRS_ALPHATESTENABLE, 1)
    Call dev.SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER)


рендерится неправильно, видны лишь часть греней куба, когда должны быть видны все.
если отключить запись в ZBuffer все норм.

если не использую текстуру, а использую D3DFVF_DIFFUSE вертексов, где одна грань полностью прозрачна, остальные полностью нет, то альфатест работает нормально, то есть я вижу "внутренности" куба.
в чем отличие?

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

альфабленд и текстурирование
Код: Выделить всё
   Call dev.SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
   Call dev.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
   Call dev.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
   Call dev.SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);

   Call dev.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
   Call dev.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
   Call dev.SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);

   Call dev.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
   Call dev.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
   Call dev.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Альфа тест

Сообщение djalex777 » 30.08.2010 (Пн) 22:43

Альфатест позволяет делать прозрачными (полностью или непрозрачными вобще) те пиксели, которые прошли (не прошли) тест, в зависимости от функции. Не более того. Что ты от него хочешь?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Альфа тест

Сообщение Mikle » 31.08.2010 (Вт) 8:12

djalex777
Плюс к тому AlphaTest отключает запись в Z-Buffer в отличие от AlphaBlend, что позволяет не упорядочивать по дальности.

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Re: Альфа тест

Сообщение lellel » 31.08.2010 (Вт) 10:24

я думал, что альфабленд только делает объекты прозрачными(частично или полностью), но чтобы такие объекты нормально отрисовались они должны быть упорядочены и отрисованы от самых дальних к самым ближним. это не всегда возможно(или иногда сложно) поэтому можно включить альфа тест, которые позволит не упорядочивать по дальности и отрисовать все полупрозрачные объекты.
собственно, поэкспериментировав кажется понял как работает альфа тест. сравнивается значение альфа-компоненты с установленным значением и в зависимости от функции либо тест пройден и пиксел отображается, либо тест не пройден и пиксел не отображается. причем цвет пикселя в случае отображения соответствует заданным параметрам смешивания.
но тогда как вывести полупрозрачный объект (тот же куб с D3DCULL_NONE) ?
Нашел по этой теме упоминание такой технологии как Order Independent Transparency.. есть еще что-то подобное?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Альфа тест

Сообщение Mikle » 31.08.2010 (Вт) 10:51

Выпуклые прозрачные объекты (тот же куб) можно выводить в два прохода - сначала с CullCW, потом с CullCCW.


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList