Địa hình & Đa kết cấu


7

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

địa hình Hình ảnh toàn màn hình

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ể firstcountđể 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 typegiá 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 .

Câu trả lời:


2

Thay vì glActiveTexture, bạn có thể liên kết một mảng kết cấu và lấy mẫu bao nhiêu họa tiết bạn thích ... NHƯNG !! Điều đó thật tốn kém, nếu bạn có 16 lớp, bạn sẽ đọc 16 mẫu và sau đó có lẽ chỉ một hoặc hai sẽ chiếm ưu thế.

Bạn có thể liên kết một mảng kết cấu và sau đó chỉ định chỉ mục của hai (hoặc ba) kết cấu chiếm ưu thế nhất và trọng lượng lấy mẫu.

Trọng lượng và chỉ số lấy mẫu có thể là các kết cấu hoặc tham số khác được truyền bởi đỉnh.


Làm thế nào để bạn liên kết và tạo ra một mảng kết cấu?
vallentin

Một mảng kết cấu về cơ bản là một texture3d không có nội suy trên liên kết Z. Nhưng tôi đọc bây giờ rằng mỗi kết cấu có tay cầm riêng của nó ..: - /
ilmale

Tôi đang sử dụng mảng kết cấu để đa địa hình và tôi đã lưu hai chỉ số nổi bật nhất cho mỗi đỉnh. tức là (1,0,7,3,0,3) cho một đỉnh có nghĩa là kết cấu một với 0,7 trọng lượng và kết cấu 3 với 0,3. Nhưng tôi không thể tìm ra cách sử dụng những thứ này mà không có tạo tác. Nếu chúng ta chỉ đơn giản sử dụng các giá trị nội suy cho các chỉ mục thì sẽ có các tạo tác khi các chỉ số thay đổi giữa các đỉnh. Ví dụ: đỉnh A là kết cấu hoàn toàn 1 và đỉnh B là kết cấu hoàn toàn 2. Nếu chúng ta nội suy chúng trong pixel shader sẽ có các pixel nơi chỉ số kết cấu trở thành 2. Bạn có gợi ý nào cho vấn đề này không?
morteza khosravi

1

Nếu bạn sáng tạo với dữ liệu bạn đóng gói vào câu, bạn có thể tạo tập bản đồ kết cấu.

Về cơ bản, bạn cần 3 bộ dữ liệu UV, thay vì bộ đơn thông thường. Mỗi đại diện cho ánh xạ cho một trong 3 kết cấu được sử dụng bởi tam giác đó. Kênh màu của bạn sẽ xác định số lượng này sẽ hiển thị thông qua.

Với trường voxel, bạn có thể tìm ra sự pha trộn này thông qua khoảng cách từ đỉnh.


0

Từ các tùy chọn bạn đề xuất, tôi sẽ gắn bó với việc chia lưới thành các lưới phụ được sắp xếp theo vật liệu / kết cấu. Điều này thực sự có thể nhanh hơn để kết xuất nếu tập dữ liệu của bạn thực sự rất lớn. Các cuộc gọi rút thăm OpenGL có thể không thành công do các điều kiện hết bộ nhớ, mặc dù bạn phải thực sự khó khăn để thực hiện.

Điều đó nói rằng, nếu bạn thực sự nghiêm túc trong việc tối ưu hóa trình kết xuất địa hình của mình, có lẽ bạn sẽ muốn thực hiện một số nghiên cứu về Ánh xạ kết cấu ảo (đôi khi được gọi là "Megatexenses"). Đây có lẽ là cách hiệu quả nhất để quản lý các tập dữ liệu kết cấu lớn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.