Как настроить UV для границ текстуры

Я создаю плоскость, которая может масштабироваться без пиксельного воздействия на края текстуры. Плоскость должна иметь возможность сохранять пропорции границ, но иметь возможность растягиваться практически до любого размера. Сетка имеет 8 вершин и 10 треугольников, образующих границу. Во всяком случае, вот что я получаю. Не обращайте внимания на числа в геометрии сетки.

введите здесь описание изображения

Можно ли отредактировать UV так, чтобы я получил желаемый результат? вот код:

Mesh mesh = new Mesh();
    var renderer = mesh.AddRenderer();


    //create verticies

    mesh.vertices = new Vector3[] {

        //vertices in order for convienience 
        Manager.GUI.ScreenToWorldPoint(new Vector3(0f,0f,0f)),                            //0
        Manager.GUI.ScreenToWorldPoint(new Vector3(padding,padding,0)),                   //1
        Manager.GUI.ScreenToWorldPoint(new Vector3(width - padding, padding,0f)),         //2
        Manager.GUI.ScreenToWorldPoint(new Vector3(width,0f,0f)),                         //3
        Manager.GUI.ScreenToWorldPoint(new Vector3(width - padding, height - padding,0f)),//4
        Manager.GUI.ScreenToWorldPoint(new Vector3(width,height,0f)),                     //5
        Manager.GUI.ScreenToWorldPoint(new Vector3(padding, height - padding, 0f)),       //6
        Manager.GUI.ScreenToWorldPoint(new Vector3(0f,height,0f)),                        //7
    };



    //create triangles
    mesh.triangles = new int[] {
        7,5,6,
        6,5,4,
        4,5,3,
        2,4,3,
        0,2,3,
        0,1,2,
        0,7,6,
        0,6,1,
        1,6,4,
        1,4,2
};

    //create UV's uvs are in order of creation for convienience
       mesh.uv = new Vector2[] {
           new Vector2(0f,0f),
           new Vector2(padding/width, padding/height),
           new Vector2((width-padding)/width, padding/height),
           new Vector2(1f,0f),
           new Vector2((width - padding)/width,(height-padding)/height),
           new Vector2(1f,1f),
           new Vector2(padding/width,(height-padding)/height),
           new Vector2(0f,1f)





    };



    mesh.calculateNormals();
    mesh.calculateBounds();
    renderer.Texture = mytex;
    return plane;
}

Отступы — это определенные пиксели вокруг текстуры, которые игнорируют масштабирование, а высота и ширина — это размеры фигуры.


person Fornoreason1000    schedule 14.05.2013    source источник
comment
Нет, это не так, он всегда будет растягиваться. У вас должны быть отдельные четырехугольники для верхнего, нижнего, левого, правого и каждого угла.   -  person George Duckett    schedule 14.05.2013
comment
@ Джордж, значит, мне нужно сгенерировать 9 самолетов? или мне нужно изменить геометрию, чтобы в ней было 9 четырехугольников (или 18 треугольников)? в любом случае даст ли то, как я настроил УФ, желаемый результат? также для tris шаблон индекса будет примерно таким (сверху вниз, слева направо, представляет следующую строку вниз) 13 11 10 9, 14 12 8 7, 15 2 4 6, 0 1 3 5   -  person Fornoreason1000    schedule 14.05.2013
comment
Четырехугольников будет 9, значит, 9 * 2 = 18 треугольников. Поскольку вы меняете свою геометрию, вам нужно будет изменить свои UVs, вам, вероятно, будет проще иметь одну текстуру для 4 прямых краев (поскольку они одинаковы, но повернуты) и одну для угла (как все 4). углы одинаковые, повернуты.).   -  person George Duckett    schedule 14.05.2013
comment
Используете ли вы пиксельные шейдеры для рендеринга треугольников? У меня может быть лучший ответ для вас, если вы это сделаете.   -  person Ani    schedule 14.05.2013
comment
Я использую только одну текстуру. последовательность UV, которую я только что дал вам, относится к новой сетке. Я просто хотел знать, действительны они или нет. в любом случае, спасибо   -  person Fornoreason1000    schedule 14.05.2013
comment
@ananthonline у ​​него есть пиксельный шейдер, но он встроенный, если вы хотите, чтобы я его отредактировал.   -  person Fornoreason1000    schedule 14.05.2013
comment
Я предполагаю, что вы не можете, тогда?   -  person Ani    schedule 15.05.2013
comment
нет, я не могу это редактировать... (она находится в библиотеке динамических ссылок),   -  person Fornoreason1000    schedule 15.05.2013


