Вот как-то так. Но я не пишу на шарпе, поэтому мог сильно ошибиться. Да и вообще - фортранщики ликуют. Но всё же - как насчёт производительности?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication5
{
class Program
{
static unsafe void Main(string[] args)
{
const int H = 480;
const int W = 640;
byte[] a = new byte[H * W * 3];
byte[] b = new byte[H * W * 3];
byte* pa0, pa1, pa2f, pa2l, pa3, pb0, pb1, pb2f, pb2l, pb3;
int w = W * 3;
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
const int N = 13;
timer.Reset();
timer.Start();
const int frames = 1000;
for (int nn = 0; nn<frames; nn++)
{
fixed (byte* pa = &a[0])
{
fixed (byte* pb = &b[0])
{
for (int n = 0; n < N; n++)
{
pb0 = pb + w + 3; // другой массив
pa1 = pa + 3; // первый массив. первая строка
pa2f = pa + w; // первый массив. вторая строка
pa2l = pa1 + w + 3; // первый массив. вторая строка
pa3 = pa2 + w; // первый массив. третья строка
for (int y = 1; y < H - 1; y++)
{
for (int x = 1; x < w - 3; x = x + 3)
{
for (int color_shift = 0; color_shift < 3; color_shift++)
{
*pb0 = (byte)(0.25 * (*pa1
+ *pa3
+ *pa2f
+ *pa2l));
pb0 = pb0 + 1;
pa1 = pa1 + 1;
pa2f = pa2f + 1;
pa2l = pa2l + 1;
pa3 = pa3 + 1;
}
}
pb1 = pb1 + 6;
pa1 = pa1 + 6;
pa2f = pa2f + 6;
pa2l = pa2l + 6;
pa3 = pa3 + 6;
}
pa0 = pa + w + 3;
pb1 = pb + 3;
pb2f = pb + w;
pb2l = pb1 + w + 3;
pb3 = pb2 + w;
for (int y = 1; y < H - 1; y++)
{
for (int x = 1; x < w - 3; x++)
{
for (int color_shift = 0; color_shift < 3; color_shift++)
{
*pa0 = (byte)(0.25 * (*pb1
+ *pb3
+ *pb2f
+ *pb2l));
pa0 = pa0 + 1;
pb1 = pb1 + 1;
pb2f = pb2f + 1;
pb2l = pb2l + 1;
pb3 = pb3 + 1;
}
}
pa0 = pa0 + 6;
pb1 = pb1 + 6;
pb2f = pb2f + 6;
pb2l = pb2l + 6;
pb3 = pb3 + 6;
}
}
}
}
}
timer.Stop();
double dt = timer.Elapsed.TotalSeconds;
System.Console.WriteLine("N = {0} (R = {1}), dt={2} seconds, FPS = {3}",
N, 2 * N, dt, (frames / dt));
System.Console.ReadLine();
}
}
}