2016-05-17 21 views
0

Ich entwickle gerade eine C# -Spielengine in XNA, ich arbeite gerade an einer Routine zum Maskieren einer 2D-Textur mit einer anderen 2D-Textur.openTK: Run für Schleife auf GPU?

bisher habe ich diese Routine:

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 gerade ausgeführt wird folgende Methode:

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; 
    } 

dies funktioniert, aber nicht auf einer Basis, wo ich es in der Echtzeit nutzen können machen Routine würde ich gerne die Parallel.For Schleifen in eine Schleife parallel von der GPU ausgeführt ersetzen. Ich habe die OpenTK-Bibliothek importiert, aber ich kann keine Dokumentation für die GPU-Codeausführung finden, die aus den Standard-Grafik-Drawcalls stammt.

ist das möglich? Oder verschwende ich meine Zeit hier?

Antwort

0

OpenTK ist eine CLI/CLR/.Net-Bindung für OpenGL (und andere Medien-APIs). OpenGL ist eine Grafik-API für Grafikprozessoren. Programme, die auf Grafikprozessoren ausgeführt werden, die Zeichenoperationen steuern, heißen "Shader". OpenGL hat Funktionen zum Laden und Verwenden von Shadern für seine Zeichenoperationen. Wenn Sie also OpenTK → OpenGL verwenden möchten, müssen Sie die OpenGL-API lernen und OpenGL-Shader-Programme schreiben.

ist das möglich? Oder verschwende ich meine Zeit hier?

sicherlich. Dies ist ein Paradebeispiel dafür, was Sie in einem so genannten Fragment Shader tun würden.