ОК, это не так просто, как вы думаете. Я бы использовал Effect & две renderTargets для этого ...
Я забавляюсь, что вы используете один проход рендера, чтобы попытаться сделать это, но это не сработает.
В Photoshop есть слои, и у каждого слоя есть альфа-канал. Кстати, было бы неплохо узнать, какое приложение вы делаете.
Итак, сначала в D3D я бы создал 2 объекта RGBA_32bit renderTarget того же размера, что и ваше окно, и очистил бы их до белого цвета. Сделайте это массивом так (new RenderTarget [2];) для замены.
Теперь установите состояние смешивания на (AlphaFunc = Add, Src = SrcAlpha, Dst = InvSrcAlpha). Для первого круга вы рисуете его в renderTarget [0], используя renderTarget [1] в качестве источника ввода текстуры / сэмплера. Вы будете визуализировать круг с эффектом, который примет цвет кругов и умножит его на цвет сэмплера renderTarget [1]. После того, как вы рисуете кружок один, вы заменяете renderTarget [0] на renderTarget [1] с помощью простого индексирования, поэтому теперь renderTarget [1] - это тот, который вы рисуете, а renderTarget [0] - тот, из которого вы производите выборку. Затем вы повторяете процесс рисования для круга 2 и т. Д.
После того, как вы рисуете любой кружок, вы копируете последний нарисованный объект renderTarget в backBuffer и представляете сцену.
Вот пример логически, как бы вы это сделали. Если вам нужна ссылка для кодирования http://www.codesampler.com/ это хорошее место.
void TestLayering()
{
bool rtIndex = false;
RenderTarget* renderTarget = new RenderTarget[2];
Effect effect = new Effect("multiplyEffect.fx");
effect.Enable();
BlendingFunc = Add;
BlendingSource = SrcAlpha;
BlendingDest = InvSrcAlpha;
for(int i = 0; i != circleCount; ++i)
{
renderTarget[rtIndex].EnableAsRenderTarget();
renderTarget[!rtIndex].EnableAsSampler();
circle[i].Draw();
rtIndex = !rtIndex;
}
//Use D3D9's StretchRect for this...
backBuffer.CopyFromSurface(renderTarget[rtIndex]);
}
//Here is the effects pixel shader
float4 PS_Main(InStruct In) : COLOR
{
float4 backGround = tex2D(someSampler, In.UV);
return circleColor * backGround;
}