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.
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
Grundsätzlich die OpenCL von iOS? –
Sie können so denken, ja. Aber nicht nur für iOS. Metal funktioniert auch auf tVOS und macOS. – Marius