2009-06-06 2 views
4

Редактировать: проблема решена! См. Конец сообщения.Режим «Экран» для Photoshop в DirectX

Как реализовать режим смешивания «Screen» из 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); 

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

Пример проекта: LinkMirror

Photoshop Результат:

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

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

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

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

+0

Проблема решена. Забыл добавить решение - изображение сверху должно быть без альфы с сплошным черным фоном. – kFk

ответ

0

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

Мой совет:

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

    • извинения, если вы уже сделали это.
+0

Спасибо.Я добавил скриншоты в заголовок – kFk

2

После строки неправильно:

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

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

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

pD3DDevice->SetRenderState(D3DBLENDOP, D3DBLENDOP_ADD); 
+0

Спасибо. Правильное состояние отображения - D3DRS_BLENDOP в DirectX8. Я исправил свой тестовый проект, но результат по-прежнему отличается от Photoshop. Вы можете увидеть скриншоты и образец проекта в заголовке. – kFk

+0

В качестве страницы, которую вы связали с записью, вам нужно иметь изображение в предмножеством альфа-представления. – Suma