Что такое информационное свойство SwiftUI::Layer?
Я не смог найти ни одного документа или ресурса по этому поводу.
Он появляется в определении SwiftUI::Layer:
struct Layer {
metal::texture2d<half> tex;
float2 info[5];
/// Samples the layer at `p`, in user-space coordinates,
/// interpolating linearly between pixel values. Returns an RGBA
/// pixel value, with color components premultipled by alpha (i.e.
/// [R*A, G*A, B*A, A]), in the layer's working color space.
half4 sample(float2 p) const {
p = metal::fma(p.x, info[0], metal::fma(p.y, info[1], info[2]));
p = metal::clamp(p, info[3], info[4]);
return tex.sample(metal::sampler(metal::filter::linear), p);
}
};
Поле info
— это деталь реализации. Вам просто нужно использовать метод sample
.
Однако, поскольку тело метода sample
видно, мы можем понять, что означает info
.
Вот первая строка sample
:
p = metal::fma(p.x, info[0], metal::fma(p.y, info[1], info[2]));
Функция metal::fma(a, b, c)
вычисляет a * b + c
, но делает это без округления a * b
перед добавлением c
. («fma» означает «слитое умножение-сложение».) Не обращая внимания на проблему округления, мы можем переписать эту строку следующим образом:
p = float2( p.x * info[0].x + p.y * info[1].x + info[2].x, p.x * info[0].y + p.y * info[1].y + info[2].y );
Вы можете узнать это как выполнение 2D аффинного преобразования. Математически мы обычно записываем это как умножение вектора/матрицы в однородных координатах, например так:
⎡ a b 0 ⎤
( x y 1 ) ⎢ c d 0 ⎥
⎣ tx ty 1 ⎦
В данном случае p = float2(x, y)
, info[0] = float2(a, b)
, info[1] = float2(c, d)
и info[2] = float2(tx, ty)
.
Таким образом, мы можем понимать, что первые три элемента (с индексами 0, 1 и 2) info
содержат 2D-матрицу аффинного преобразования, которая преобразует координаты пользовательского пространства в координаты текстуры.
Вот вторая строка sample
:
p = metal::clamp(p, info[3], info[4]);
Это фиксирует p.x
к диапазону info[3].x ... info[4].x
и фиксирует p.y
к диапазону info[3].y ... info[4].y
.
Таким образом, мы можем понимать, что последние два элемента (с индексами 3 и 4) info
содержат границы (в координатах текстуры) изображения слоя внутри текстуры tex
.
Ваш ответ такой замечательный, спасибо.