【发布时间】:2016-05-12 14:37:30
【问题描述】:
我有一个未能解决的问题,所以我寻求您的帮助。 我正在开发一个 DirectX 应用程序,其中我的场景包含一个带有文本的页面,并且我正在尝试添加高亮显示逻辑。
所以我希望能够突出显示文本并更改此突出显示的颜色\不透明度。
为了做到这一点,我正在尝试使用 ID3D11BlendState。请考虑一些关于我如何创建它的代码 sn-p:
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,它看起来就很好:
但是,如果我尝试对其进行一些更改,-之前的任何颜色都会变成黑色: 我真的不明白为什么会这样,我请求你的指导! 提前谢谢!
【问题讨论】:
-
您是否在以前渲染的文本上渲染了一个纯色矩形?或者矩形是否使用带有文本的纹理?当一切都变黑时,你到底改变了什么?您之前和之后使用了哪些值?
-
我正在使用 d3d 重新渲染高光。我正在创建缓冲区、着色器等我更改了高亮颜色的 alpha 值,所以它是 0 1 0 1 然后是 0 1 0 0.9
-
那种混合状态看起来很奇怪。你确定这是你想要的吗?通常,您使用
SRC_ALPHA和INV_SRC_ALPHA进行源和目标混合。 -
@NicoSchertler 好吧,问题是,我希望黑色字母位于我的亮点之上。你所建议的只是不会削减它。
-
啊,您将文本顶部的高亮相乘。我无法解释为什么颜色会变成灰色。但我很确定你不会得到同样使用 alpha 的单通道解决方案。难道你不能只在文本下方绘制突出显示并使用通常的 alpha 混合吗?