Tôi đang cố gắng tìm hiểu một số WebGL (từ hướng dẫn này http://learningwebgl.com/blog/?page_id=1217). Tôi làm theo hướng dẫn, và bây giờ tôi đang cố gắng thực hiện bản demo của riêng mình. Tôi muốn tạo một đối tượng đồ họa có chứa bộ đệm và dữ liệu cho từng đối tượng riêng lẻ xuất hiện trong cảnh. Hiện tại, tôi có một bộ đệm đỉnh vị trí, một bộ đệm tọa độ kết cấu và một bộ đệm chuẩn. Trong hướng dẫn, ông sử dụng một bộ đệm khác, một bộ đệm chỉ mục, nhưng chỉ cho các hình khối. Bộ đệm chỉ mục thực sự là gì? Tôi có nên thực hiện nó, và nó có hữu ích cho bất cứ điều gì khác hơn là hình khối?Bộ đệm chỉ mục trong WebGL?
Trả lời
Đỉnh của đối tượng được xác định theo vị trí trong hệ tọa độ 3D (euclidian coordinate system). Vì vậy, bạn có thể lấy tất cả hai đỉnh sau và kết nối chúng với đường thẳng ngay sau khi hệ tọa độ 3D của bạn được chiếu lên màn hình 2D (màn hình hoặc một số hình ảnh đích) bởi rasterization process. Bạn sẽ nhận được cái gọi là wireframe.
Vấn đề của wireframe là không xác định. Nếu bạn nhìn vào khối lập phương khung dây ở các góc cụ thể, bạn không thể nói, khối lập phương được xoay chính xác như thế nào. Đó là vì bạn cần sử dụng visibility algorithms để xác định phần nào của khối lập phương gần với vị trí quan sát hơn (vị trí của máy ảnh).
Nhưng các dòng chính nó không thể xác định bề mặt, điều cần thiết để xác định cạnh nào của khối gần sát với người khác. Cách tốt nhất để xác định bề mặt trong đồ họa máy tính là đa giác, chính xác là hình tam giác (nó có rất nhiều khuyết điểm cho đồ họa máy tính).
Vì vậy, bây giờ bạn có khối lập phương được xác định bởi hình tam giác (vì vậy hãy gọi lưới tam giác).
Nhưng cách xác định đỉnh nào tạo thành hình tam giác? Bởi bộ đệm chỉ mục. Nó chứa chỉ mục cho bộ đệm đỉnh (danh sách với đỉnh của bạn) và cho thuật toán rasterizing mà ba đỉnh hình tam giác. Có rất nhiều cách, làm thế nào để giải thích các chỉ mục trong bộ đệm chỉ mục để giảm sự lặp lại của cùng một đỉnh (một đỉnh có thể là một phần của nhiều hình tam giác), bạn có thể tìm thấy một số tại article about graphics primitives.
Về mặt kỹ thuật, bạn không cần bộ đệm chỉ mục. Có hai cách để hiển thị hình học, với glDrawArrays
và glDrawElements
. glDrawArrays
không sử dụng bộ đệm chỉ mục. Bạn chỉ cần viết một đỉnh sau cái kia vào vùng đệm và sau đó báo cho GL biết phải làm gì với các phần tử. Nếu bạn sử dụng GL_TRIANGLES
làm chế độ trong cuộc gọi, bạn phải đặt ba bộ dữ liệu (đỉnh, bình thường, ...) vào bộ đệm, vì vậy khi sử dụng đỉnh nhiều lần, bạn phải thêm lần này vào bộ đệm.
glDrawElements
ngược lại có thể được sử dụng để lưu trữ một đỉnh một lần và sau đó sử dụng nó nhiều lần. Mặc dù vậy, khi bạn có một đỉnh, nơi bạn cần hai chỉ tiêu khác nhau (hoặc một thuộc tính khác như tọa độ kết cấu hoặc màu sắc), bạn phải lưu trữ nó cho mỗi bộ thuộc tính .
Đối với hình cầu glDrawElements
rất có ý nghĩa, vì có các tham số khớp nhau, nhưng đối với khối lập phương thì khác nhau, mặt trước cần khác bình thường so với mặt trên, nhưng vị trí của hai đỉnh là giống nhau . Bạn vẫn phải đặt vị trí vào bộ đệm hai lần. Đối với trường hợp đó glDrawArrays
có thể có ý nghĩa.
Tùy thuộc vào dữ liệu, cuộc gọi nào cần ít dữ liệu hơn, nhưng glDrawElements
linh hoạt hơn (vì bạn luôn có thể mô phỏng glDrawArrays
với bộ đệm chỉ mục chứa số 0, 1,2, 3, 4, ...).
- 1. 3 bộ đệm chỉ mục
- 2. Đấu tranh với Vertex và bộ đệm chỉ mục trong Direct3D
- 3. Làm cho bộ đệm sâu chỉ đọc
- 4. Nhiều bộ đệm logic trong một bộ đệm khung thực
- 5. Xóa các mục cụ thể khỏi bộ đệm của Django?
- 6. Lỗi bộ đệm trong avcodec_decode_audio4()
- 7. Bộ đệm sâu trong OpenGL
- 8. Bộ nhớ đệm mùa xuân so với bộ nhớ đệm
- 9. CUDA chỉ tắt bộ đệm L1 cho một biến
- 10. Bộ đệm mỗi tab trong vim
- 11. Bộ đệm C++ và cout, và bộ đệm nói chung
- 12. Chỉ có thể xóa một số họa tiết nhất định trong bộ đệm khung với hiển thị đa mục tiêu?
- 13. Biến bộ nhớ đệm trong biến $ _SESSION?
- 14. WebGL Đọc pixel từ điểm nổi hiển thị mục tiêu
- 15. WebGL: chỉ số enablevertexattribarray ra khỏi phạm vi
- 16. Hiển thị WebGL trong Xfvb
- 17. Bộ sưu tập lưu trong bộ nhớ đệm trong backbone.js?
- 18. Class.forName() bộ nhớ đệm
- 19. WebGL Framework
- 20. Tiêm bộ đệm khung
- 21. Dữ liệu/bộ đệm đệm giao thức Dump
- 22. Xóa ngữ cảnh WebGL
- 23. Xử lý bộ đệm gốc bộ đệm trực tiếp trong Java cho JOGL
- 24. Bộ đệm nhị phân trong Python
- 25. Phân bổ VBO hiệu quả trong WebGL
- 26. Bộ nhớ đệm trong của DbContext (?)
- 27. WebGL tạo Texture
- 28. Tìm kiếm toàn bộ danh mục/chỉ mục cho% book%
- 29. Bộ đệm đầu ra PHP
- 30. Cài đặt bản đồ rất đơn giản trong C (cho mục đích bộ nhớ đệm)?
Cảm ơn bạn đã giải thích rõ ràng và phức tạp! Chỉ cần những gì tôi đang tìm kiếm. – Sefu