CreateInputLayout
을 호출하면 정점 데이터에 대해 단일 버퍼를 사용하여 정확히 동일한 시맨틱 위치의 셰이더에서만 작동하는 입력 레이아웃이 생성됩니다.DX11 InputLayout을 여러 쉐이더로 설정할 수 없음
VSInput1
{
float3 Position : POSITION;
float2 TexCoord0 : TEXCOORD0;
float3 Normal : NORMAL;
};
가 제대로 이상 번역되지 않습니다 : 예를 들어
VSInput1
에서 VSInput1
에서 VSInput2
및 입력 레이아웃, TEXCOORD0
에 부착 된 쉐이더를 사용하는 동안,
VSInput2
{
float3 Position : POSITION;
float3 Normal : NORMAL;
};
즉이 사용됩니다 자리가 NORMAL
VSInput2
에서 VSInput1
의 입력 레이아웃을 사용하고 있음에도 불구하고 NORMAL
은 TEXCOORD0
이후입니다.
이 동작은 CreateInputLayout
은 셰이더가 셰이더를 소유하고 있는지 확인하기 위해 의미를 사용하고 그렇지 않으면 메모리에서 변수 위치를 무시합니다.
는 이러한 두 가지 옵션 중 하나가 필요하기 때문이 끔찍한입니다 :)
1을 VSInput2
쉐이더의 컴파일 된 쉐이더 코드를 사용하여 새 입력 레이아웃을 작성합니다.
그림자를 고려하여 여러 쉐이더를 사용해야하는 각 버퍼에 대해 새로운 입력 레이아웃을 만들려면 더 많은 메모리가 필요합니다. OpenGL은 버퍼에서 데이터가 있어야하는 위치를 결정하여 인접하지 않은 메모리 위치를 쉽게 처리합니다. DX11은 그렇지 않습니다.
2) 버텍스 데이터를 별도의 버퍼로 나누십시오.
메모리를 순서대로 사용하는 것, 즉 이전 버퍼의 다음 위치로 돌아 가기 위해 점프하는 것보다 속도가 느립니다. MS website 가입일
:
레지스터
로부터 판독 될 때 데이터가 재 해석 될 수있는 물품 않고도 상기 요구되는 방식으로 해석되는 레지스터를 확보하는 방법이 있는가 asm의 셰이더?
asm이 필요한 경우 어떻게 입력 레이아웃을 만들 수 있습니까?
DX10 및 DX11은 초기화시 모든 것을 준비하고 프레임을 렌더링하는 동안 원치 않는 복잡하고 값 비싼 프로세스를 방지하기 위해이 메커니즘을 사용합니다. 현대 GPU는 버퍼를 쉽게 가져올 수있는 하드웨어가 없습니다. 이것은 버텍스 쉐이더가 각기 다른 버퍼 레이아웃을 위해 새로운 컴파일을 필요로한다는 것을 의미합니다. OpenGL은 각 무승부에서 DX9 게으른 방법을 계속 고수하고, 예기치 않은 렌더링 컨텍스트 때문에 컨트롤없이 트리거합니다. – galop1n
제안 된 솔루션 1과 2는 GPU 옆의 하위 계층에서 다른 쉐이더가 필요하기 때문에 동일합니다. OpenGL은 API가 기존 호환성과 관련하여 더 신경을 쓰고 GPU 하드웨어와 거의 같지 않기 때문에 사전에 물건을 준비 할 기회를 놓치지 않습니다. – galop1n