1

我有一个 Direct3D 程序,它不是清除每一帧,而是通过 alpha 混合在屏幕上绘制一个黑色方块。渲染后,它会:

renderstate.alphablendenable = true;
renderstate.blendoperation = add; 
renderstate.sourceblend = zero; 
renderstate.destinationblend = invblendfactor; 
renderstate.blendfactor = rgb(8,8,8);

然后它呈现正方形(请原谅伪代码)。这很好用,只是它不能完全清除屏幕。它留下了永久的痕迹,我不知道为什么。适当的混合应该在足够多的帧之后将其完全淡化为黑色,但这会留下灰色的痕迹。任何人都知道 Direct3D 中的原因或更好的淡入淡出方法吗?

4

1 回答 1

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 以下将确保它们褪色为黑色,而不是接近但不够接近黑色。

于 2013-07-19T05:25:15.013 回答