2014-02-21 2 views
2

내 게임에서 일종의 하드웨어 인스 턴싱을 즉석에서 시도하고 있습니다. 한 번의 그리기 호출로 여러 개의 트리를 그립니다.월드 매트릭스 배열을 사용한 XNA 모델 인스턴스화

지금까지 모형, 텍스처 및 행렬 배열을 보유하는 클래스를 설정했습니다. 각 행렬은 게임 세계에서 한 트리의 위치에 해당합니다.

나는 수업 및 쉐이더 내에서 하드 코딩 된 한도로 50 개의 사본을 사용하기로 결정했습니다.

생성 된 행렬이 올바른 것입니다. 여러 그리기 호출과 함께 기본 효과를 사용하고 그 사이의 세계 행렬을 전환하면 정확한 위치에 정확한 수의 나무가 생깁니다.

내가 탄 -에 - 어둠의 접근 시도 : 놀랍게도

float4x4 View; 
float4x4 Projection; 
float4x4 World[50]; 

... 

VertexShaderOutput VertexShaderFunction(VertexShaderInput input) 
{ 
    VertexShaderOutput output[50]; 

    for (int i=0; i<50; i++) 
    { 
     float4 worldPosition = mul(input.Position, World[i]); 
     float4 viewPosition = mul(worldPosition, View); 
     output[i].Position = mul(viewPosition, Projection); 
     output[i].texCoord = input.texCoord; 

     return output[i]; 
    } 

} 

이 실제로 컴파일 않았고, 더욱 놀랍게도, 내 GPU 용융하지 않았다입니다.

깜짝 놀랄만한 것은 아니지만, 이것은 정상적인 마음으로 예상 할 수있는 것처럼 "return"키워드를 치는 순간 루프가 끝나는대로 첫 번째 트리 하나를 그립니다.

이런 종류의 문제로 Google 검색 기능을 시도했지만 결과의 대부분이 C++ 코드 (C# + XNA를 사용)를 처리했으며 문제에 대한 접근 방식은 기본적으로 필요한 모든 정보를 수집합니다. 모델의 꼭지점을 포개어 하나의 거대한 모델이 하나의 월드 매트릭스 위치로 그려지는 것처럼 모든 것을 전달합니다.

세계 매트릭스의 배열을 셰이더에 사용하여 하나의 모델을 그릴 수있는 확실한 방법이 있습니까? 아니면 모든 꼭지점 데이터를 수집하고 그런 방식으로 일괄 처리해야합니까?

+0

http://gamedev.stackexchange.com/에서 이와 같은 종류의 렌더링 질문에 더 많은 행운을 볼 수 있습니다. 게임 개발이 아니더라도 사람들이 이런 종류의 문제를 더 자주 처리 할 수 ​​있습니다. – Beska

+0

OK, 고맙습니다. 나는 그곳에도 시도 할 것입니다. – Eudaimonium

답변

0

하드웨어 인스 턴싱 전용 인 XNA의 전체 부분이 있습니다. 자신 만의 쉐이더를 작성할 수 있어야합니다. 쉐이더는 배우기가 대단히 어렵지 않습니다. 기본적으로 쉐이더에 행렬 배열과 하나의 기하학 메쉬가 있고 쉐이더는 각 행렬에 대해 한 번 메쉬가됩니다. 이 방법을 사용하면 대체 텍스처 좌표와 같은 대체 세계 행렬을 각 인스턴스에 전달할 수도 있습니다.

+0

그건 사실 내가하고 있었던 것이고, 그렇게 작동하지는 않습니다. 여러 정점 스트림을 사용하여 DrawInstancedPrimitives draw 호출을 사용하는 것이 맞았습니다. 세계 행렬의 전달 배열은 "모두 그리기 호출에서 모두 그리기"만큼 멀리 작동하지 않습니다. – Eudaimonium