2013-09-27 2 views
3

OpenGL에서 그리려면 꼭지점 배열을 지정한 다음 꼭지점 배열을 합쳐서 일련의 기본 요소로 연결합니다. glDrawElements로이 작업을 수행 할 수 있습니다. 정점을 지정하려면 glVertexPointer를 사용할 수 있습니다. 여기서 "stride"매개 변수를 지정할 수 있습니다. 즉, 배열의 인접한 요소 사이의 간격입니다 (즉, 다른 데이터가 포함 된 구조체에 정점을 저장하면 다른 데이터).OpenGL에서 스트라이드로 인덱스를 어떻게 지정합니까?

이것은 훌륭하지만, 지금은 Assimp을 사용하고 있습니다.이 부분은 얼굴 구조체에 색인을 지정합니다.

struct aiFace { 
    unsigned int* indices; 
    unsigned int numIndices; 
} 

아마도, 이는 다른 크기의 얼굴 메쉬 (삼각형 쿼드와 메쉬)를 지원한다. Assimp는 모든 메쉬를 삼각형화할 수있는 옵션을 갖기에 충분하므로 모든면을 동일한 프리미티브로 보장 할 수 있습니다.

gl/*...uh...*/ElementPointer(
    3, 
    GL_UNSIGNED_INT, 
    sizeof(unsigned int) /* skip past the num_indices field*/, 
    &faces[0]); 

하지만 할 방법을 알아낼 수 없습니다 :

따라서, 내가 정말 원하는 것은 같은 내 인덱스를 활보 할 수있을 것입니다. glDrawElements는 인덱스가 연속 배열임을 전제로합니다. OpenGL에서이 작업을 수행 할 수있는 방법이 있습니까?

답변

1

죄송합니다. OpenGL에 내장되어있는 기능을 지원하지 않습니다. 그러나 어쨌든 VBO에있는 Assimp에 의해로드 된 데이터를 버텍스 데이터와 요소 배열로 복사해야하므로이 단계에서 필요한 모든 재배치 작업을 수행 할 수 있습니다.

BTW : 스트라이드는 요소 시작 사이의 간격 띄우기를 나타내며 다음 요소를 시작할 요소 사이의 간격은 아닙니다.

0

가장 좋은 방법은 메쉬를 삼각형 화하는 것입니다. 따라서 GL_TRIANGLES (또는 재질/질감 등을 가능한 한 많이 고려하여) 한 번에 모든 것을 그릴 수 있습니다.

다른 크기의 다각형이 실제로 필요한 경우 가능합니다. 나는 그것이 매우 빠를 것이라고는 의심스럽고, 항상 좋은 결과를주지는 못하는 삼각형 분할을 수행하기 위해 GL_TRIANGLE_FAN을 사용해야한다고 생각합니다 (예 : 대각선을 따라 쿼드를 나눕니다). 어쨌든 대답 :

glPrimitiveRestartIndexglDrawElementsGL_TRIANGLE_FAN과 함께 정상적으로 작동하지만 실제로 삼각 측량하는 것이 가장 좋습니다.

glMultiDrawElements (사실 "gl ... ElementPointer"아이디어와 매우 비슷하지만) 아마도 slower than glPrimitiveRestartIndex입니다.

EDIT 또 다른 대안 glDrawElementsIndirect이지만 언뜻이 glPrimitiveRestartIndex보다 오버 헤드를 가질 수있다.

관련 문제