2012-02-11 34 views
13

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í:

Diagonal lines visible in the rendered result

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:

  1. 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ả.

  2. 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?

Trả lời

4

Khi bạn hiểu rõ, nội suy tam giác mà GL sẽ làm không phải là thứ bạn muốn. Vì vậy, dữ liệu bình thường không thể đến trực tiếp từ dữ liệu đỉnh.

Tôi e rằng các giải pháp mà bạn đang hình dung là tốt nhất bạn có thể đạt được. Và không có vấn đề gì bạn chọn, bạn sẽ cần phải vượt qua [0..1] hệ số từ đỉnh đến bóng đổ (bao gồm cả kết cấu 2x2. Bạn cần chúng cho tọa độ kết cấu).

Có một số thủ thuật bạn có thể làm để đơn giản hóa quá trình này.

  • Sử dụng ID đỉnh có thể giúp bạn tìm ra đỉnh "góc" nào để chuyển từ đỉnh tới đổ bóng phân đoạn (giá trị [0..1] của chúng tôi). Một thử nghiệm bit đơn giản trên 2 bit thấp nhất có thể cho bạn biết góc nào cần chuyển xuống, mà không có đầu vào dữ liệu đỉnh thực tế. Nếu đóng gói dữ liệu kết cấu, bạn vẫn cần phải chuyển một số nhận dạng bên trong kết cấu, vì vậy điều này có thể là tranh luận.
  • nếu bạn sử dụng kết cấu 2x2 để cho phép nội suy, có (là?) Một số gotchas. Một số nội suy kết cấu không nhất thiết phải cung cấp nội suy chính xác cao nếu nguồn có độ chính xác thấp để bắt đầu. Điều này có thể yêu cầu bạn phải thay đổi kiểu dữ liệu kết cấu thành một cái gì đó có độ chính xác cao hơn để tránh hiện vật dải.
0

Vâng ... khi bạn đang sử dụng kỹ thuật Bent normals, cách tốt nhất để tăng kết quả là thử nghiệm lưới trước và tính toán lại bằng lưới với tessellation cao hơn.

Một cách khác sẽ là một số thủ thuật trong trình đổ bóng pixel ... một cách có thể - bạn thực sự có thể nội suy kết cấu của riêng bạn (và không sử dụng bộ nội suy tích hợp) trong trình đổ bóng pixel, có thể giúp bạn rất nhiều. Và bạn không bị giới hạn chỉ với nội suy song tuyến, bạn có thể làm tốt hơn, F.e. nội suy bicubic;)

+0

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

Các vấn đề liên quan