Mục đích của các chỉ số trong kết xuất 3D là gì?


11

Giả sử bạn đang tạo một khối 3D trong OpenGL. Bạn thực hiện dữ liệu đỉnh cần thiết cho đối tượng (khối lập phương). Điều gì sẽ là điểm của việc sử dụng các chỉ số?

v

 void CreateCube()
        {
            const Vertex VERTICES[8] =
            {
                { { -.5f, -.5f,  .5f, 1 }, { 0, 0, 1, 1 } },
                { { -.5f,  .5f,  .5f, 1 }, { 1, 0, 0, 1 } },
                { {  .5f,  .5f,  .5f, 1 }, { 0, 1, 0, 1 } },
                { {  .5f, -.5f,  .5f, 1 }, { 1, 1, 0, 1 } },
                { { -.5f, -.5f, -.5f, 1 }, { 1, 1, 1, 1 } },
                { { -.5f,  .5f, -.5f, 1 }, { 1, 0, 0, 1 } },
                { {  .5f,  .5f, -.5f, 1 }, { 1, 0, 1, 1 } },
                { {  .5f, -.5f, -.5f, 1 }, { 0, 0, 1, 1 } }
            };

            const GLuint INDICES[36] =
            {
                0,2,1,  0,3,2,
                4,3,0,  4,7,3,
                4,1,5,  4,0,1,
                3,6,2,  3,7,6,
                1,6,5,  1,2,6,
                7,5,6,  7,4,5
            };

    //....

    glBufferData(GL_ARRAY_BUFFER, sizeof(VERTICES), VERTICES, GL_STATIC_DRAW);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(INDICES), INDICES, GL_STATIC_DRAW);

Trong ví dụ trên, một khối lập phương được tạo ra với các đỉnh cần thiết trong không gian thế giới. Sự liên quan cho các chỉ số là gì?


1
Ở nhiều nơi bạn sẽ thấy mọi người gọi họ là khuôn mặt. Và đó là những gì họ đang có. Mỗi mặt thường được cấu tạo bởi 3 đỉnh, để tạo thành một hình tam giác. Do đó, mỗi 3 chỉ số tương ứng với một tam giác trong lưới cuối cùng. Chúng được gọi là các chỉ số bởi vì chúng chủ yếu là phần bù cho thông tin đỉnh thực sự nằm trong mảng đỉnh. Đó là tất cả những gì bạn cần biết về các chỉ số, tôi đoán vậy :)
Grimshaw

Câu trả lời:


24

Các chỉ số tồn tại để giảm dung lượng bộ nhớ cần thiết để thể hiện mô hình 3D, giống như cách sử dụng bảng màu để giảm dấu chân bộ nhớ của hình ảnh 2D.

Lập chỉ mục cho phép bạn tránh lặp lại định nghĩa đầy đủ về một đỉnh nếu bạn phải sao chép dữ liệu của đỉnh đó, như bạn thường phải làm đối với một mô hình phức tạp.

API 3D hiện đại kết xuất bằng hình tam giác; mỗi mặt của một khối lập phương cần hai hình tam giác:

A--B 
|\ |   This cube face has two triangles:
| \|   ABD and ADC.
C--D

Để chỉ định khuôn mặt đó mà không có chỉ số, bạn phải chỉ định các đỉnh A, B, D, A, D, C. Hai đỉnh ( AD) được lặp lại trong bộ đệm đỉnh.

Tuy nhiên, với chỉ số, bạn có thể có một bộ đệm đỉnh chỉ chứa các đỉnh cần thiết ( A, B, C, và D) và sáu chỉ số: 0, 1, 3, 0, 3, 2. Vì các chỉ số thường nhỏ hơn nhiều so với các đỉnh và nhiều đỉnh thường lặp lại trong các mô hình thực tế, đây có thể là một khoản tiết kiệm không gian đáng kể.

Lưu ý rằng một số đỉnh sẽ chỉ chia sẻ một phần thuộc tính. Ví dụ: khi hiển thị khối lập phương với ánh xạ kết cấu, người ta thường muốn tọa độ kết cấu duy nhất trên mỗi mặt, do đó bạn sẽ có nhiều đỉnh với cùng một vị trí và tọa độ kết cấu khác nhau. Số lượng trùng lặp đó là chấp nhận được và cần thiết; đó là khi bạn sao chép toàn bộ tập hợp các thuộc tính đỉnh mà bạn bắt đầu thấy lợi ích từ việc lập chỉ mục.

