Режим Photoshop «Экран» в DirectX - PullRequest
4 голосов
/ 06 июня 2009

Редактировать: проблема решена! Смотрите конец поста.

Как реализовать режим наложения «Экран» из Photoshop в DirectX 8?

Информация, я нашел по этой теме (http://www.ziggyware.com/readarticle.php?article_id=228):

Result = 1 – (1 – destination) * (1 – source)
Result = 1 – (1 – source – destination + destination * source)
Result = 1 – 1 + source + destination – destination * source
Result = source + destination – destination * source
Result = destination + source – source * destination
Result = destination + source * (1 – destination)

Теперь, когда у нас есть математика, мы просто должны установить режимы наложения:

BlendOperation = Add
DestinationBlend = One
SourceBlend = InvDestColor

Я предполагаю, что состояния смешивания DirectX должны быть:

pD3DDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVDESTCOLOR);

Это правильно? (У меня неправильный результат)

Пример проекта: Ссылка Зеркало

Результат фотошопа:

http://img192.imageshack.us/img192/7015/photoshopf.jpg

Мой результат в DirectX:

http://img193.imageshack.us/img193/2969/directx.jpg

Решение проблем: Формула не учитывает альфа-изображение, чтобы исправить это, нужно сделать фон изображения полностью черным с непрозрачностью 100%

Ответы [ 2 ]

2 голосов
/ 06 июня 2009

Следующая строка неверна:

pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_ADD);

Возможно, вы намерены указать, что альфа-блендер должен выполнять ADD, но настройка D3DTSS_COLOROP не влияет на конечный блендер, вместо этого он устанавливает объединитель текстур. Вы устанавливаете это, чтобы добавить что-то (результат предыдущего / следующего этапа или что-то в этом роде) к цвету, который вы выбираете из текстуры, что неправильно. D3DTOP_SELECTARG1 или D3DTOP_MODULATE по умолчанию должны выполнять эту работу.

Вместо этого вам нужно написать:

pD3DDevice->SetRenderState(D3DBLENDOP, D3DBLENDOP_ADD);
0 голосов
/ 06 июня 2009

Математика кажется правильной, и способ установки функций DirectX должен работать.

Мой совет:

  1. Используйте те же изображения, которые вы используете в Photoshop, чтобы вы знали, что он не делает чисто белый (возможно).
  2. Убедитесь, что вы можете использовать другие режимы наложения и чтобы они генерировали правильный вывод.

    • извиняюсь, если вы уже сделали оба из них.
...