gl [Multi] DrawElements 등으로 그려진 OpenGL 정점의 인덱스 배열을 사용할 때를 명확하게 생각하려고 할 때 대 gl [Multi로 그려진 정점의 연속 배열을 단순히 사용해야하는 경우 ] 그리기 배열.언제 OpenGL 정점의 인덱스 배열을 사용해야합니까?
(는 업데이트 :. 하나는 항상 인덱스 정점을 사용하는 것이 내가 가진 응답에 합의는)
나는 앞뒤로이 문제에 대한 여러 번 갔다, 그래서 나는 윤곽을거야 내 현재의 이해, 희망에 누군가가 나에게 이제는 마침내 더 많거나 적은 정확하다고 말할 수 있습니다. 그렇지 않으면 남은 오해가 어디에 있는지를 지적 할 수 있습니다. 특히 세 가지 결론을 굵게 표시했습니다. 잘못 되었다면 수정하십시오.
하나의 간단한 경우는 내 지오메트리가 곡면으로 구성된 메쉬로 구성된 경우입니다. 이 경우 메쉬 중간의 정점은 정점을 사용하는 모든 삼각형에 대해 동일한 속성 (위치, 표준, 색상, 텍스처 좌표 등)을 갖습니다.
이 그렇게 결론 날 리드 : 몇 솔기 지오메트리를 들어
1. 인덱스 배열은 큰 승리입니다.
따르 규칙 1은 항상 제외 : 모든 가장자리는 솔기를 대표하는 매우 '육중 한'지오메트리를 들어
, 인덱스 배열의 장점은 덜 분명하다. 간단한 큐브를 예로 들자면, 각 꼭지점은 3 개의 다른면에서 사용되지만, 그 사이에 꼭지점을 공유 할 수는 없습니다. 왜냐하면 단일 꼭지점의 경우 표면 법선 (색상 및 텍스처 좌표)는 각 얼굴마다 다를 수 있습니다. 따라서 우리는 배열에 여분의 정점 위치를 명시 적으로 도입해야하므로 동일한 위치가 다른 법선 등으로 여러 번 사용될 수 있습니다. 즉, 인덱스 배열의 사용이 적습니다.
0 1
o---o
|\ |
| \ |
| \|
o---o
3 2
(앞면 모든 인접면 사이의 이음매가면 사이에 공유 될 수있는 이러한 정점 중에보다 의미 때문에이 분리되어 고려 될 수있다)
: 큐브의 하나의 얼굴을 렌더링 할 때 GL_TRIANGLE_FAN (또는 _STRIP)를 사용하여 렌더링하는 경우, 다음 큐브의 각면 따라서 렌더링 할 수 있습니다 :
verts = [v0, v1, v2, v3]
colors = [c0, c0, c0, c0]
normal = [n0, n0, n0, n0]
추가 인덱스 우리가이 문제를 단순화 할 수 없습니다. 이에서
나는 결론이 :
2. 다음 내가 인덱스 배열을 사용해서는 안됩니다, GL_TRIANGLE_STRIP 또는 _FAN을 사용하고 대신 항상 멀티 [GL 사용해야하는 경우, 모든 솔기 또는 대부분의 솔기를 지오메트리를 렌더링 ] 그리기 배열.
(업데이트 :)이 결과는이 결론이 잘못되었음을 나타냅니다.
: 인덱스 우리가 여기에 배열의 크기를 줄이기 위해 허용하지 않는 경우에도) 코멘트에서 논의
이2 규칙의 유일한 예외는, 그들은 여전히 때문에 다른 성능 이점 사용해야합니다 스트립이나 팬 대신에 GL_TRIANGLES를 사용할 때 각 큐브면이 두 개의 개별 삼각형으로 렌더링되기 때문에 꼭지점의 절반을 동일한 법선과 색상 등으로 두 번 다시 사용할 수 있습니다. 또, 동일한 단일 큐브 얼굴 : 정점 이후
verts = [v0, v1, v2, v2, v3, v0]
normals = [n0, n0, n0, n0, n0, n0]
colors = [c0, c0, c0, c0, c0, c0]
및 일반 3 수레 각각 자주, 그리고 : 인덱스없이
0 1
o---o
|\ |
| \ |
| \|
o---o
3 2
, GL_TRIANGLES를 사용하여 배열은 같은 것을 할 것
이verts = 6 * 3 floats = 18 floats
normals = 6 * 3 floats = 18 floats
colors = 6 * 3 bytes = 18 bytes
= 36 floats and 18 bytes per cube face.
(나는 다른 유형을 사용하는 경우 바이트 수는 변경 될 수 이해, 정확한 수치는 단지 illust위한 것입니다 : 색상은 종종에 대해, 각 큐브의 얼굴, 제공 3 바이트이며, . 배급) 지수와
, 우리는이 단순화 할 수 있습니다주는 작은 : 후자의 경우, 정점 0과 2 번 사용하는 방법
verts = [v0, v1, v2, v3] (4 * 3 = 12 floats)
normals = [n0, n0, n0, n0] (4 * 3 = 12 floats)
colors = [c0, c0, c0, c0] (4 * 3 = 12 bytes)
indices = [0, 1, 2, 2, 3, 0] (6 shorts)
= 24 floats + 12 bytes, and maybe 6 shorts, per cube face.
참조하지만, 단지 버텍스의 각 한 번 표현 , 법선 및 색상 배열. 모든 단일 기하학 모서리가 솔기가되는 극단적 인 경우에도 인덱스 사용에 대한 작은 승리처럼 들립니다.
이 그런 결론 날 리드 : GL_TRIANGLES를 사용하는 경우
3.
이 하나에도 항상 모든 솔기 지오메트리를 들어, 인덱스 배열을 사용해야합니다.틀린 경우 제 결론을 굵게 수정하십시오. 이에서
이 질문의 형식이 마음에 듭니다. – SimpleVar