2012-04-05 5 views
0

У меня есть поверхность (OffScreenPlain или RenderTarget с D3DFMT_A8R8G8B8), с которой я копирую пиксели (ARGB) в функцию третьей стороны. Перед копированием пикселей доступ к битам осуществляется LockRect.D3D9 Alpha Blending на поверхностях

Эта поверхность представляет собой StretchRect для Backbuffer, который является (D3DFMT_A8R8G8B8). Поверхность и бэкбуффер - разные размеры. Фильтрация установлена ​​на D3DTEXF_NONE.

Сразу после создания устройства d3d я установил следующие RenderState настройки

D3DRS_ALPHABLENDENABLE -> TRUE 
D3DRS_BLENDOP   -> D3DBLENDOP_ADD 
D3DRS_SRCBLEND   -> D3DBLEND_SRCALPHA 
D3DRS_DESTBLEND  -> D3DBLEND_INVSRCALPHA 

Но я не вижу альфа-смешивание не происходит. Я проверил, что альфа задана в пикселях.

Я проделал простой тест, создав буфер вершин и нарисуя треугольник (DrawPrimitive), который отображает с альфа-смешиванием.

На этой тестовой поверхности сначала был StretchRect, а затем DrawPrimitive, а поверхностное содержимое отображается без альфа-смешивания, а треугольные дисплеи с альфа-смешиванием.

Что мне здесь не хватает? Спасибо

ответ

2

Государства, которые вы упомянули, затрагивают только вершины. Чтобы текстуры смешивались правильно, вам нужно указать, как текстурная альфа смешивается с вершинами одна. Вы можете сделать это так:

d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); 
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); 
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); 

По умолчанию ALPHAOP является SELECTARG1, то есть только текстура альфа считается рендеринга.

Другое решение использует метод ID3DXSprite::Draw для копирования текстуры в задний буфер. Просто передайте цвет D3DCOLOR_ARGB(X, 255, 255, 255) где X - ваша альфа. Этот метод будет выполнять все настройки штатов, а конечный результат будет соответствовать вашим ожиданиям.

Смежные вопросы