我有一个Direct3D程序,它通过轨迹绘制而不是清除每一帧,它在屏幕上用alpha混合绘制一个黑色方块。渲染后,它会:
renderstate.alphablendenable = true;
renderstate.blendoperation = add;
renderstate.sourceblend = zero;
renderstate.destinationblend = invblendfactor;
renderstate.blendfactor = rgb(8,8,8);
然后它呈现正方形(请原谅伪代码)。这很好用,除了它没有完全清除屏幕。它留下了永久的痕迹,我无法弄清楚为什么。适当的混合应该在足够的帧完全淡化为黑色后,但这会留下灰色痕迹。任何人都知道Direct3D中为什么或更好的淡入淡出方法?
答案 0 :(得分:0)
有很多方法可以解决这个问题,具体取决于代码的其余部分的结构。例如,您可以将所有内容渲染到纹理,并使用黑色背景顶部的alpha下降而不是相反的方式渲染。
如果您不介意使用着色器,一种快速且相对有效的方法是将像素着色器应用于您正在“淡化”的任何内容。
相当于你现在正在做的事情的着色器(在顶部渲染低alpha黑色)将是这样的:
float4 FadeEffectShader(PixelInputType input) : SV_Target
{
float4 color;
color = shaderTexture.Sample(SampleType, input.tex);
color = color * 0.01;
return color;
}
你最终会沿着指数曲线逐渐消失颜色,为了这个例子的目的,它将永远不会等于零,你将留下一个漂亮的优雅淡出,直到几乎是黑色的地方。你真正想要的更像是:
float4 FadeEffectShader(PixelInputType input) : SV_Target
{
float4 color;
color = shaderTexture.Sample(SampleType, input.tex);
color = color * 0.01;
if(color.r<0.01) color.r = 0;
if(color.g<0.01) color.g = 0;
if(color.b<0.01) color.b = 0;
return color;
}
低于0.01的值的钳位将确保它们渐渐变为黑色而不是接近但不足够接近黑色。