DirectX9 添加剂与 alpha 混合
DirectX9 additive blending with alpha
我正在尝试实施加法混合,然后在 DirectX9 中对结果进行 alpha 混合。
渲染的背景:
我用于加法混合的图像:
我当前的渲染循环:
// 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)。但是,如果我错了,请纠正我。
这是结果(这正是我想要的):
剩下要做的就是使用 myColorDraw
中的 alpha,这样我就可以 "fade" 源图像,但我完全不知道如何将这两件事结合起来。 (我认为将所有颜色与 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
将select背景颜色作为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);
结果:
我正在尝试实施加法混合,然后在 DirectX9 中对结果进行 alpha 混合。
渲染的背景:
我用于加法混合的图像:
我当前的渲染循环:
// 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)。但是,如果我错了,请纠正我。
这是结果(这正是我想要的):
剩下要做的就是使用 myColorDraw
中的 alpha,这样我就可以 "fade" 源图像,但我完全不知道如何将这两件事结合起来。 (我认为将所有颜色与 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
将select背景颜色作为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);
结果: