Share via


효과 10과 효과 11의 차이점

이 항목에서는 효과 10과 효과 11의 차이점을 보여 줍니다.

디바이스 컨텍스트, 스레딩 및 복제

ID3D10Device 인터페이스는 Direct3D 11의 두 인터페이스인 ID3D11Device 및 ID3D11DeviceContext로 분할되었습니다. 여러 ID3D11DeviceContexts를 만들어 여러 스레드에서 동시 실행을 용이하게 할 수 있습니다. 효과 11은 이 개념을 Effects 프레임워크로 확장합니다.

효과 11 런타임은 단일 스레드입니다. 따라서 여러 스레드가 동시에 있는 단일 ID3DX11Effect instance 사용하면 안 됩니다.

여러 인스턴스에서 Effects 11 런타임을 사용하려면 별도의 ID3DX11Effect 인스턴스를 만들어야 합니다. ID3D11DeviceContext도 단일 스레드이므로 적용 시 instance 각 효과에 서로 다른 ID3D11DeviceContext 인스턴스를 전달해야 합니다. 이러한 별도의 디바이스 컨텍스트를 사용하여 렌더링 스레드가 직접 디바이스 컨텍스트에 적용할 수 있도록 명령 목록을 만들 수 있습니다.

여러 스레드에서 사용하기 위해 동일한 기능을 캡슐화하는 여러 효과를 만드는 가장 쉬운 방법은 하나의 효과를 만든 다음 복제된 복사본을 만드는 것입니다. 복제는 여러 복사본을 처음부터 만드는 것에 비해 다음과 같은 이점이 있습니다.

  1. 복제 루틴은 생성 루틴보다 빠릅니다.
  2. 복제된 효과는 생성된 셰이더, 상태 블록 및 클래스 인스턴스를 공유하므로 다시 만들 필요가 없습니다.
  3. 복제된 효과는 상수 버퍼를 공유할 수 있습니다.
  4. 복제된 효과는 현재 효과(최적화되었는지 여부에 관계없이 변수 값)와 일치하는 상태로 시작합니다.

자세한 내용은 효과 복제 를 참조하세요.

효과 풀 및 그룹

지금까지 Direct3D 10에서 효과 풀을 가장 많이 사용하는 것은 자료를 그룹화하기 위한 것이었습니다. 효과 풀이 효과 11에서 제거되고 그룹이 추가되었습니다. 이는 재질을 보다 효율적으로 그룹화하는 방법입니다.

효과 그룹은 단순히 기술 집합입니다. 자세한 내용은 효과 그룹 구문(Direct3D 11) 을 참조하세요.

4개의 자식 효과와 하나의 효과 풀이 있는 다음 효과 계층 구조를 고려합니다.

// Effect Pool
cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;

// Effect Child 1
#include "EffectPool.fx"
technique10 GrassMaterialLowSpec { ... }

// Effect Child 2
#include "EffectPool.fx"
technique10 GrassMaterialHighSpec { ... }

// Effect Child 3
#include "EffectPool.fx"
technique10 WaterMaterialLowSpec { ... }

// Effect Child 4
#include "EffectPool.fx"
technique10 WaterMaterialHighSpec { ... }

그룹을 사용하여 효과 11에서 동일한 기능을 수행할 수 있습니다.

cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;

fxgroup GrassMaterial
{
    technique10 LowSpec { ... }
    technique10 HighSpec { ... }
}

fxgroup WaterMaterial
{
    technique10 LowSpec { ... }
    technique10 HighSpec { ... }
}

새 셰이더 단계

Direct3D 11에는 헐 셰이더, 도메인 셰이더 및 컴퓨팅 셰이더의 세 가지 새로운 셰이더 단계가 있습니다. 효과 11은 꼭짓점 셰이더, 기하 도형 셰이더 및 픽셀 셰이더와 비슷한 방식으로 이를 처리합니다.

Effects 11에 세 가지 새 변수 형식이 추가되었습니다.

  • 헐셰이더
  • DomainShader
  • ComputeShader

기술에서 이러한 셰이더를 사용하는 경우 "technique10"이 아니라 해당 기술에 "technique11"이라는 레이블을 지정해야 합니다. 컴퓨팅 셰이더는 다른 그래픽 상태(다른 셰이더, 상태 블록 또는 렌더링 대상)와 동일한 패스로 설정할 수 없습니다.

새 텍스처 형식

Direct3D 11은 다음 텍스처 유형을 지원합니다.

순서가 지정되지 않은 액세스 뷰

