효과의 인터페이스 및 클래스

효과 11에서 클래스와 인터페이스를 사용하는 방법에는 여러 가지가 있습니다. 인터페이스 및 클래스 구문은 인터페이스 및 클래스를 참조하세요.

다음 섹션에서는 인터페이스를 사용하는 셰이더에 클래스 인스턴스를 지정하는 방법을 자세히 설명합니다. 예제에서 다음 인터페이스 및 클래스를 사용합니다.

interface IColor
{
  float4 GetColor();
};

class CRed : IColor
{
  float4 GetColor() { return float4(1,0,0,1); }
};
class CGreen : IColor
{
  float4 GetColor() { return float4(0,1,0,1); }
};

CRed pRed;
CGreen pGreen;
IColor pIColor;
IColor pIColor2 = pRed;

인터페이스 인스턴스를 클래스 인스턴스로 초기화할 수 있습니다. 클래스 및 인터페이스 인스턴스의 배열도 지원되며 다음 예제와 같이 초기화할 수 있습니다.

CRed pRedArray[2];
IColor pIColor3 = pRedArray[1];
IColor pIColorArray[2] = {pRed, pGreen};
IColor pIColorArray2[2] = pRedArray;

균일한 인터페이스 매개 변수

다른 균일한 데이터 형식과 마찬가지로 CompileShader 호출에서 균일한 인터페이스 매개 변수를 지정해야 합니다. 인터페이스 매개 변수는 전역 인터페이스 인스턴스 또는 전역 클래스 인스턴스에 할당할 수 있습니다. 전역 인터페이스 instance 할당된 경우 셰이더는 인터페이스 instance 종속성을 가지므로 클래스 instance 설정해야 합니다. 전역 클래스 인스턴스에 할당된 경우 컴파일러는 다른 균일한 데이터 형식과 마찬가지로 셰이더를 특수화하여 해당 클래스를 사용합니다. 이는 다음 두 가지 시나리오에서 중요합니다.

  1. 4_x 대상이 있는 셰이더는 이러한 매개 변수가 균일하고 전역 클래스 인스턴스에 할당된 경우 인터페이스 매개 변수를 사용할 수 있습니다(동적 링크가 사용되지 않음).
  2. 사용자는 동적 연결이 없는 컴파일된 특수 셰이더가 많거나 동적 링크가 있는 컴파일된 셰이더가 거의 없도록 결정할 수 있습니다.
float4 PSUniform( uniform IColor color ) : SV_Target
{
  return color;
}

technique11
{
  pass
  {
    SetPixelShader( CompileShader( ps_4_0, PSUniform(pRed) ) );
  }
  pass
  {
    SetPixelShader( CompileShader( ps_5_0, PSUniform(pIColor2) ) );
  }
}

pIColor2가 API를 통해 변경되지 않은 상태로 유지되면 이전 두 패스는 기능적으로 동일하지만 첫 번째 패스는 ps_4_0 정적 셰이더를 사용하고 두 번째 패스는 동적 링크가 있는 ps_5_0 셰이더를 사용합니다. pIColor2가 효과 API를 통해 변경된 경우(아래 클래스 인스턴스 설정 참조) 두 번째 단계에서 픽셀 셰이더의 동작이 변경 될 수 있습니다.

균일하지 않은 인터페이스 매개 변수

균일하지 않은 인터페이스 매개 변수는 셰이더에 대한 인터페이스 종속성을 만듭니다. 인터페이스 매개 변수를 사용하여 셰이더를 적용할 때 이러한 매개 변수는 BindInterfaces 호출을 사용하여 에 할당되어야 합니다. 전역 인터페이스 인스턴스 및 전역 클래스 인스턴스는 BindInterfaces 호출에서 지정할 수 있습니다.

float4 PSAbstract( IColor color ) : SV_Target
{
  return color;
}

PixelShader pPSAbstract = CompileShader( ps_5_0, PSAbstract(pRed) );

technique11
{
  pass
  {
    SetPixelShader( BindInterfaces( pPSAbstract, pRed ) );
  }
  pass
  {
    SetPixelShader( BindInterfaces( pPSAbstract, pIColor2 ) );
  }
}

pIColor2가 API를 통해 변경되지 않은 상태로 유지되는 경우 이전 두 패스는 기능적으로 동일하며 둘 다 동적 연결을 사용합니다. pIColor2가 효과 API를 통해 변경된 경우(아래 클래스 인스턴스 설정 참조) 두 번째 단계에서 픽셀 셰이더의 동작이 변경 될 수 있습니다.

클래스 인스턴스 설정

동적 셰이더 연결을 사용하여 Direct3D 11 디바이스에 셰이더를 설정하는 경우 클래스 인스턴스도 지정해야 합니다. NULL 클래스 instance 사용하여 이러한 셰이더를 설정하는 것은 오류입니다. 따라서 셰이더가 참조하는 모든 인터페이스 인스턴스에는 연결된 클래스 instance 있어야 합니다.

다음 예제에서는 효과에서 클래스 instance 변수를 가져와서 인터페이스 변수로 설정하는 방법을 보여줍니다.

ID3DX11EffectPass* pPass = pEffect->GetTechniqueByIndex(0)->GetPassByIndex(1);

ID3DX11EffectInterfaceVariable* pIface = pEffect->GetVariableByName( "pIColor2" )->AsInterface();
ID3DX11EffectClassInstanceVariable* pCI = pEffect->GetVariableByName( "pGreen" )->AsClassInstance();
pIface->SetClassInstance( pCI );
pPass->Apply( 0, pDeviceContext );

// Apply the same pass with a different class instance
pCI = pEffect->GetVariableByName( "pRedArray" )->GetElement(1)->AsClassInstance();
pIface->SetClassInstance( pCI );
pPass->Apply( 0, pDeviceContext );

효과(Direct3D 11)