Ответы (1)


как сказал Джордж, сетка, которую я создавал, не позволяла масштабировать изображение без интереса. чтобы исправить сетку, пришлось переделать ее во что-то, что работает. код сейчас

Mesh mesh = new Mesh();
    var renderer = mesh.AddRenderer();
         mesh.vertices = new Vector3[] {

                //vertices in order for convienience  
                Manager.GUI.ScreenToWorldPoint(new Vector3(0f,0f,0f)),                            //0
                Manager.GUI.ScreenToWorldPoint(new Vector3(padding,0f,0f)),                      //1
                Manager.GUI.ScreenToWorldPoint(new Vector3(padding,padding,0)),                   //2
                Manager.GUI.ScreenToWorldPoint(new Vector3(width - padding, 0f,0f)),              //3
                Manager.GUI.ScreenToWorldPoint(new Vector3(width - padding, padding,0f)),         //4
                Manager.GUI.ScreenToWorldPoint(new Vector3(width,0f,0f)),                         //5
                Manager.GUI.ScreenToWorldPoint(new Vector3(width,padding,0f)),                    //6
                Manager.GUI.ScreenToWorldPoint(new Vector3(width , height - padding,0f)),         //7
                Manager.GUI.ScreenToWorldPoint(new Vector3(width - padding, height - padding,0f)),//8
                Manager.GUI.ScreenToWorldPoint(new Vector3(width,height,0f)),                     //9
                Manager.GUI.ScreenToWorldPoint(new Vector3(width - padding,height,0f)),           //10
                Manager.GUI.ScreenToWorldPoint(new Vector3(padding, height, 0f)),                 //11
                Manager.GUI.ScreenToWorldPoint(new Vector3(padding, height - padding, 0f)),       //12
                Manager.GUI.ScreenToWorldPoint(new Vector3(0f,height,0f)),                        //13
                Manager.GUI.ScreenToWorldPoint(new Vector3(0f,height - padding,0f)),              //14
                Manager.GUI.ScreenToWorldPoint(new Vector3(0f,padding,0f)),                       //15
            };



            //create triangles
            mesh.triangles = new int[] {
                15,2,0,
                1,0,2,
                1,2,4,
                1,4,3,
                3,4,6,
                3,6,5,
                4,8,7,
                4,7,6,
                8,10,9,
                8,9,7,
                12,10,8,
                12,11,10,
                14,11,12,
                14,13,11,
                15,14,12,
                15,12,2,
                2,12,8,
                2,8,4

    };

            //create UV's uvs are in order of creation for convienience
               mesh.uv = new Vector2[] {
                   new Vector2(0f,0f),   //0
                   new Vector2(padding / width, 0f), //1
                   new Vector2(padding/width, padding/height), //2
                   new Vector2((width-padding)/width, 0f), //3
                   new Vector2((width-padding)/width, padding/height), //4
                   new Vector2(1f,0f), //5
                   new Vector2(1f,padding / height), //6
                    new Vector2(1f, (height - padding) / height), //7
                   new Vector2((width - padding)/width,(height-padding)/height),//8
                   new Vector2(1f,1f), //9
                    new Vector2((width -padding)/width,1f), //10
                    new Vector2(padding/width,1f), //11
                   new Vector2(padding/width,(height-padding)/height), //12
                   new Vector2(0f,1f), //13
                   new Vector2(0f,(height - padding) / height), //14
                   new Vector2(0f,padding / height) //15





            };



            mesh.RecalculateNormals();
            mesh.RecalculateBounds();

            return plane;

надеюсь, это поможет другим программистам

person Fornoreason1000    schedule 14.05.2013