2012-12-23 34 views
12

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

6

Đỉ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.

cube 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).

cube triangle mesh

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.

+0

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

4

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 glDrawArraysglDrawElements. 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, ...).

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