Ánh xạ UV điển hình là cái được gọi là phép biến đổi affine . Điều đó có nghĩa là ánh xạ của mỗi tam giác giữa không gian 3D và không gian kết cấu có thể bao gồm xoay, dịch, chia tỷ lệ / squash và nghiêng (nghĩa là bất cứ điều gì chúng ta có thể làm với phép nhân ma trận đồng nhất)
Vấn đề của các phép biến đổi affine là chúng đồng nhất trên toàn bộ miền của chúng - phép quay, dịch, tỷ lệ và độ nghiêng mà chúng ta áp dụng cho kết cấu gần đỉnh A giống như những gì chúng ta áp dụng gần đỉnh B, trong bất kỳ một tam giác nào. Các đường song song trong một không gian sẽ được ánh xạ thành các đường song song trong không gian khác, không bao giờ hội tụ / phân kỳ.
Nhưng sự giảm dần dần mà bạn đang cố gắng áp dụng không đồng nhất - đó là ánh xạ các đường song song trong kết cấu để hội tụ các đường trên lưới. Điều đó có nghĩa là quy mô của kết cấu được đo trên dải đang thay đổi liên tục khi chúng ta di chuyển xuống dải. Điều đó còn hơn cả các phép biến đổi affine của ánh xạ UV 2D có thể biểu thị chính xác: nội suy tọa độ uv 2D giữa các đỉnh liền kề sẽ có một tỷ lệ nhất quán dọc theo toàn bộ cạnh, ngay cả cạnh chéo sẽ bị thu hẹp theo tỷ lệ khi nó di chuyển xuống dải. Sự không phù hợp đó là những gì tạo ra ngoằn ngoèo.
Vấn đề này xuất hiện bất cứ lúc nào chúng ta muốn ánh xạ một hình chữ nhật thành hình thang - các mặt song song với các mặt hội tụ: không có biến đổi affine nào thực hiện điều này, vì vậy chúng ta phải ước tính nó một cách rõ ràng, dẫn đến các đường nối có thể nhìn thấy.
Đối với hầu hết các mục đích, bạn có thể giảm thiểu hiệu ứng bằng cách thêm nhiều hình học. Việc tăng số lượng các phân vùng dọc theo chiều dài của dải và chia dải thành hai hoặc nhiều đoạn dọc theo chiều rộng của nó, với các đường chéo của các hình tam giác được sắp xếp theo mô hình xương cá, có thể làm cho hiệu ứng ít được chú ý hơn. Nó sẽ luôn luôn xuất hiện ở một mức độ nào đó miễn là chúng ta đang sử dụng các phép biến đổi affine.
Nhưng có một cách xung quanh nó. Chúng ta có thể sử dụng cùng một mẹo mà chúng ta sử dụng để kết xuất 3D để vẽ hình thang theo phối cảnh cho các bức tường và sàn hình chữ nhật: chúng ta sử dụng tọa độ chiếu !
Kết cấu affine:
Hoạ tiết chiếu:
Để làm điều này, chúng ta cần thêm tọa độ uv thứ ba (uvw) và sửa đổi các shader của chúng ta.
Đưa ra một yếu tố tỷ lệ tại mỗi điểm (giả sử, bằng với độ rộng của dải của bạn tại điểm đó), bạn có thể xây dựng tọa độ uvw chiếu 3D từ tọa độ uv 2D thông thường của mình theo cách này:
Vector3 uv3 = ((Vector3)uv2) * scale;
uv3.z = scale;
Để áp dụng các tọa độ uvw 3D này cho lưới của bạn, bạn sẽ cần sử dụng các lưới Grid.SetUV quá tải Vector3 (kênh int, Danh sách uv)
Và hãy chắc chắn thay đổi cấu trúc đầu vào của shader của bạn để mong đợi tọa độ kết cấu 3D (được hiển thị ở đây bằng cách sử dụng trình đổ bóng không bật mặc định):
struct appdata
{
float4 vertex : POSITION;
float3 uv : TEXCOORD0; // Change float2 to float 3.
};
// Also do this for the uv sent from the vertex shader to the fragment shader.
Bạn cũng cần phải cắt bỏ macro TRANSFORM_TEX trong trình tạo bóng đỉnh, vì nó mong đợi một 2D 2D:
// o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.uv = v.uv;
// If you define a float4 with the special name _MainTex_ST,
// you can get the same effect the macro had by doing this:
o.uv.xy = o.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw;
Cuối cùng, để quay lại tọa độ kết cấu 2D để lấy mẫu kết cấu, bạn chỉ cần chia cho tọa độ thứ ba trong trình đổ bóng mảnh :
float2 uv = i.uv.xy / i.uv.z;
Vì chúng tôi đã thực hiện tọa độ uvw 3D này từ tọa độ 2D mong muốn của mình bằng cách nhân với cùng một số, hai thao tác hủy bỏ và chúng tôi quay lại tọa độ 2D mong muốn ban đầu của mình, nhưng bây giờ với phép nội suy phi tuyến tính giữa các đỉnh. : D
Điều quan trọng là phải thực hiện phép chia này cho mỗi phân đoạn chứ không phải trong trình tạo bóng đỉnh. Nếu nó được thực hiện trên mỗi đỉnh, thì chúng ta sẽ quay lại nội suy các tọa độ kết quả theo tuyến tính dọc theo mỗi cạnh và chúng ta đã mất tính phi tuyến mà chúng ta đang cố gắng giới thiệu với tọa độ chiếu!
id
vàcount
? Không gìUVs.ToArray()
làm gì? Làm thế nào bạn tải lên các đỉnh và tọa độ kết cấu vào thẻ?