2014-01-14 6 views
0

나는 다음과 같은 코드를 가지고 :다이렉트 X 9 버텍스 버퍼 D3DUSAGE_DYNAMIC 플래그를 사용하면 프로그램을 crashs

DirectX::device->CreateVertexBuffer(sizeof(VERTEX) * vertexCount, D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, VERTEXFORMAT, D3DPOOL_MANAGED, &vertexBuffer, NULL); 

VOID* vertexLocking; 
vertexBuffer->Lock(0, 0, (void**)&vertexLocking, 0); 
memcpy(vertexLocking, vertices, sizeof(VERTEX) * vertexCount); 
vertexBuffer->Unlock(); 

문제는 프로그램이 정점 버퍼의 잠금을 깨고() 함수를 유지한다는 것이다. 내가 얻는 오류는 "액세스 위반"입니다. 그러나 플래그에 대해 0을 입력하면이 작업이 정상적으로 수행됩니다.

버퍼의 정점 위치가 변경되기를 원했기 때문에이 값을 D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY으로 변경하려고 시도했지만 이제는 작동이 멈췄습니다. 나는 이유를 모른다. 도와주세요

답변

1

나는 문제가 무엇인지 발견 : 나는 D3DUSAGE_DYNAMIC를 사용하고 있기 때문에 | D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED와 호환되지 않습니다. 나는 그것을 D3DPOOL_DEFAULT로 바꾸었다.

0

D3DUSAGE_DYNAMIC과 D3DUSAGE_WRITEONLY가 충돌합니다. 버텍스 버퍼를 메모리에 어디에 두어야하는지 나타냅니다. 잠금을 설정하고 메모리에 액세스하려고 할 때 가장 많이 액세스 할 가능성이 있습니다.

일반적으로 자주 수정하려는 버퍼에는 동적 태그를 사용합니다. 그 깃발 만 가지고 가서 그 도움이 조금 있으면 도움이되는지보십시오.

MSDN link for usage flag descriptions