효과 복제
효과를 복제하면 효과의 거의 동일한 두 번째 복사본이 만들어집니다. 정확하지 않은 이유에 대한 설명은 다음 단일 한정자를 참조하세요. 효과의 두 번째 복사본은 효과 런타임이 스레드로부터 안전하지 않으므로 여러 스레드에서 효과 프레임워크를 사용하려는 경우에 유용합니다.
디바이스 컨텍스트도 스레드로부터 안전하지 않으므로 다른 스레드는 ID3DX11EffectPass::Apply 메서드에 다른 디바이스 컨텍스트를 전달해야 합니다.
효과는 다음 구문을 사용하여 복제할 수 있습니다.
ID3DX11Effect* pClonedEffect = NULL;
UINT Flags = D3DX11_EFFECT_CLONE_FORCE_NONSINGLE;
HRESULT hr = pEffect->CloneEffect( Flags, &pClonedEffect );
위의 예제에서 복제된 복사본은 원래 효과의 상태에 관계없이 원래 효과와 동일한 상태를 캡슐화합니다. 특히 다음 사항에 주의하십시오.
- pEffect가 최적화되면 pCloned 효과가 최적화됩니다.
- pEffect에 일부 사용자 관리 변수가 있는 경우 pCloned Effect에는 동일한 사용자 관리 변수가 있습니다(아래의 단일 설명 참조).
- pEffect의 보류 중인 변수 업데이트(호출 적용이 디바이스 상태를 업데이트할 때까지)는 pClonedEffect에서 보류 중입니다.
다음 Direct3D 11 디바이스 개체는 효과 프레임워크에서 변경할 수 없거나 업데이트되지 않으므로 복제된 효과는 원래 효과와 동일한 개체를 가리킵니다.
- 상태 블록 개체(ID3D11BlendState, ID3D11RasterizerState, ID3D11DepthStencilState, ID3D11SamplerState)
- 셰이더
- 클래스 인스턴스
- 텍스처(텍스처 버퍼 포함 안 됨)
- 순서가 지정되지 않은 액세스 뷰
다음 Direct3D 11 디바이스 개체는 변경이 불가능하며 효과 런타임에 의해 수정됩니다(복제된 효과에서 사용자 관리 또는 단일이 아닌 경우). 이러한 개체의 새 복사본은 단일이 아닌 경우 만들어집니다.
- 상수 버퍼
- 텍스처 버퍼
단일 상수 버퍼 및 텍스처 버퍼
이 설명은 상수 버퍼와 텍스처 모두에 적용되지만 상수 버퍼는 읽기 용이한 것으로 간주됩니다.
상수 버퍼가 하나의 스레드에서만 업데이트되지만 복제된 효과에 의해 설정된 디바이스 상태가 이 데이터를 사용하는 경우가 있을 수 있습니다. 예를 들어 기본 효과는 세계를 변경하고 행렬을 보지 않는 복제된 효과의 셰이더에서 참조되는 월드 및 뷰 행렬을 업데이트할 수 있습니다. 이러한 경우 복제된 효과는 다시 만드는 대신 현재 상수 버퍼를 참조해야 합니다.
이 원하는 결과를 달성하는 방법에는 두 가지가 있습니다.
- 복제된 효과에 ID3DX11EffectConstantBuffer::SetConstantBuffer를 사용하여 사용자 관리로 만듭니다.
- 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 플래그를 설정하여 단일 한정자를 무시할 수 있습니다.
관련 항목