嗨,有一天我正在使用Directx11 API制作2D游戏。 并指出我需要使用透明效果。
所以我的背景是绿色,中间是一个脚印。 而且除了在像素着色器中不设置返回颜色的alpha值外,我没有做任何其他事情,但是问题是它不适用于白色。
这是Pixel Shader代码
cbuffer CB_TRANSPARENCY : register(b0)
{
float tp;
};
Texture2D footprint : register(t0);
SamplerState samplerState : register(s0);
struct PS_INPUT
{
float4 pos : SV_POSITION;
float2 tex : TEXCOORD;
};
float4 main(PS_INPUT input) : SV_Target
{
float3 texColor = footprint.Sample(samplerState, input.tex).xyz;
return float4(texColor, tp);
}
有什么我想念的吗? 还是我应该使用一些blendingstate的东西? 任何帮助将不胜感激
[edit]这是一些要编辑的东西。实际上,如果没有混合设置,alpha值不会做任何事情。仅一个变量可用于任何自定义计算。 在我的项目中,我使用了spritebathch,spritefont类在屏幕上呈现字体, 因此,我猜在spritebatch类中,可能在混合黑色的引擎盖下存在blendingState,因此我无需设置我的blendingState即可获得此效果。
答案 0 :(得分:0)
是的,您需要使用适当的alpha处理模式创建一个混合状态,然后确保在绘制之前将创建的混合状态附加到渲染管线的输出合并阶段:
D3D11_BLEND_DESC blendStateDesc{};
blendStateDesc.AlphaToCoverageEnable = FALSE;
blendStateDesc.IndependentBlendEnable = FALSE;
blendStateDesc.RenderTarget[0].BlendEnable = TRUE;
blendStateDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
blendStateDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
blendStateDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
blendStateDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA;
blendStateDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_DEST_ALPHA;
blendStateDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
blendStateDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
if(not SUCCEEDED(p_device->CreateBlendState(&blendStateDesc, &blendState)))
{
std::abort();
}
p_device_context->OMSetBlendState(blendState, nullptr, 0xFFFFFFFF);
//draw calls...