Warped texture on a non square quad

I’m generating a “non square” quad mesh and applying a texture to it. Unity will split the quad into triangles, and then the middle of the texture is at the halfway point of the edge between the 2 triangles, which I think is “Correct” but also obviously not what I’m looking for.


I have not been able to find a solution. Is there something I’m doing with the mesh that’s wrong? Do I have to do something special in the material?

        List<Vector3> verticies = new List<Vector3>();
        List<Vector2> uvs = new List<Vector2>();
        List<int> indices = new List<int>();

        verticies.Add(new Vector3(0.25f, 0.0f, 0.0f));
        verticies.Add(new Vector3(0.0f, 1.0f, 0.0f));
        verticies.Add(new Vector3(1.0f, 1.0f, 0.0f));
        verticies.Add(new Vector3(0.75f, 0.0f, 0.0f));

        uvs.Add(new Vector2(0.0f, 0.0f));
        uvs.Add(new Vector2(0.0f, 1.0f));
        uvs.Add(new Vector2(1.0f, 1.0f));
        uvs.Add(new Vector2(1.0f, 0.0f));


        mesh.SetUVs(0, uvs);
        mesh.SetIndices(indices.ToArray(), MeshTopology.Quads, 0);

What you are looking at is just affine texture mapping. Technically Unity (or your gpu) does perform perspective correct mapping, however since it’s not perspective that is causing the shrinking on one side, the GPU doesn’t get any hints how it should be corrected as every triangle is rendered on its own.

One solution is to use 3 or 4 component texture coordinates and a shader that can work with them to do the correction. Have a look at my answer over here and the SO post I’ve linked at the end. Unfortunately some of the blogs that did explain the concept quite well are not there anymore.