IDCompositionDevice::CreateVirtualSurface 메서드(dcomp.h)

컴퍼지션을 위해 하나 이상의 시각적 개체와 연결할 수 있는 드물게 채워진 표면을 만듭니다.

구문

HRESULT CreateVirtualSurface(
  [in]  UINT                        initialWidth,
  [in]  UINT                        initialHeight,
  [in]  DXGI_FORMAT                 pixelFormat,
  [in]  DXGI_ALPHA_MODE             alphaMode,
  [out] IDCompositionVirtualSurface **virtualSurface
);

매개 변수

[in] initialWidth

형식: UINT

표면의 너비(픽셀)입니다. 최대 너비는 16,777,216픽셀입니다.

[in] initialHeight

형식: UINT

표면의 높이(픽셀)입니다. 최대 높이는 16,777,216픽셀입니다.

[in] pixelFormat

형식: DXGI_FORMAT

표면의 픽셀 형식입니다.

[in] alphaMode

형식: DXGI_ALPHA_MODE

픽셀 형식에 알파 채널이 포함된 경우 알파 채널의 의미입니다. 다음 값 중 하나일 수 있습니다.

의미
DXGI_ALPHA_MODE_UNSPECIFIED
알파 채널이 지정되지 않았습니다. 이 값은 DXGI_ALPHA_MODE_IGNORE 효과와 동일합니다.
DXGI_ALPHA_MODE_PREMULTIPLIED
색 채널에는 알파 채널로 미리 곱한 값이 포함됩니다.
DXGI_ALPHA_MODE_IGNORE
알파 채널은 무시되어야 하며 비트맵은 불투명하게 렌더링되어야 합니다.

[out] virtualSurface

형식: IDCompositionVirtualSurface**

새로 만든 surface 개체입니다. 이 매개 변수는 NULL이 아니어야 합니다.

반환 값

형식: HRESULT

함수가 성공하면 S_OK를 반환합니다. 그러지 않으면 HRESULT 오류 코드를 반환합니다. 오류 코드 목록은 DirectComposition 오류 코드를 참조하세요.

설명

Microsoft DirectComposition 스파스 표면은 컴퍼지션을 위해 시각적 개체와 연결할 수 있는 픽셀의 사각형 배열처럼 동작하는 논리적 개체입니다. 표면이 모든 픽셀에 대해 물리적 비디오 또는 시스템 메모리에 의해 반드시 뒷받침되는 것은 아닙니다. 애플리케이션은 논리 표면의 일부를 서로 다른 시간에 실현하거나 가상화할 수 있습니다.

새로 만든 Surface 개체는 초기화되지 않은 상태입니다. 초기화되지는 않지만 표면은 시각적 트리의 컴퍼지션에 영향을 주지 않습니다. 100% 투명 픽셀로 초기화된 표면과 똑같이 동작합니다.

픽셀 데이터를 사용하여 표면을 초기화하려면 IDCompositionSurface::BeginDraw 메서드를 사용합니다. 이 메서드는 표면에 픽셀을 제공 할뿐만 아니라 해당 픽셀에 대한 실제 저장 공간도 할당합니다. 메모리 할당은 애플리케이션이 시스템에 메모리의 일부를 반환할 때까지 유지됩니다. 애플리케이션은 IDComposition::VirtualSurfaceTrim 메서드를 호출하여 할당된 메모리의 일부 또는 전체를 해제할 수 있습니다.

DirectComposition 표면은 다음 픽셀 형식을 지원합니다.

  • DXGI_FORMAT_B8G8R8A8_UNORM
  • DXGI_FORMAT_R8G8B8A8_UNORM
  • DXGI_FORMAT_R16G16B16A16_FLOAT
initialWidth 또는 initialHeight가 16,777,216픽셀을 초과하면 이 메서드가 실패합니다.

예제

다음 예제에서는 가상 표면을 만들고 시각적 개체와 연결하는 방법을 보여 줍니다.

HRESULT RenderAVisual(IDCompositionDevice *pDCompDevice, HWND hwndTarget,
                         UINT surfaceWidth, UINT surfaceHeight) 
{
    // Validate the input parameters.
    if (pDCompDevice == nullptr || hwndTarget == NULL)
        return E_INVALIDARG;
    
    HRESULT hr = S_OK;
    IDCompositionTarget *pTargetWindow = nullptr;
    IDCompositionVisual *pVisual = nullptr;
    IDCompositionVirtualSurface *pVirtualSurface = nullptr;
    ID3D10Texture2D *pTex2D = nullptr;
    POINT offset = {0};

    // Create the rendering target. 
    hr = pDCompDevice->CreateTargetForHwnd(hwndTarget, TRUE, &pTargetWindow);

    if (SUCCEEDED(hr))
    {
        // Create a visual.
        hr = pDCompDevice->CreateVisual(&pVisual);
    }

    if (SUCCEEDED(hr))
    {
        // Add the visual to the root of the composition tree.
        hr = pTargetWindow->SetRoot(pVisual);
    }

    if (SUCCEEDED(hr))
    {
        // Create a virtual surface.
        hr = pDCompDevice->CreateVirtualSurface(surfaceWidth, surfaceHeight, 
            DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ALPHA_MODE_IGNORE, 
            &pVirtualSurface);
    }

    if (SUCCEEDED(hr))
    {
        // Set the virtual surface as the content of the visual.
        hr = pVisual->SetContent(pVirtualSurface);
    }
    
    if (SUCCEEDED(hr))
    {
        // Retrieve and interface pointer for draw on the surface.
        hr = pVirtualSurface->BeginDraw(NULL, __uuidof(ID3D10Texture2D), 
            (void **) &pTex2D, &offset);
    }

    //
    // TODO: Draw on the surface.
    //
    
    if (SUCCEEDED(hr))
    {
        // Complete the updates to the surface.
        hr = pVirtualSurface->EndDraw();
    }

    // Commit the composition for rendering.
    hr = pDCompDevice->Commit();

    // Clean up.
    SafeRelease(&pTargetWindow);
    SafeRelease(&pVisual);
    SafeRelease(&pVirtualSurface);
    SafeRelease(&pTex2D);

    return hr;

}

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 8 [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2012 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 dcomp.h
라이브러리 Dcomp.lib
DLL Dcomp.dll

추가 정보

IDCompositionDevice

IDCompositionDevice::CreateSurface