自旋/旋转模糊

如何在图像上执行循环/旋转/旋转模糊 – 使用DirectX9.0和HLSL?

例如:

径向模糊 -  Apple.com提供

您将需要在极地坐标工作。 为了将笛卡儿坐标转换为极坐标,可以使用以下命令:

r = sqrt(x * x + y * y); theta = atan2(y, x); 

这将获得{0, 0}周围的坐标 – 所以我们需要在转换之前更改笛卡尔的原点:

 float mx = x - 0.5; float my = y - 0.5; float r = sqrt(mx * mx + my * my); float theta = atan2(y, x); 

一旦你有极坐标,你可以使用一个典型的多抽头模糊来执行模糊。

 const int SAMPLES = 15; extern float PARAM_RadialBlurLength = 0.01f; // In radians float2 offsetCoord = inputTexCoord - float2(0.5, 0.5); float r = length(offsetCoord); float theta = atan2(offsetCoord.y, offsetCoord.x); float4 sum = (float4)0; float2 tapCoords = (float2)0; for(float i = 0; i < SAMPLES; i++) { float tapTheta = theta + i * (PARAM_radialBlurLength / SAMPLES); float tapR = r; // If you alter this according to 'i' you will get a swirl. // Remember we need to invert the origin offset we // used to create the co-ordinates, the the + 0.5 on each. tapCoords.x = tapR * cos(tapTheta) + 0.5; tapCoords.y = tapR * sin(tapTheta) + 0.5; sum += tex2D(inputSampler, tapCoords); } sum /= SAMPLES; return sum; 

模糊只是使用时间上的连贯性。 你用什么技术来实现它并不重要,只要你知道如何做alpha,你都可以去。

 loop { lastRotation = currentRotation ++currentRotation; draw image texture at lastRotation with some degree of alpha (eg. 50%, this is the blur) draw image texture at currentRotation with full alpha (the actual image that is spinning) } 

当然,你不需要只有一个lastRotation ,你可以有一个数组,你可以在你的实际旋转图像背后有一个大的模糊。 随着时间的推移,每一个都将反映出轮换。

HTH。