2014-01-25 2 views
0

CreateInputLayout을 호출하면 정점 데이터에 대해 단일 버퍼를 사용하여 정확히 동일한 시맨틱 위치의 셰이더에서만 작동하는 입력 레이아웃이 생성됩니다.DX11 InputLayout을 여러 쉐이더로 설정할 수 없음

VSInput1 
{ 
    float3 Position : POSITION; 
    float2 TexCoord0 : TEXCOORD0; 
    float3 Normal : NORMAL; 
}; 

가 제대로 이상 번역되지 않습니다 : 예를 들어

VSInput1에서 VSInput1에서 VSInput2 및 입력 레이아웃, TEXCOORD0에 부착 된 쉐이더를 사용하는 동안,

VSInput2 
{ 
    float3 Position : POSITION; 
    float3 Normal : NORMAL; 
}; 

즉이 사용됩니다 자리가 NORMALVSInput2에서 VSInput1의 입력 레이아웃을 사용하고 있음에도 불구하고 NORMALTEXCOORD0 이후입니다.

이 동작은 CreateInputLayout은 셰이더가 셰이더를 소유하고 있는지 확인하기 위해 의미를 사용하고 그렇지 않으면 메모리에서 변수 위치를 무시합니다.

는 이러한 두 가지 옵션 중 하나가 필요하기 때문이 끔찍한입니다 :)

1을 VSInput2 쉐이더의 컴파일 된 쉐이더 코드를 사용하여 새 입력 레이아웃을 작성합니다.

그림자를 고려하여 여러 쉐이더를 사용해야하는 각 버퍼에 대해 새로운 입력 레이아웃을 만들려면 더 많은 메모리가 필요합니다. OpenGL은 버퍼에서 데이터가 있어야하는 위치를 결정하여 인접하지 않은 메모리 위치를 쉽게 처리합니다. DX11은 그렇지 않습니다.

2) 버텍스 데이터를 별도의 버퍼로 나누십시오.

메모리를 순서대로 사용하는 것, 즉 이전 버퍼의 다음 위치로 돌아 가기 위해 점프하는 것보다 속도가 느립니다. MS website 가입일

:

레지스터

로부터 판독 될 때 데이터가 재 해석 될 수있는 물품 않고도 상기 요구되는 방식으로 해석되는 레지스터를 확보하는 방법이 있는가 asm의 셰이더?

asm이 필요한 경우 어떻게 입력 레이아웃을 만들 수 있습니까?

+0

DX10 및 DX11은 초기화시 모든 것을 준비하고 프레임을 렌더링하는 동안 원치 않는 복잡하고 값 비싼 프로세스를 방지하기 위해이 메커니즘을 사용합니다. 현대 GPU는 버퍼를 쉽게 가져올 수있는 하드웨어가 없습니다. 이것은 버텍스 쉐이더가 각기 다른 버퍼 레이아웃을 위해 새로운 컴파일을 필요로한다는 것을 의미합니다. OpenGL은 각 무승부에서 DX9 게으른 방법을 계속 고수하고, 예기치 않은 렌더링 컨텍스트 때문에 컨트롤없이 트리거합니다. – galop1n

+0

제안 된 솔루션 1과 2는 GPU 옆의 하위 계층에서 다른 쉐이더가 필요하기 때문에 동일합니다. OpenGL은 API가 기존 호환성과 관련하여 더 신경을 쓰고 GPU 하드웨어와 거의 같지 않기 때문에 사전에 물건을 준비 할 기회를 놓치지 않습니다. – galop1n

답변

0

입력 레이아웃을 직접 만드는 것은 불가능합니다. 좀 더 일반적인 입력 어셈블리 메커니즘을 원한다면 언제든지 ShaderResourceView에서 정점 데이터를 읽고 원하는 논리를 사용하여 해석 할 수 있습니다. 그러나 레이아웃을 단일 셰이더 내에서 런타임에 융통성있게 사용하려면 성능을 저하시키는 중요한 분기 또는 사전로드 산술이 필요합니다.

더 나은 접근 방법은 사실 위의 옵션 (1)입니다. 다중 입력 레이아웃을 만드는 것이 메모리 요구 사항을 증가시키는 것은 사실이지만 런타임에는 훨씬 빠릅니다. 어떤 셰이더의 입력 레이아웃에 "그냥 작동"하려면 일종의 런타임 패치가 필요합니다. 눈에 띄는 프레임 속도 차이 대 수백 백 바이트의 오버 헤드? 나는 제발 perf를 가져갈 게.API를 통해 직접 노출되지는 않지만 동일한 성능상의 이유 때문에 OpenGL에서 동일한 일이 진행되고있는 것으로 의심됩니다.

궁극적으로 전환 입력 레이아웃은 일반적으로 비용이 많이 소요되므로 피해야합니다. 정말로, 최선의 방법은 단지 소수에 집중하고 필요할 때만 전환하는 것입니다. 결국 약간의 메모리 낭비가 발생할 수 있지만, VSInput2과 연결된 셰이더의 입력으로 VSInput1을 다시 사용하면 성능이 향상됩니다. float2 TexCoord0 : TEXCOORD0; 입력을 사용하지 않는 경우에도 마찬가지입니다.

실제로 가장 좋은 방법은 가장 좋은 것으로 생각하는 것을 구현하는 것입니다 (프로필). 성능 향상을위한 위치를 확인하십시오. 이것이 단순한 프로그래밍 단순화에 관한 것이 아니라면 어떤 경우에는 운이 좋지 않을 수 있습니다.

관련 문제