DirectX 混合状态问题
DirectX Blending State issue
我有一个问题我没能解决,所以我寻求你的帮助。
我正在开发一个 DirectX 应用程序,其中我的场景包含一个带有文本的页面,我正在尝试添加高亮显示逻辑。
所以我希望能够突出显示文本并更改此突出显示的颜色\不透明度。
为此,我正在尝试使用 ID3D11BlendState。请考虑一些关于我如何创建它的代码片段:
HRESULT hr = S_OK;
D3D11_BLEND_DESC blendDesc;
D3D11_RENDER_TARGET_BLEND_DESC rtBlend;
Microsoft::WRL::ComPtr<ID3D11BlendState> state;
auto d3dDev = this->dxDevMt.GetD3DDevice();
rtBlend.BlendEnable = TRUE;
rtBlend.SrcBlend = D3D11_BLEND_DEST_COLOR;
rtBlend.DestBlend = D3D11_BLEND_ZERO;
rtBlend.BlendOp = D3D11_BLEND_OP_ADD;
rtBlend.SrcBlendAlpha = D3D11_BLEND_ONE;
rtBlend.DestBlendAlpha = D3D11_BLEND_ZERO;
rtBlend.BlendOpAlpha = D3D11_BLEND_OP_ADD;
rtBlend.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
blendDesc.AlphaToCoverageEnable = FALSE;
blendDesc.IndependentBlendEnable = FALSE;
for (auto &i : blendDesc.RenderTarget) {
i = rtBlend;
}
hr = d3dDev->CreateBlendState(&blendDesc, state.GetAddressOf());
问题是,- 它没有按照我希望的方式工作。
只要 alpha 等于 1,它看起来就很好:
但是如果我尝试稍微改变它,- 之前的任何颜色都会变成黑色:
我真的不明白为什么会这样,我请求你的指导!。
提前致谢!
好的,我成功了。
如果有人遇到过此类问题,请尝试这样做:
首先,将高亮颜色传递给像素着色器。然后你想把这个颜色的 alpha 值当作白色(页面背景)和你的值之间的 lerp 值。
所以你的着色器大概看起来像这样:
cbuffer Buf0 : register(b0){
float4 Color;
}
struct PsInput{
float4 pos : SV_POSITION;
};
float4 main(PsInput input) : SV_TARGET{
float4 color2 = lerp(float4(1,1,1,1), Color, Color.a);
return color2;
}
然后你想将你的混合状态设置为乘法颜色:
rtBlend.BlendEnable = TRUE;
rtBlend.SrcBlend = D3D11_BLEND_DEST_COLOR;
rtBlend.DestBlend = D3D11_BLEND_ZERO;
rtBlend.BlendOp = D3D11_BLEND_OP_ADD;
rtBlend.SrcBlendAlpha = D3D11_BLEND_ZERO;// D3D11_BLEND_ONE;
rtBlend.DestBlendAlpha = D3D11_BLEND_ONE;// D3D11_BLEND_ZERO;
rtBlend.BlendOpAlpha = D3D11_BLEND_OP_ADD;
rtBlend.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
blendDesc.AlphaToCoverageEnable = FALSE;
blendDesc.IndependentBlendEnable = FALSE;
我有一个问题我没能解决,所以我寻求你的帮助。 我正在开发一个 DirectX 应用程序,其中我的场景包含一个带有文本的页面,我正在尝试添加高亮显示逻辑。
所以我希望能够突出显示文本并更改此突出显示的颜色\不透明度。
为此,我正在尝试使用 ID3D11BlendState。请考虑一些关于我如何创建它的代码片段:
HRESULT hr = S_OK;
D3D11_BLEND_DESC blendDesc;
D3D11_RENDER_TARGET_BLEND_DESC rtBlend;
Microsoft::WRL::ComPtr<ID3D11BlendState> state;
auto d3dDev = this->dxDevMt.GetD3DDevice();
rtBlend.BlendEnable = TRUE;
rtBlend.SrcBlend = D3D11_BLEND_DEST_COLOR;
rtBlend.DestBlend = D3D11_BLEND_ZERO;
rtBlend.BlendOp = D3D11_BLEND_OP_ADD;
rtBlend.SrcBlendAlpha = D3D11_BLEND_ONE;
rtBlend.DestBlendAlpha = D3D11_BLEND_ZERO;
rtBlend.BlendOpAlpha = D3D11_BLEND_OP_ADD;
rtBlend.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
blendDesc.AlphaToCoverageEnable = FALSE;
blendDesc.IndependentBlendEnable = FALSE;
for (auto &i : blendDesc.RenderTarget) {
i = rtBlend;
}
hr = d3dDev->CreateBlendState(&blendDesc, state.GetAddressOf());
问题是,- 它没有按照我希望的方式工作。 只要 alpha 等于 1,它看起来就很好:
好的,我成功了。 如果有人遇到过此类问题,请尝试这样做:
首先,将高亮颜色传递给像素着色器。然后你想把这个颜色的 alpha 值当作白色(页面背景)和你的值之间的 lerp 值。
所以你的着色器大概看起来像这样:
cbuffer Buf0 : register(b0){
float4 Color;
}
struct PsInput{
float4 pos : SV_POSITION;
};
float4 main(PsInput input) : SV_TARGET{
float4 color2 = lerp(float4(1,1,1,1), Color, Color.a);
return color2;
}
然后你想将你的混合状态设置为乘法颜色:
rtBlend.BlendEnable = TRUE;
rtBlend.SrcBlend = D3D11_BLEND_DEST_COLOR;
rtBlend.DestBlend = D3D11_BLEND_ZERO;
rtBlend.BlendOp = D3D11_BLEND_OP_ADD;
rtBlend.SrcBlendAlpha = D3D11_BLEND_ZERO;// D3D11_BLEND_ONE;
rtBlend.DestBlendAlpha = D3D11_BLEND_ONE;// D3D11_BLEND_ZERO;
rtBlend.BlendOpAlpha = D3D11_BLEND_OP_ADD;
rtBlend.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
blendDesc.AlphaToCoverageEnable = FALSE;
blendDesc.IndependentBlendEnable = FALSE;