효과 11은 순서가 지정되지 않은 새 액세스 보기 유형을 가져오고 설정하는 것을 지원합니다. 이는 텍스처와 비슷한 방식으로 작동합니다.

다음 효과 HLSL 예제를 고려합니다.

  
RWTexture1D<float> myUAV;

다음과 같이 C++에서 이 변수를 설정할 수 있습니다.

  
ID3D11UnorderedAccessView* pUAVTexture1D = NULL;
ID3DX11EffectUnorderedAccessViewVariable* pUAVVar;
pUAVVar = pEffect->GetVariableByName("myUAV")->AsUnorderedAccessView();
pUAVVar->SetUnorderedAccessView( pUAVTexture1D );

Direct3D 11은 다음과 같은 순서가 지정되지 않은 액세스 보기 유형을 지원합니다.

  • RWBuffer
  • RWByteAddressBuffer
  • RWStructuredBuffer
  • RWTexture1D
  • RWTexture1DArray
  • RWTexture2D
  • RWTexture2DArray
  • RWTexture3D

인터페이스 및 클래스 인스턴스

인터페이스 및 클래스 구문은 인터페이스 및 클래스를 참조하세요.

효과에 인터페이스 및 클래스를 사용하는 경우 효과의 인터페이스 및 클래스를 참조하세요.

주소 지정 가능한 스트림 출력

Direct3D 10에서 기하 도형 셰이더는 하나의 데이터 스트림을 스트림 출력 단위 및 래스터라이저 단위로 출력할 수 있습니다. Direct3D11에서 기하 도형 셰이더는 최대 4개의 데이터 스트림을 스트림 출력 단위로 출력할 수 있으며, 이러한 스트림 중 하나 이상은 래스터라이저 단위로 출력할 수 있습니다. 이 새로운 기능을 반영하도록 ConstructGSWithSO 내장 함수가 업데이트되었습니다.

자세한 내용은 Stream Out 구문을 참조하세요.

디바이스 상태 설정 및 설정 해제

효과 10에서는 ID3D10EffectConstantBuffer::SetConstantBufferSetTextureBuffer 함수를 사용하여 사용자가 관리하는 상수 버퍼 및 텍스처 버퍼를 만들 수 있습니다. 이러한 함수를 호출한 후 Effects 10 런타임은 더 이상 상수 버퍼 또는 텍스처 버퍼를 관리하지 않으며 사용자는 ID3D10Device 인터페이스를 사용하여 데이터를 채워야 합니다.

효과 11에서는 다음 호출을 사용하여 상태 블록(혼합 상태, 래스터라이저 상태, 깊이 스텐실 상태 및 샘플러 상태)을 사용자 관리로 만들 수도 있습니다.

이러한 함수를 호출한 후 Effects 11 런타임은 더 이상 상태 블록 변수를 관리하지 않으며 값은 변경되지 않습니다. 상태 블록은 변경할 수 있으므로 사용자가 값을 변경하려면 새 상태 블록을 설정해야 합니다.

상수 버퍼, 텍스처 버퍼 및 상태 블록을 사용자가 아닌 관리형 상태로 되돌리기 수도 있습니다. 이러한 변수를 설정 해제하면 Effects 11 런타임은 필요할 때 계속 업데이트됩니다. 다음 호출을 사용하여 사용자 관리 변수를 설정 해제할 수 있습니다.

효과 가상 머신

함수 외부의 복잡한 식을 평가한 효과 가상 머신이 제거되었습니다.

복합 식의 다음 예제는 지원되지 않습니다.

  1. SetPixelShader( myPSArray( i * 3 + j ) );
  2. SetPixelShader( myPSArray( (float)i );
  3. FILTER = i + 2;

다음 예제에서는 복잡하지 않은 식이 지원됩니다.

  1. SetPixelShader( myPS );
  2. SetPixelShader( myPS[i] );
  3. SetPixelShader( myPS[ uIndex ] ); uIndex는 uint 변수입니다.
  4. FILTER = i;
  5. FILTER = ANISOTROPIC;

이러한 식은 상태 블록 식(예: FILTER) 및 전달 식(예: SetPixelShader)에 나타날 수 있습니다.

원본 가용성 및 위치

효과 10은 D3D10.dll 분산되었습니다. 효과 11은 해당 Visual Studio 솔루션을 사용하여 소스로 배포되어 컴파일합니다. 효과 유형 애플리케이션을 만들 때 해당 애플리케이션에 효과 11 원본을 직접 포함하는 것이 좋습니다.

Direct3D 11 업데이트의 효과에서 효과 11을 가져올 수 있습니다.

효과(Direct3D 11)