Центрирование заливки / подгонки 2D текстуры в Shader Metal - PullRequest
0 голосов
/ 04 марта 2020

Мне нужно отцентрировать его на 2D-текстуре при настройке подгонки / заполнения текстуры в виде, но я не могу настроить координаты uv.

Исходное изображение

При настройке заливки показывать первую часть изображения, а не центр:

Изображение заливки

при настройке по размеру, а не получить правильный центр:

Подходящее изображение

float2 adjustPos(float2 size,
                 float2 uv) {
    uv.x /= size.x;
    uv.y /= size.y;
    uv.y = 1.0f - uv.y;

    return uv;
}

float2 scaleTexture(texture2d<float, access::sample> tex2d,
                    float2 size,
                    float2 uv,
                    int mode) {
    int width = tex2d.get_width();
    int height = tex2d.get_height();
    float widthRatio  = size.x/width;
    float heightRatio = size.y/height;
    float2 pos;

    if (mode == 0) { // Aspect Fit
        int2 newSize = int2(width*widthRatio, height*widthRatio);
        pos = adjustPos(float2(newSize), uv);
        float y = (uv.y/size.y) / 2.0;
        y = y-pos.y;
        y = 1.0f-y;
        pos.y = y;
    } else if (mode == 1) { // Aspect Fill
        int2 newSize = int2(width*heightRatio, height*heightRatio);
        pos = adjustPos(float2(newSize), uv);

        if (newSize.x != size.x) {
            pos.x  = 0.5f + ((pos.x - 0.5f) * (1.0f - (heightRatio/100)));
        }
    } else {
        float scale = min(widthRatio, heightRatio);
        int2 newSize = int2(width*scale, height*scale);
        pos = adjustPos(float2(newSize), uv);
    }

    return pos;
}
...