Nếu thực sự tất cả các đỉnh lưới của bạn là 100% khác biệt, thì không có lợi ích gì cho các chỉ số (thực tế bạn sẽ sử dụng nhiều không gian hơn trong việc tiêu thụ bộ đệm chỉ mục dự phòng). Điều này không phải lúc nào cũng xảy ra, tuy nhiên.


1
Thay vào đó nên là 0,1,3, 0,1,2?
Nhà phát triển CRUD buồn

0, 1, 3, 0, 3, 2 thực sự, cảm ơn (dựa A = 0, B = 1, C = 2, D = 3). Tôi cập nhật câu trả lời.

có lẽ điều đáng nói, trên một lưới tam giác, số tam giác trung bình tiếp giáp với một đỉnh là 6.
Arne

7

Sử dụng các chỉ số phục vụ ba mục đích chính:

  • Giảm yêu cầu bộ nhớ bằng cách cho phép các đỉnh trùng lặp được loại bỏ khỏi lưới ban đầu.
  • Giảm các tính toán đổ bóng đỉnh bằng cách cho phép các đỉnh trùng lặp chỉ được chuyển đổi một lần.
  • Kết hợp các nguyên thủy do đó cho phép bạn giảm các cuộc gọi rút thăm.

Trong số này, điều đầu tiên là rõ ràng bởi vì bạn có thể đo nó trực tiếp bằng mã của riêng bạn: nếu một lưới có 50k, nhưng nếu 30k trong số chúng là trùng lặp, thì bạn đã tiết kiệm bộ nhớ.

Thứ hai và thứ ba không quá rõ ràng - bạn cần phải đưa ra quyết định sử dụng các chỉ số và bạn cần lập hồ sơ mã của mình và cách ly hiệu suất "trước" và "sau" để đo lường chúng.

Đối với cái thứ hai, phần cứng có thể lưu trữ kết quả của các đỉnh được chuyển đổi gần đây. Nếu cùng một đỉnh được chuyển đổi gần đây, phiên bản được lưu trong bộ nhớ cache có thể được sử dụng thay vì phải thực hiện lại các phép tính. Phần cứng sử dụng chỉ mục để xác định những điều này, vì vậy các chỉ số là hoàn toàn cần thiết để có được hành vi này.

Đối với lần thứ ba, mỗi cuộc gọi bốc thăm bạn thực hiện có một chi phí hoạt động của CPU bất kể mức độ hoạt động của GPU cần thực hiện. Nếu mọi thứ khác bằng nhau, vẽ lưới 50k trong 1 cuộc gọi rút thăm sẽ nhanh hơn nhiều so với vẽ cuộc gọi rút thăm 10k. Nhưng nếu lưới của bạn gồm nhiều dải hoặc (thậm chí tệ hơn) là sự kết hợp giữa dải và quạt, bạn không thể thực hiện trong một cuộc gọi rút thăm mà không có (1) bằng cách sử dụng các chỉ số hoặc (2) giới thiệu các tam giác suy biến. Nhưng vì các chỉ số nhỏ hơn nhiều so với các đỉnh, nên sử dụng các chỉ mục được ưu tiên trong trường hợp chung.


0

Các chỉ số cho biết những nhóm ba đỉnh cùng nhau tạo thành các mặt của khối lập phương. Không phải mọi tập hợp ba đỉnh của tam giác đều là các mặt của tam giác.

Bạn có thể sử dụng mỗi đỉnh chính xác một lần và chỉ cần lặp lại nhiều lần những đỉnh được sử dụng nhiều hơn một hình tam giác, nhưng điều đó có nghĩa là biến đổi đỉnh thêm. Với các chỉ số, bạn biến đổi các đỉnh chỉ một lần và sử dụng chúng nhiều lần bạn cần.


Khi bạn có nghĩa là tam giác ??
Nhà phát triển CRUD buồn

Phần cứng đồ họa hiện đại tái hiện mọi thứ như hình tam giác.

1
Nếu bạn thực sự muốn hiểu những gì đang diễn ra, hãy lấy một số biểu đồ, vẽ các đỉnh 3D và vẽ các đường giữa các đỉnh được chỉ định bởi INDICE.
ggambett
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.