2016-12-07 2 views
4

Metall unterstützt kernel zusätzlich zu den Standardfunktionen vertex und fragment Funktionen. Ich habe ein Metall kernel Beispiel gefunden, das ein Bild in Graustufen konvertiert.Metall Compute Kernel vs Fragment Shader

Was genau ist der Unterschied zwischen diesem Vorgang in einem kernel vs ? Was kann ein kernel berechnen (besser), dass ein fragment Shader nicht kann und umgekehrt?

+0

Der Hauptunterschied besteht darin, dass Sie keine Eckpunktpositionen (oder andere Netz-/Geometriedaten) an eine Kernelfunktion senden können, wie dies bei einer Fragmentfunktion der Fall wäre. Eine Fragmentfunktion gibt (normalerweise) eine Farbe für jedes Pixel der Ausgabentextur zurück, während eine Kernelfunktion, die keine Rückgabe hat (void), auf einer Textur oder einem Puffer arbeitet und mehrere Threads gleichzeitig auf Gittern ausführen kann Millionen von Threads. Kernel werden auch in GPGPU und wissenschaftlichen Simulationen nicht nur für die Bildverarbeitung verwendet, sondern eine Fragmentfunktion kann nur beim Rendern verwendet werden. – Marius

+0

Grundsätzlich die OpenCL von iOS? –

+0

Sie können so denken, ja. Aber nicht nur für iOS. Metal funktioniert auch auf tVOS und macOS. – Marius

Antwort

4

Metall hat vier verschiedene Arten von Befehlsgebern:

  • MTLRenderCommandEncoder
  • MTLComputeCommandEncoder
  • MTLBlitCommandEncoder
  • MTLParallelRenderCommandEncoder

Wenn Sie nur Grafik-Programmierung zu tun, du bist am vertrautesten mit der MTLRenderCommandEncoder. Dort würden Sie Ihre Vertex- und Fragment-Shader einrichten. Dies ist optimiert, um mit vielen Zeichenaufrufen und Objektprimitiven umzugehen.

Die Kernel-Shader werden in erster Linie für die MTLComputeCommandEncoder.10 verwendet. Ich denke, der Grund, dass ein Kernel-Shader und ein Computer-Encoder für das Bildverarbeitungsbeispiel verwendet wurden, liegt daran, dass Sie keine primitiven Zeichen wie mit dem Render-Befehlscodierer zeichnen. Obwohl beide Methoden Grafiken verwenden, werden in diesem Fall lediglich die Farbdaten einer Textur geändert, anstatt die Tiefe mehrerer Objekte auf einem Bildschirm zu berechnen.

Der Rechen Befehlscodierer auch leicht zu tun Parallel Computing mit Gewinden einzurichten:

https://developer.apple.com/reference/metal/mtlcomputecommandencoder

Also, wenn Ihre Anwendung Multithreading auf Datenänderung nutzen wollte, es ist einfacher zu tun, dass in diesem Befehl Encoder als der Render-Befehl Encoder.

Verwandte Themen