Tôi đang làm việc trên một động cơ giống như Minecraft như một dự án sở thích để xem khái niệm về địa hình voxel có thể được đẩy lên phần cứng hiện đại và OpenGL> = 3. Vì vậy, tất cả hình của tôi bao gồm tứ giác hoặc hình vuông tóm lược.Làm thế nào để làm nội suy tuyến tính của normals trên một quad?
Tôi đã xây dựng một máy đo tia để ước tính sự tắc nghẽn môi trường xung quanh và sử dụng kỹ thuật "chuẩn mực uốn cong" để thực hiện ánh sáng. Vì vậy, các chuẩn mực của tôi không vuông góc với quad, cũng không có chiều dài đơn vị; thay vào đó, chúng chỉ về phía không gian nơi ít xảy ra tắc nghẽn nhất, và ngắn hơn khi quad nhận được ít ánh sáng hơn. Ưu điểm của kỹ thuật này là nó chỉ yêu cầu tính toán một lần của sự tắc nghẽn, và về cơ bản là miễn phí tại thời gian hiển thị.
Tuy nhiên, tôi gặp rắc rối khi cố gắng chỉ định các chỉ tiêu khác nhau cho các đỉnh khác nhau của cùng một quad để có được ánh sáng mượt mà. Bởi vì quad được chia ra thành hình tam giác, và tuyến tính nội suy sẽ xảy ra đối với từng hình tam giác, là kết quả của sự suy rõ ràng cho thấy sự hiện diện của hình tam giác như vật chéo xấu xí:
Vấn đề là OpenGL sử dụng barycentric nội suy trên mỗi tam giác, là tổng trọng số trên 3 trong số 4 góc. Lý tưởng nhất, tôi muốn sử dụng nội suy tuyến tính, trong đó tất cả 4 góc được sử dụng để tính toán kết quả.
tôi có thể nghĩ ra một số cách giải quyết:
Nhồi normals thành một kết cấu 2x2 RGB, và để cho các bộ xử lý kết cấu làm suy Bilinear. Điều này xảy ra với chi phí tra cứu kết cấu trong trình đổ bóng phân đoạn. Tôi cũng cần phải đóng gói tất cả các kết cấu mini này thành những cái lớn hơn cho hiệu quả.
Sử dụng thuộc tính đỉnh để đính kèm tất cả 4 chuẩn vào mỗi đỉnh. Cũng đính kèm một số hệ số [0..1] vào mỗi đỉnh, giống như tọa độ kết cấu và thực hiện phép nội suy song tuyến trong trình đổ bóng phân đoạn. Điều này xảy ra với chi phí chuyển 4 chỉ tiêu cho trình đổ bóng thay vì chỉ 1.
Tôi nghĩ cả hai kỹ thuật này có thể được thực hiện để làm việc, nhưng chúng khiến tôi trở thành những thứ cần đơn giản hơn nhiều. Có lẽ tôi có thể biến đổi các chuẩn mực bằng cách nào đó, do đó nội suy của OpenGL sẽ cho kết quả không phụ thuộc vào tam giác cụ thể được sử dụng.
(Lưu ý rằng vấn đề là không cụ thể cho normals, nó cũng không kém phần áp dụng đối với màu sắc hoặc bất kỳ giá trị khác mà cần phải được thông suốt nội suy trên một quad.)
Bất kỳ ý tưởng làm thế nào khác để tiếp cận vấn đề này? Nếu không, thì hai kỹ thuật nào ở trên sẽ là tốt nhất?
Tôi không muốn tăng mật độ lưới, vì tôi đang cố gắng đẩy càng nhiều khối càng tốt. Tôi biết làm thế nào để nội suy kết cấu của riêng tôi, nhưng tôi không muốn để lưu trữ các normals của tôi trong một kết cấu nếu tôi có thể giúp nó - vì thế câu hỏi này! – Thomas