3D 렌더링에서 인덱스의 목적은 무엇입니까?


11

OpenGL에서 3D 큐브를 작성한다고 가정하십시오. 오브젝트 (큐브)에 필요한 꼭짓점 데이터를 구현합니다. 인덱스 사용의 요점은 무엇입니까?

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);

위의 예에서 월드 공간에 필요한 꼭짓점이있는 큐브가 만들어집니다. 지수와의 관련성은 무엇입니까?


1
많은 곳에서 사람들이 얼굴을 부르는 것을 보게 될 것입니다. 그리고 그것이 그들이하는 것입니다. 각면은 보통 삼각형을 형성하기 위해 3 개의 꼭짓점으로 구성됩니다. 따라서 각 3 개의 인덱스는 최종 메쉬에서 하나의 삼각형에 해당합니다. 실제 정점 정보가 정점 배열에있는 위치의 오프셋이므로 주로 색인이라고합니다. 인덱스에 대해 알아야 할 모든 것, 나는 추측합니다 :)
Grimshaw

답변:


24

컬러 팔레트를 사용하여 2D 이미지의 메모리 공간을 줄이는 것과 같은 방식으로 3D 모델을 나타내는 데 필요한 메모리 공간을 줄이기위한 인덱스가 있습니다.

인덱싱을 사용하면 일반적으로 복잡한 모델에 대해 수행해야하므로 정점 데이터를 복제해야하는 경우 정점에 대한 전체 정의를 반복하지 않아도됩니다.

최신 3D API는 삼각형을 사용하여 렌더링합니다. 큐브의 각면에는 두 개의 삼각형이 필요합니다.

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

인덱스없이 해당면을 지정하려면 꼭짓점을 지정해야합니다 A, B, D, A, D, C. 정점 버퍼에서 두 개의 정점 ( AD)이 반복됩니다.

그러나 인덱스와 함께, 당신은 단지 필요한 정점 (포함 정점 버퍼 수 A, B, C,과 D) 여섯 개 인덱스를 : 0, 1, 3, 0, 3, 2. 인덱스는 일반적으로 정점보다 훨씬 작고 많은 정점이 일반적으로 실제 모델에서 반복되므로 공간을 크게 절약 할 수 있습니다.

일부 정점은 부분 속성 만 공유합니다. 예를 들어, 텍스처 매핑을 사용하여 큐브를 렌더링 할 때는 일반적으로 면당 고유 한 텍스처 좌표를 원하므로 위치와 텍스처 좌표가 동일한 여러 개의 정점이 있습니다. 그 양의 복제는 수용 가능하고 필요합니다. 인덱싱의 이점을보기 시작한 정점 속성 전체 를 복제 할 때 입니다.

실제로 모든 메쉬 정점이 100 % 고유 한 경우 인덱스의 이점이 없습니다 (사실 중복 인덱스 버퍼 소비에 더 많은 공간을 사용함). 그러나 항상 그런 것은 아닙니다.


1
대신 0,1,3, 0,1,2 여야합니까?
Sad CRUD 개발자

0, 1, 3, 0, 3, 2 실제로 감사합니다 (A = 0, B = 1, C = 2, D = 3 기준). 나는 대답을 업데이트했다.

아마도 삼각형 메쉬에서 꼭짓점에 인접한 삼각형의 평균 수는 6입니다.
Arne

7

인덱스를 사용하면 세 가지 주요 목적이 있습니다.

  • 원본 메쉬에서 중복 정점을 제거하여 메모리 요구 사항을 줄입니다.
  • 중복 정점을 한 번만 변환하여 정점 셰이더 계산을 줄입니다.
  • 프리미티브를 연결하면 드로우 콜을 줄일 수 있습니다.

이 중 첫 번째는 자신의 코드에서 직접 측정 할 수 있기 때문에 분명합니다. 메시가 50k 정점을 가지고 있지만 30k가 중복 된 경우 메모리를 절약 할 수 있습니다.

두 번째와 세 번째는 그다지 명확하지 않습니다. 이미 인덱스를 사용하기로 결정 했으므로 코드를 측정하고 "전"과 "후"성능을 분리하여 코드를 측정해야합니다.

두 번째 하드웨어는 최근에 변환 된 정점의 결과를 캐시 할 수 있습니다. 최근 변환 된 버텍스와 동일한 버텍스가 나오면 계산을 다시 수행하는 대신 캐시 된 버전을 사용할 수 있습니다. 하드웨어는 색인을 사용하여이를 식별하므로이 동작을 수행하려면 색인이 반드시 필요합니다.

세 번째로, 각각의 드로우 콜은 얼마나 많은 GPU 작업이 필요한지에 관계없이 CPU 오버 헤드가 있습니다. 다른 모든 것이 동일하다면, 1 그리기 호출에서 50k 메쉬를 그리는 것이 10k 그리기 호출에서 그리는 것보다 훨씬 빠릅니다. 그러나 메쉬가 여러 개의 스트립으로 구성되어 있거나 스트립과 팬의 조합으로 구성되어 있으면 (1) 인덱스를 사용하거나 (2) 축약 한 삼각형을 사용하지 않고 단일 드로우 콜로 수행 할 수 없습니다. 그러나 인덱스는 꼭짓점보다 훨씬 작기 때문에 일반적인 경우 인덱스를 사용하는 것이 좋습니다.


0

인덱스는 3 개의 정점 그룹이 함께 큐브의면을 형성하는 것을 말합니다. 삼각형의 세 꼭짓점 모두가 삼각형의 면인 것은 아닙니다.

각 정점을 정확히 한 번만 사용할 수 있고 삼각형 이상으로 사용되는 정점을 여러 번 반복 할 수 있지만 이는 추가 정점 변환을 의미합니다. 인덱스를 사용하면 꼭짓점을 한 번만 변환하고 필요한만큼 여러 번 사용할 수 있습니다.


삼각형을 의미 할 때 ??
Sad CRUD 개발자

최신 그래픽 하드웨어는 모든 것을 삼각형으로 렌더링합니다.

1
당신이 경우 정말 무슨 일이 일어나고 있는지 이해하려면, 일부 그래프 용지를 얻을 3D 정점을 그리고 인덱스로 지정된 정점 사이에 선을 그립니다.
ggambett
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.