我正在使用带有DirectX的原生C ++在Windows手机上实现模糊效果,但看起来即使是最简单的小内核模糊也会导致可见的FPS下降。
float4 main(PixelShaderInput input) : SV_TARGET
{
float4 source = screen.Sample(LinearSampler, input.texcoord);
float4 sum = float4(0,0,0,0);
float2 sizeFactor = float2(0.00117, 0.00208);
for (int x = -2; x <= 2; x ++)
{
float2 offset = float2(x, 0) *sizeFactor;
sum += screen.Sample(LinearSampler, input.texcoord + offset);
}
return ((sum / 5) + source);
}
我目前正在使用此像素着色器进行一维模糊,并且它比没有模糊时更慢。真的是WP8手机硬件那么慢还是我犯了一些错误?如果是这样,你能指出我在哪里寻找错误吗?
谢谢。
答案 0 :(得分:1)
手机通常没有最佳的填充率,如果你的填充速率受限,模糊是你可以做的最糟糕的事情之一。使用gfxbench.com的填充测试中的一些数字,典型的手机填充率约为600MTex / s。有一些粗略的数学:
(600M texels / s)/(1280 * 720 texels / op)/(60帧/秒)〜= 11 ops / frame
所以在你的循环中,如果你的表面是整个屏幕,并且你正在进行5次读取和1次写入,那么你的11个操作中的6个用于模糊。所以我想说帧速率下降是预期的。解决这个问题的另一种方法是动态降低分辨率,并进行单线性高级渲染 - 您将从线性插值中获得不同类型的自然模糊,这可能是可以通过的,具体取决于您的视觉效果对