2014-10-23 18 views
5

Il kernel di calcolo di My Metal scrive su una trama con il formato MTLPixelFormat.RG16Float, numeri a virgola mobile a metà precisione. Questo perché Metal non supporta la scrittura su trame a virgola mobile a 32 bit.Come leggo i numeri in virgola mobile a metà precisione da una trama di metallo con Swift?

Ho bisogno di leggere questi numeri a metà precisione nel mio programma rapido? Ho spostato la trama in un array Swift UInt8, ma non riesco a capire come convertire i galleggianti a mezza precisione in galleggianti Swift.

+0

Dire, che cos'è un "kernel di calcolo del metallo"? URL ?? Saluti! – Fattie

+0

https://developer.apple.com/library/ios/documentation/Metal/Reference/MetalShadingLanguageGuide/func-var-qual/func-var-qual.html – Hallgrim

+0

wow. grazie ... – Fattie

risposta

3

MODIFICA: la risposta di seguito è stata scritta per Swift v1. Versioni successive di Swift hanno aggiunto il supporto tramite il tipo float16_t. La conversione manuale potrebbe essere ancora utile in alcuni casi.


Non esiste un metodo integrato per interpretare i mezzi come float, devi convertirlo tu stesso. Il mezzo datatype è un formato in virgola mobile che segue IEEE 754. È possibile leggere i valori nel programma rapido utilizzando UInt16 e quindi convertire da questo a un valore float. Non so di nessun routine di conversione scritte in Swift, ma qui ci sono due librerie scritte in C++ che potrebbero essere convertiti facilmente abbastanza:

http://mrob.com/pub/math/s10e5.h.txt

http://half.sourceforge.net/

Nella prima biblioteca È la function operator float() che è necessario convertire, che prende la variabile membro Uint16 _h ed emette un float.

3

In realtà la risposta di @Masza non è corretta. Potresti averli letti da un puntatore float16_t e convertirli in un normale float32_t. Non c'è bisogno di usare librerie esterne. Basta importare l'intestazione arm_neon.