c++ - DirectX9 与 Alpha 的加法混合

标签 c++ directx-9

我正在尝试实现加法混合,然后在 DirectX9 中对结果进行 alpha 混合。

渲染的背景:

Background

我用于添加混合的图像:

enter image description here

我当前的渲染循环:

// Render loop:
myColor = 0xFFFFFF;
myAlpha = 0xFF;
myColorDraw = DRGBA( GetR(myColor), GetG(myColor), GetB(myColor), alpha );

myD3DSprite->Begin( D3DXSPRITE_ALPHABLEND );

// Default alpha blending
//D3DDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
//D3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );

// Additive blending
D3DDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR );
D3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );

MyD3DSprite->Draw( myTexture, &myRectSource, NULL, NULL, myColorDraw );
myD3DSprite->End();

如果我理解正确,这将从源(我用来混合的图像)获取一个像素,并将其与目标(我正在渲染的纹理,在本例中为背景)中的像素相乘.

我认为数学是这样的:TARGET = SRC * (DEST * 1)。但如果我错了,请纠正我。

这就是结果(这几乎是我想要的):

enter image description here

剩下要做的就是使用 myColorDraw 中的 alpha,这样我就可以“淡化”源图像,但我完全不知道如何组合这两个东西。 (我认为将所有颜色与 myColorDraw 相乘也会得到我想要的结果,只要包含 alpha 即可)。

我尝试过使用单独的 alpha 混合:

D3DDevice->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE);
D3DDevice->SetRenderState(D3DRS_SRCBLENDALPHA, D3DBLEND_BLENDFACTOR );
D3DDevice->SetRenderState(D3DRS_DESTBLENDALPHA, D3DBLEND_INVDESTCOLOR);

我尝试添加一个TextureStage:

D3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_BLENDDIFFUSEALPHA );
D3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG0,  D3DTA_CURRENT );
D3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1,  D3DTA_DIFFUSE );

但它们似乎对结果没有任何影响。 我的做法可能完全错误,因为我对 DirectX 和渲染的了解非常有限。有人可以指出我正确的方向吗?

--编辑--

我可能忘记提及任何东西都可以在后台。我只使用了一个(背景)图像来回答这个问题,因此想要的结果会很清楚。

最佳答案

在这种情况下,您不能使用 alpha 来完成这一切,只需使用纹理颜色系数 RGB。

这是用于此纹理混合的简单像素着色器:

struct PS_INPUT 
{
   float2 TexCoord : TEXCOORD0;
};

sampler Texture0;
sampler Texture1;

float color; // blend color factor

float4 ps_main(PS_INPUT Input) : COLOR0
{   
   return clamp(tex2D(Texture0, Input.TexCoord) + 
                tex2D(Texture1, Input.TexCoord) * abs(color), 0, 1);
}

使用 Direct3D API

要选择背景颜色作为 colorop 使用的参数

device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);
device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);

使用先前指定的原始 Material 的漫反射颜色。

或者使用一些恒定的颜色

device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_CONSTANT);
device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);
device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);

指定

device->SetTextureStageState(0, D3DTSS_CONSTANT, /* D3DCOLOR HERE */);

第二个纹理

device->SetTexture(1, tex);
device->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_TEXTURE);
device->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
device->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_ADD);

结果:

enter image description here

关于c++ - DirectX9 与 Alpha 的加法混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34726008/

相关文章:

c++ - 了解下限/上限接口(interface)

c++ - 提升正则表达式 : Specific Question

c++ - 发送带有libcurl C++问题的帖子请求:s

c++ - DirectX11 监视器句柄

时间:2019-03-09 标签:c++directxmulititextures

c++ - 可以通过使用输入寄存器来寻址输出 SIMD 寄存器

c++ - C/C++ Bug gdb atof(argv[1]) 需要更改为 idb 才能工作

directx - IDirect3D9::GetAdapterCount 找不到我的第二 block 显卡

c++ - 在 Direct3D11 中模拟 Direct3D9 固定功能管道

c++ - Direct3D 9 函数返回值