Что эквивалентно uintBitsToFloat и floatBitsToUint GLSL в языке затенения Metal?

Я конвертирую вычислительный шейдер с GLSL на язык затенения Metal. Я использую функции uintBitsToFloat и floatBitsToUint для хранения атомарных переменных. Каков их эквивалент в металле? Пример использования в GLSL:

shared uint ldsZMin;
...
float depth = -imageLoad( depthTexture, ivec2( globalThreadIdx.x, globalThreadIdx.y ) ).x;
uint z = floatBitsToUint( depth );
atomicMin( ldsZMin, z );

person SurvivalMachine    schedule 23.09.2016    source источник


Ответы (1)


Похоже, вы можете использовать для этого приведение as_type<type-id>().

В самом низу этой ссылки: https://developer.apple.com/library/content/documentation/Metal/Reference/MetalShadingLanguageGuide/data-types/data-types.html#//apple_ref/doc/uid/TP40014364-CH2-SW1

Язык затенения Metal добавляет оператор as_type, позволяющий интерпретировать любой скалярный или векторный тип данных (не являющийся указателем) как другой скалярный или векторный тип данных того же размера. Биты в операнде возвращаются напрямую без изменений как новый тип. Обычное повышение типа для аргументов функции не выполняется.

float f = 1.0f;
// Legal. Contains: 0x3f800000
uint u = as_type<uint>(f);

// Legal. Contains:
// (int4)(0x3f800000, 0x40000000,
//        0x40400000, 0x40800000)
float4 f = float4(1.0f, 2.0f, 3.0f, 4.0f);
int4 i = as_type<int4>(f);
person Robert Rouhani    schedule 23.09.2016