다음을 통해 공유


효과 복제

효과를 복제하면 효과의 거의 동일한 두 번째 복사본이 만들어집니다. 정확하지 않은 이유에 대한 설명은 다음 단일 한정자를 참조하세요. 효과의 두 번째 복사본은 효과 런타임이 스레드로부터 안전하지 않으므로 여러 스레드에서 효과 프레임워크를 사용하려는 경우에 유용합니다.

디바이스 컨텍스트도 스레드로부터 안전하지 않으므로 다른 스레드는 ID3DX11EffectPass::Apply 메서드에 다른 디바이스 컨텍스트를 전달해야 합니다.

효과는 다음 구문을 사용하여 복제할 수 있습니다.

ID3DX11Effect* pClonedEffect = NULL;
UINT Flags = D3DX11_EFFECT_CLONE_FORCE_NONSINGLE;
HRESULT hr = pEffect->CloneEffect( Flags, &pClonedEffect );

위의 예제에서 복제된 복사본은 원래 효과의 상태에 관계없이 원래 효과와 동일한 상태를 캡슐화합니다. 특히 다음 사항에 주의하십시오.

  1. pEffect가 최적화되면 pCloned 효과가 최적화됩니다.
  2. pEffect에 일부 사용자 관리 변수가 있는 경우 pCloned Effect에는 동일한 사용자 관리 변수가 있습니다(아래의 단일 설명 참조).
  3. pEffect의 보류 중인 변수 업데이트(호출 적용이 디바이스 상태를 업데이트할 때까지)는 pClonedEffect에서 보류 중입니다.

다음 Direct3D 11 디바이스 개체는 효과 프레임워크에서 변경할 수 없거나 업데이트되지 않으므로 복제된 효과는 원래 효과와 동일한 개체를 가리킵니다.

  1. 상태 블록 개체(ID3D11BlendState, ID3D11RasterizerState, ID3D11DepthStencilState, ID3D11SamplerState)
  2. 셰이더
  3. 클래스 인스턴스
  4. 텍스처(텍스처 버퍼 포함 안 됨)
  5. 순서가 지정되지 않은 액세스 뷰

다음 Direct3D 11 디바이스 개체는 변경이 불가능하며 효과 런타임에 의해 수정됩니다(복제된 효과에서 사용자 관리 또는 단일이 아닌 경우). 이러한 개체의 새 복사본은 단일이 아닌 경우 만들어집니다.

  1. 상수 버퍼
  2. 텍스처 버퍼

단일 상수 버퍼 및 텍스처 버퍼

이 설명은 상수 버퍼와 텍스처 모두에 적용되지만 상수 버퍼는 읽기 용이한 것으로 간주됩니다.

상수 버퍼가 하나의 스레드에서만 업데이트되지만 복제된 효과에 의해 설정된 디바이스 상태가 이 데이터를 사용하는 경우가 있을 수 있습니다. 예를 들어 기본 효과는 세계를 변경하고 행렬을 보지 않는 복제된 효과의 셰이더에서 참조되는 월드 및 뷰 행렬을 업데이트할 수 있습니다. 이러한 경우 복제된 효과는 다시 만드는 대신 현재 상수 버퍼를 참조해야 합니다.

이 원하는 결과를 달성하는 방법에는 두 가지가 있습니다.

  1. 복제된 효과에 ID3DX11EffectConstantBuffer::SetConstantBuffer를 사용하여 사용자 관리로 만듭니다.
  2. HLSL 코드에서 상수 버퍼를 "단일"으로 표시합니다. 복제 후 효과 런타임이 사용자 관리로 처리되도록 강제합니다.

위의 두 메서드 간에는 두 가지 차이점이 있습니다. 먼저 메서드 1에서 SetConstantBuffer가 호출되기 전에 새 ID3D11Buffer가 생성되고 사용자가 생성됩니다. 또한 복제된 효과에서 UndoSetConstantBuffer를 호출한 후 메서드 1will의 변수는 새로 만든 버퍼(적용 시 업데이트되는 효과)를 가리키고 메서드 2의 변수는 원래 버퍼를 계속 가리킵니다(적용 시 업데이트되지 않음).

HLSL에서 다음 예제를 참조하세요.

cbuffer ObjectData
{
    float4 Position;
};
single cbuffer ViewData
{
    float4x4 ViewMatrix;
};

복제하는 동안 복제된 효과는 ObjectData에 대한 새 ID3D11Buffer를 만들고 적용에서 해당 내용을 채우지만 ViewData에 대한 원래 ID3D11Buffer를 참조합니다. 복제 프로세스에서 D3DX11_EFFECT_CLONE_FORCE_NONSINGLE 플래그를 설정하여 단일 한정자를 무시할 수 있습니다.

효과(Direct3D 11)