[GPG 8 글 1.1] 인스턴싱 질문 부탁드립니다.ㅜㅜ

GPG 시리즈 관련 질답, 논의 공간.

Moderator: 류광

비회원

인스턴싱 질문 부탁드립니다.ㅜㅜ

Post by 비회원 »

안녕하세요
인스턴싱 구현해 너무 막혀서 제 생각대로 구현이 가능한거지 궁금해서 질문드립니다..

저는 각 메쉬들의 버텍스 버퍼를 가져와 그 버퍼의 Pos 값에 월드행렬을 곱해 글로벌 배열에 버퍼를 담아두는 방식으로
했습니다..

간단히 코드를 보자면


메쉬의 정점 정보? 를 가져온다
_pAttributeTable = new D3DXATTRIBUTERANGE;
DWORD iAtt;
_pMesh->m_pMesh->GetAttributeTable(_pAttributeTable, &iAtt);


메쉬의 버텍스 버퍼 가져와서 월드를 곱해 준후 글로벌에 담는다
Engine::VTXTEX* pVtxCube = NULL;

_pMesh->_pVB->Lock(0, 0, (void**)&pVtxCube, 0);
int j = 0;
int iSize = _pMesh->_pMesh->GetNumVertices();
for(; j < iSize; ++j)
{
D3DXVec3TransformCoord(&pVtxCube[j].vPos, &pVtxCube[j].vPos, &_pInfo->_matWorld);
}
_pMesh->_pVB->Unlock();

g_vecVB.push_back(&_pMesh->_pVB);





랜더 할 시 글로벌 버퍼를 통해서 그려준다
_pDevice->SetStreamSource(0, g_vecVB, 0, sizeof(Engine::VTXTEX));
_pDevice->SetIndices(g_pIB);
_pDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, _pAttributeTable->VertexCount, _pAttributeTable->FaceStart * 3, _pAttributeTable->FaceCount );


지금 랜더코드에서 SetStreamSource() 에 g_vecVB 를 하나의 버퍼로 바꿔준다면
DrawIndexedPrimitive() 로 한 루프로 여러 객체들을 한번에 그려질수 있는 건지 궁금합니다.
류광
Posts: 3805
Joined: 2001-07-25 09:00
Location: GPGstudy
Contact:

Post by 류광 »

DX 9인가요? 혹시 "DrawIndexedPrimitive() 로 한 루프로 ..."가 만일 루프를 돌려서 DrawIndexedPrimitive를 여러 번 호출하는 것을 말한다면 흔히 이야기하는 하드웨어 인스턴싱(성능 향상을 위한)은 아닌 것 같습니다.

DrawIndexedPrimitive를 한 번만 호출해서 같은 기하구조를 여러 개를 그리는 것이 목적이라면 SetStreamSourceFreq 메서드를 호출해서 반복 횟수를 지정해야 하는데요. SetStreamSourceFreq로 검색해 보면 참고할 자료가 많이 나옵니다.
비회원

Post by 비회원 »

류광 wrote:DX 9인가요? 혹시 "DrawIndexedPrimitive() 로 한 루프로 ..."가 만일 루프를 돌려서 DrawIndexedPrimitive를 여러 번 호출하는 것을 말한다면 흔히 이야기하는 하드웨어 인스턴싱(성능 향상을 위한)은 아닌 것 같습니다.

DrawIndexedPrimitive를 한 번만 호출해서 같은 기하구조를 여러 개를 그리는 것이 목적이라면 SetStreamSourceFreq 메서드를 호출해서 반복 횟수를 지정해야 하는데요. SetStreamSourceFreq로 검색해 보면 참고할 자료가 많이 나옵니다.

답변 정말 감사드립니다.

제가 글 올리기 전 SetStreamSourceFreq() 피하면서..해볼려했지만.. 필요한 거 였네요..

여러 사이트
SetStreamSourceFreq() 이거에 대한 함수 사용 문이 있으면 밑에 보시는 것처럼 글로벌 버텍스를 선언했는데
이거에 대한 내용은 있지만 어떤식으로 사용 한다라는 내용이 없어서 답답합니다..

어떤식으로 사용 해야 하나요?...


우선 메인 버텍스 버퍼와 세컨드 버텍스 버퍼에 들어갈 버텍스를 선언한다

//메인 버텍스 버퍼에 들어갈 버텍스 선언
const D3DVERTEXELEMENT9 g_VBDecl_Geometry[] =
{
{0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
{0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
{0, 24, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT, 0},
{0, 36, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BINORMAL, 0},
{0, 48, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
D3DDECL_END()
};

//세컨드 버텍스 버퍼에 들어갈 버텍스 선언
const D3DVERTEXELEMENT9 g_VBDecl_InstanceData[] =
{
{1, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1},
{1, 16, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 2},
{1, 32, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 3},
{1, 48, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 4},
{1, 64, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
D3DDECL_END()
};
류광
Posts: 3805
Joined: 2001-07-25 09:00
Location: GPGstudy
Contact:

Post by 류광 »

버퍼들 채우는 과정에서 막히시는 건가요? DX SDK의 Sample Browser 보면 Instancing이라는 예제가 있는데 전반적인 과정을 참고할 수 있을 것입니다.
비회원

Post by 비회원 »

류광 wrote:버퍼들 채우는 과정에서 막히시는 건가요? DX SDK의 Sample Browser 보면 Instancing이라는 예제가 있는데 전반적인 과정을 참고할 수 있을 것입니다.

오늘도 답변 감사드립니다.
아.. SetStreamSourceFreq() 아무리 봐도 ㅜㅜ 이 함수에 대한 이해가 어려워서..
한번 제 생각대로 구현 을 해봤습니다..

그래서 생각한 것이 객체 생성한 갯수 만큼 긴 버퍼를 하나 만들어서 그 버퍼에다가 월드행렬 * 정점을 해서 모조리 넣었습니다.

그리고 DrawIndexedPrimitive () 로 메쉬의 갯수만큼 곱해서 한꺼번에 그리도록 했씁니다..
결과는 차이가 없었습니다.. 한번만 그리긴 하지만 그 그리는 양이 많아 차이가 없다라는 걸 알았습니다...

음... SetStreamSourceFreq() 이 함수 없이는 다른 방식으로 구현이 불가능한건지요?? ㅜㅜ
Post Reply