HRESULT DrawIndexedPrimitive( D3DPRIMITIVETYPE Type,
INT BaseVertexIndex,
UINT MinIndex,
UINT NumVertices,
UINT StartIndex,
UINT PrimitiveCount
);
위의 것이 함수의 원형입니다.
이 함수는 Render 에서 사용했던 것 기억하시죠?
자 제 강좌의 질문이 있었습니다.
Q : 인덱스버퍼를 사용하면 삼각형리스트를 삼각형스트립처럼 사용하는거에요~!? =_=a;;
A : 아닙니다.
이 질문에 대해서 좀 더 자세한 답이 필요할 것 같습니다.
위의 함수안에 들어가는 것을 설명하면 이 질문에 명확한 답이 생기겠네요.
첫째 D3DPRIMITIVETYPE Type 이건 도형을 어떻게 그려주느냐 라는 것입니다.
즉 TRIANGLELIST 또는 TRIANGLESTRIP 외에도 LINELIST 등등 많이 있습니다.
그중 자주 사용되는 것이 TRIANGLELIST 이기 때문에 이걸 사용하는 겁니다.
필요하다면 다른 플래그들을 넣어 줘도 됩니다.
단 넣어준 플래그들의 성격에 맞게 인덱스에 들어가는 값도 달라져야 겠죠.
두번째 INT BaseVertexIndex 여기에는 인덱스의 시작지점으로부터 우리가 그리고자 하는
정점이 시작되는 부분까지의 오프셋입니다.
만약 인덱스에 4개의 수를 넣었다고 하면, 우리는 삼각형을 그리기 위해서 정점 하나를
그리기 말아야 합니다. 그러면 첫번째것을 포기하던가 마지막것을 포기해야 겠지요.
그 중 마지막것을 포기하기는 그냥 하면 되니까 쉽습니다.
그런데 첫번째 것을 포기하려면 이 값을 1 이라고 적어주면 됩니다. 이해 하셨죠?
인덱스 리스트 내에서 시작되는 정점의 간격을 뜻합니다.
세번째 UINT MinIndex 이건 인덱스의 최소 수를 의미합니다.
흠..사실 의미 없는 수 입니다. 우리가 그려줘야 할건 전체 다입니다.
전체를 그려야 하는데 최소수가 뭔 필요 있습니까.
기본적인 0 을 집어 넣어 줬습니다.
네번째 UINT NumVertices 이건 해석을 해도 나오네요. 정점들의 수 입니다.
강좌에선 육각형을 그렸습니다. 각 정점은 노말값을 포함하고 있었습니다.
그래서 각 면에 4개의 정점이 필요했으며, 정점수 4 * 면수 6 = 24 개의 정점이 필요했습니다.
만약 난 세번째 사각형을 그리고 싶다라고 하면 정점수 4 * 사각형수 3 입니다.
즉, 현재 그리는 함수를 사용했을 때 그려지는 점의 수를 적으면 됩니다.
난 면하나만 그리는데? 라고 해도 그 전에 있는 점들의 수까지 다 더해줘야 합니다.
번역판 SDK 에는 이렇게 나와 있네요 "이 호출로 사용되는 정점의 수"
난해한 번역...;;
다섯번째 UINT StartIndex 이건 어느 인덱스부터 시작하겠느냐 이겁니다.
인덱스를 SDK 에서는 이해하기 편하게 정점군이라고 설명이 되어 있군요.(번역판)
즉, 난 두번째 인덱스부터 그리고 싶다. 그러면 1 이라고 적어두면 되겠죠.
언제나 시작은 0 이었으니까 말이죠.
여섯번째 UINT PrimitiveCount 는 도형의 수 입니다.
위의 첫번째 플래그에서 지정했던 도형의 모양이 있었습니다.
예를 들면 TRIANGLELIST 같은 경우 정점 세개의 한개의 도형이 나옵니다.
근데 난 사각형을 그릴때 면으로 안그리고 선으로 그리고 싶다.
그래서 LINELIST 를 사용했다고 합니다. 그럼 육면체를 그리기 위해 필요한 선의 개수는
몇개가 될까요? 12개의 직선 성분이 필요합니다.
그리고 인덱스 안에 들어가는 정점의 번호도 2개를 넣어야 겠지요.
이렇게 도형의 수를 정해 주면 되는 것입니다.
무난하게 삼각형을 그리고자 할 때는 삼각형의 개수를 적어주시면 됩니다.
선의 경우에는 선의 수를 적어주시면 되구요.
질문에 흡족할 만한 답이 되길 바라며 글을 적었습니다만...
제 개인적으로도 웅? 하는 식으로 가끔 아리송할 때가 있어서 말이죠...난감...;;
제 글이 여러분들에게 많은 도움이 되었으면 합니다. ^^
그리고 여러분의 질문에는 필요에 의하면 이렇듯 추가 강좌를 올릴 예정입니다.
그러니 부담가지지 마시고 마음껏 질문하세요~^^(웃고는 잇지만 배고파요...T^T)