2017-09-30 5 views
0

CPP : 는 https://github.com/walbourn/directx-sdk-samples/blob/master/Direct3D11TutorialsDXUT/Tutorial08/Tutorial08.cpp다이렉트 X 11 행렬 번역 내부 버텍스 쉐이더 또는 CPU

HLSL 다음 다이렉트 샘플 내부 https://github.com/walbourn/directx-sdk-samples/blob/master/Direct3D11TutorialsDXUT/Tutorial08/Tutorial08.fx

(튜토리얼 8), 그들은 (로컬 좌표로 정점을 초기화하는 나는 그렇게 생각하지 않는다 반드시 올바른 용어)

// Create vertex buffer 
    SimpleVertex vertices[] = 
    { 
     { XMFLOAT3(-1.0f, 1.0f, -1.0f), XMFLOAT2(1.0f, 0.0f) }, 
     { XMFLOAT3(1.0f, 1.0f, -1.0f), XMFLOAT2(0.0f, 0.0f) }, 
     { XMFLOAT3(1.0f, 1.0f, 1.0f), XMFLOAT2(0.0f, 1.0f) }, 
     { XMFLOAT3(-1.0f, 1.0f, 1.0f), XMFLOAT2(1.0f, 1.0f) }, 

     { XMFLOAT3(-1.0f, -1.0f, -1.0f), XMFLOAT2(0.0f, 0.0f) }, 
     { XMFLOAT3(1.0f, -1.0f, -1.0f), XMFLOAT2(1.0f, 0.0f) }, 
     { XMFLOAT3(1.0f, -1.0f, 1.0f), XMFLOAT2(1.0f, 1.0f) }, 
     { XMFLOAT3(-1.0f, -1.0f, 1.0f), XMFLOAT2(0.0f, 1.0f) }, 

     { XMFLOAT3(-1.0f, -1.0f, 1.0f), XMFLOAT2(0.0f, 1.0f) }, 
     { XMFLOAT3(-1.0f, -1.0f, -1.0f), XMFLOAT2(1.0f, 1.0f) }, 
     { XMFLOAT3(-1.0f, 1.0f, -1.0f), XMFLOAT2(1.0f, 0.0f) }, 
     { XMFLOAT3(-1.0f, 1.0f, 1.0f), XMFLOAT2(0.0f, 0.0f) }, 

     { XMFLOAT3(1.0f, -1.0f, 1.0f), XMFLOAT2(1.0f, 1.0f) }, 
     { XMFLOAT3(1.0f, -1.0f, -1.0f), XMFLOAT2(0.0f, 1.0f) }, 
     { XMFLOAT3(1.0f, 1.0f, -1.0f), XMFLOAT2(0.0f, 0.0f) }, 
     { XMFLOAT3(1.0f, 1.0f, 1.0f), XMFLOAT2(1.0f, 0.0f) }, 

     { XMFLOAT3(-1.0f, -1.0f, -1.0f), XMFLOAT2(0.0f, 1.0f) }, 
     { XMFLOAT3(1.0f, -1.0f, -1.0f), XMFLOAT2(1.0f, 1.0f) }, 
     { XMFLOAT3(1.0f, 1.0f, -1.0f), XMFLOAT2(1.0f, 0.0f) }, 
     { XMFLOAT3(-1.0f, 1.0f, -1.0f), XMFLOAT2(0.0f, 0.0f) }, 

     { XMFLOAT3(-1.0f, -1.0f, 1.0f), XMFLOAT2(1.0f, 1.0f) }, 
     { XMFLOAT3(1.0f, -1.0f, 1.0f), XMFLOAT2(0.0f, 1.0f) }, 
     { XMFLOAT3(1.0f, 1.0f, 1.0f), XMFLOAT2(0.0f, 0.0f) }, 
     { XMFLOAT3(-1.0f, 1.0f, 1.0f), XMFLOAT2(1.0f, 0.0f) }, 
    }; 

그러나 그들은 버텍스 쉐이더를 통해 위치를 번역하고 있습니다 :

이 (애니 메이팅/이동하지 않음) 정적 객체라면 당신은 여전히 ​​(확실하지 올바른 terminaology) 세계 위치를 번역 할 것이다, 또는 당신이 배치 할 것 :

1 :

XMMATRIX mWorldViewProjection = g_World * g_View * g_Projection; 

내 질문은 올바른 3D 공간/장면에서 객체하면 정점, 예를 초기화 할 때 :

{ XMFLOAT3(CorrectWorldX, CorrectWorldY, CorrectWorldZ), XMFLOAT2(1.0f, 0.0f) }, 

이의 완벽한 예는 무작위로 생성 수준/지형 될 것이다.

2 : 셰이더를 사용하여 꼭지점을 초기화 할 때 올바른 3D 세계 공간에서 위치를 지정하는 것보다 성능에 어떤 영향이 있습니까?

3 : 애니메이션의 경우 뼈대 변형에 적합한 문자 애니메이션입니까?

4 레벨을 만들 때 (객체 배치) 셰이더를 통해 번역 할 수밖에 없지만 마지막 위치도 저장할 수 있습니다.

DirectX 11 및 올바른 방법을 배우고 있기 때문에 희망적입니다.

답변

1
  1. 정적 객체는 재사용하지 않으면 실재 좌표에 배치해야합니다. 그런 다음 지오 메트릭을 사용하는 것이 가장 좋은 방법이지만, 로컬 공간에서 세계 공간으로 오브젝트를 배치/방향 지정하기 위해 변환 매트릭스를 전달하는 것이 가장 좋습니다. 예를 들어, 여러 번 사용할 트리는 각각 회전, 배율 및 변환을 위해 지정된 행렬을가집니다. 이 기술을 사용할뿐만 아니라 "인스턴스"버퍼를 사용하여 매트릭스를 GPU에 빠르게 공급하고 모델을 배치 할 때마다 GPU에 스톨을 방지합니다 (상수 버퍼를 사용하면 약간의 실속이 발생하므로 사용 많은 모델들에 적용됩니다).

  2. GPU에서 성능이 저하되는 정도는 CPU에서 수행하는 것보다 적습니다. 많이 쓰지는 않지만, GPU의 행렬 수학은 빵과 버터입니다. 물론, 스케일/회전/변환 행렬은 GPU에로드하기 전에 코드를 통해 준비되어야합니다. GPU는 테셀레이션하는 경우 버텍스 쉐이더 또는 도메인 쉐이더에서 로컬 영역에서 월드 공간으로 정점을 빠르게 배가시킵니다.

  3. 애니메이션에는 가중치와 뼈의 각 꼭지점의 영향과 관련된 몇 가지 사항이 있습니다. 정점이 하나 이상의 뼈대의 영향을받는다면 2 점 사이의 얼간이가 필요합니다. 하지만 그렇습니다. GPU가이 작업을 수행하는 것이 가장 좋습니다. 버텍스 쉐이더가 사용하는 인스턴스 버퍼로의 쉐이더 스트리밍을 계산하는 것이보다 완벽하고 빠른 방법입니다.

  4. 한 번 계산하려면 CPU가 괜찮지 만 각 모델의 행렬 인스턴스를 잡고 GPU가 정점 계산을 통해 작업하도록하는 것이 가장 좋습니다.메모리 사용량이 빠르게 증가하고 성능이 많이 저하되지 않으므로이 데이터를 저장하려고하지 않을 것입니다. 사실, 매번이 데이터를 GPU에로드해야하므로 캐싱의 이점도 얻지 못할 수도 있습니다.

행운

+1

감사합니다! 정확히 내가 무엇을 찾고 있었는지! – Mike5050

관련 문제