Tôi đang sử dụng OpenGL (Phiên bản 4.4) (và C ++ nếu có vấn đề).
Tôi đã tạo trình kết xuất địa hình, địa hình được lưu trữ dưới dạng trường vô hướng 3D (isosurface / voxels). Nó sử dụng một phiên bản sửa đổi một chút của Marching Cubes , để thực hiện đa giác hóa (chuyển đổi trường vô hướng thành hình tam giác).
Hiện tại tôi đang kết cấu địa hình bằng cách sử dụng kết cấu ngang (cỏ) và kết cấu dọc (bụi bẩn). Sau đó, khi áp dụng kết cấu, tôi chỉ cần tính toán lượng kết cấu ngang và dọc được yêu cầu trên tam giác hiện tại, tùy thuộc vào quy tắc của tam giác hiện tại. Do đó, một bình thường càng hướng lên (hoặc xuống) thì kết cấu ngang (cỏ) sẽ càng chiếm ưu thế.
Trình kết xuất địa hình đang hoạt động
Bây giờ câu hỏi là, cách tốt nhất (hoặc tốt) để thực hiện Đa kết cấu trên địa hình là gì? Tôi cũng sẽ cung cấp cho tất cả các giá trị trong trường vô hướng một giá trị loại voxel . Vì vậy, câu hỏi chính là làm thế nào nên kết xuất đồ họa. Tôi có một vài ý tưởng về cách thực hiện điều này, nhưng tôi không chắc ý tưởng nào của tôi sẽ là ý tưởng tốt nhất để làm hoặc nếu có cách nào tốt hơn.
Ý tưởng đầu tiên
- Ràng buộc tất cả các kết cấu cần thiết, do đó gọi
glActiveTexture(...)
cho mỗi kết cấu có. - Bây giờ lưới có thể được kết xuất bằng một
glDraw*(...)
cuộc gọi duy nhất . - Điều này tất nhiên chỉ hoạt động nếu Shader biết khi nào và ở đâu sử dụng từng kết cấu, hoặc thông tin sử dụng từng kết cấu, được lưu trữ trong bộ đệm, như một loại giá trị mà Shader sử dụng, để "phát hiện" kết cấu nào đã sử dụng. Như đã đề cập trước đây, đây có thể là giá trị loại voxel .
Vấn đề: Số lượng kết cấu tối đa có thể bị ràng buộc đồng thời là rất hạn chế, do đó có thể (và có thể sẽ) tạo ra một số vấn đề.
Ý tưởng thứ hai
- Liên kết một kết cấu duy nhất và gọi
glDraw*(...)
với một giá trị cụ thểfirst
vàcount
để chỉ một phần của lưới được hiển thị. Mà tất nhiên là phần sử dụng kết cấu ràng buộc. - Do đó lặp vòng trên cho đến khi toàn bộ lưới được hiển thị bằng cách sử dụng tất cả các kết cấu riêng lẻ.
Tôi không thấy bất kỳ vấn đề thực sự nào với ý tưởng này, điều duy nhất chúng ta cần ghi nhớ, đó là tất cả các hình tam giác cần được sắp xếp theo voxel type
giá trị của chúng .
Mặc dù chúng ta sẽ không thể làm mờ kết cấu, như trong hình trên.
Ý tưởng thứ ba
- Chia lưới thành các bộ đệm riêng (VBO và VAO), sao cho mỗi bộ đệm chỉ sử dụng một (hoặc một vài) kết cấu. Về cơ bản giống như Ý tưởng thứ hai mặc dù ở đây, bộ đệm sẽ được phân chia vật lý theo kết cấu.
Ý tưởng thứ tư?
hoặc có một cách thậm chí tốt hơn?
Lưu ý bên
- Mỗi kết cấu có tay cầm riêng, do đó không ai trong số chúng có thể được sử dụng làm Texture Atlas .