2016-05-17 3 views
0

В настоящее время я разрабатываю игровой движок C# в XNA, в настоящее время я работаю над рутиной для маскировки 2D-текстуры с другой 2D-текстурой.openTK: запустить цикл на gpu?

до сих пор у меня есть эта рутина:

public static Texture2D MaskToTexture2DByTexture2D(GraphicsDevice device, Texture2D texture, Texture2D mask) 
    { 

     Texture2D output = new Texture2D(device, texture.Width, texture.Height); 

     int numberOfPixels = texture.Width * texture.Height; 

     Color[] ColorArray = new Color[numberOfPixels]; 
     Color[] maskColorArray = new Color[numberOfPixels]; 
     float[] maskArray = new float[numberOfPixels]; 

     mask = ResizeEngine.ResizeToSize(device, mask, new Point(texture.Width, texture.Height)); 

     mask.GetData<Color>(maskColorArray); 

     maskArray = ColorEngine.ConvertColorArrayToMaskValues(maskColorArray); 

     texture.GetData<Color>(ColorArray); 

     Parallel.For(0, ColorArray.Length, index => 
     { 
      ColorArray[index] *= maskArray[index]; 
     }); 

     output.SetData<Color>(ColorArray); 

     return output; 
    } 

ColorEngine в данный момент выполняет следующий метод:

public static float[] ConvertColorArrayToMaskValues(Color[] colors) 
    { 

     float[] mask = new float[colors.Count()]; 

     Parallel.For(0, colors.Length, index => { mask[index] = ConvertColorToMaskValue(colors[index]); }); 

     return mask; 
    } 

    public static float ConvertColorToMaskValue(Color color) 
    { 
     float mask = (color.R + color.G + color.B)/765.0f; 

     return mask; 
    } 

это работает, но не на основе, где я могу использовать его в режиме реального времени рендеринга Я бы хотел заменить петли Parallel.For на цикл, выполняемый GPU параллельно. Я импортировал библиотеку OpenTK, но я не могу найти документацию для приложения исполнения кода графического процессора из графических drawcalls по умолчанию.

это возможно? Или я трачу свое время здесь?

ответ

0

OpenTK - это связка CLI/CLR/.Net для OpenGL (и других медиа-интерфейсов). OpenGL - это API-интерфейс рисования, предназначенный для графических процессоров. Программы, выполняемые на графических процессорах, которые управляют операциями рисования, называются «шейдеры». OpenGL имеет функции загрузки и использования шейдеров для операций рисования. Таким образом, если вы хотите использовать OpenTK → OpenGL, вам нужно будет изучить API OpenGL и как написать шейдерные программы OpenGL.

это возможно? Или я трачу свое время здесь?

наиболее точно. Это яркий пример того, что вы сделали бы в так называемом фрагментаторе shader.

Смежные вопросы