Direct3D11-1 초기화

4705 단어 초기화
어떤 물건을 사용하기 전에, 우리는 그를 초기화해야 한다. 예를 들어 자동차 주유, 휴대전화 충전 등이다.그래서 우리는 평소의 인코딩 습관을 채택하여 다음과 같은 코드를 쓰려고 한다
        Direct3D11 _direct3d11;
사실 우리는 이렇게 Direct3D11을 초기화할 수 없습니다. Direct3D API를 실행하는 장치를 만들어야 합니다.
 
하나의 Direct3D 설비는 자원 관리, 렌더링, 그래픽 카드의 상호작용을 책임지고 11에서 이 설비는 두 부분으로 분해된다.
device 자원 생성
devicecontext 렌더링 실행
 
   Direct3D11  ,         (  )ID3D11Device * ,ID3D11DeviceContext *(      ,     COM),            ,    API          :    http://msdn.microsoft.com/en-us/library/windows/desktop/ff476082(v=vs.85).aspx


 
HRESULT WINAPI D3D11CreateDevice(
__in_opt IDXGIAdapter* pAdapter,
D3D_DRIVER_TYPE DriverType,
HMODULE Software,
UINT Flags,
CONST D3D_FEATURE_LEVEL* pFeatureLevels,
UINT FeatureLevels,
UINT SDKVersion,
__out_opt ID3D11Device** ppDevice,
__out_opt D3D_FEATURE_LEVEL* pFeatureLevel,
__out_opt ID3D11DeviceContext** ppImmediateContext
);
첫 번째 파라미터는 비디오adapter를 가리키는 바늘을 요구하지만, 우리는 이런 바늘을 얻지 못했다.따라서 이 매개 변수를nullptr로 설정하면 API는 기본 그래픽 카드에서 Device와 DeviceContext를 만듭니다
두 번째 파라미터는 D3D가 하드웨어에서 작동하는지 소프트웨어에서 작동하는지 가리켜야 한다. 우리의 첫 번째 파라미터는 묵묵한 그래픽을 가리키기 때문에 DriverType = D3DDRIVER_TYPE_HARDWARE
세 번째 파라미터는 분명히 0이고, 네 번째 파라미터는 당신의 코드가Release인지 Debug인지에 따라 분명합니다.Debug 모드에서 Flags = D3D11CREATE_DEVICE_DEBUG
(win8.1로 업그레이드하면 VS2012에서는 flags를 사용할 수 없습니다.)
SDKVersion = D3D11_SDK_VERSION.다음 세 가지 파라미터는 출력에 사용됩니다. 주의해야 할 것은 pFeature Level입니다. 이 파라미터는 Device의 특성 수준을 받아들이는 데 사용됩니다. 예를 들어 기본 그래픽 카드가 DX를 지원하는 버전은 각각 가능합니다.
enum D3D_FEATURE_LEVEL
{    D3D_FEATURE_LEVEL_9_1    = 0x9100,
    D3D_FEATURE_LEVEL_9_2    = 0x9200,
    D3D_FEATURE_LEVEL_9_3    = 0x9300,
    D3D_FEATURE_LEVEL_10_0    = 0xa000,
    D3D_FEATURE_LEVEL_10_1    = 0xa100,
    D3D_FEATURE_LEVEL_11_0    = 0xb000
}     D3D_FEATURE_LEVEL;
(pFeature Levels와 대응하는 것은 CONST D3D FEATURE LEVEL* pFeature Levels UINT Feature Levels입니다. 이 두 파라미터는 테스트가 필요한 특성을 알려 줍니다. 0이면 모든 특성을 테스트합니다. 그리고 최대 지원할 수 있는 특성을 pFeature Levels로 되돌려줍니다.)
 
이 피처링을 무시하지 마세요...Level, 그는 하나의 게임 프로그래밍이 서로 다른 하드웨어에 직면하는 문제를 슬기롭게 해결했다. 게임 개발자는 이 API가 그래픽 카드에 지원되는지 보장할 수 없다. 이전의 Direct3D 프로그래밍에서 당신은 복잡한 장치의 매거진(각 그래픽 카드의 성능을 검사)을 볼 수 있다.물론 설비 매거가 이뿐만이 아니지만 개발자들은 보증을 섰다.
"만약 이 카드가 DX11을 지원한다면 그는 DX11의 모든 기능을 지원할 것이다."
엄마는 더 이상 상대방의 카드가 지원되지 않아 무너질까 봐 걱정할 필요가 없었다.마지막 코드가 이렇게 보여요.
UINT createDeviceFlags = 0;
#if defined(DEBUG) || defined(_DEBUG)
createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
D3D11CreateDevice(
        nullptr,                    //default adapter
        D3D_DRIVER_TYPE_HARDWARE,
        nullptr,                    //no software device
        createDeviceFlags,
        0,0,                        //default feature level array
        D3D11_SDK_VERSION,
        &md3dDevice,
        &featureLevel,
        &md3dImmediateContext
        );
 
설비를 잘 만드는 것은 일을 끝내는 것을 의미하지 않는다. 예를 들어, Direct3D가 어디로 렌더링되는지, 우리는 버프를 제공해야 한다.더욱 매끄러운 애니메이션을 만들기 위해.DirectX에서는 교환 체인과 페이지 교환 기술을 사용했다.우리 언제나
Draw는 화면에서 떨어진 버프 안에 들어가서 두 개의 버프를 바꾸어 화면에 그립니다.프로그램 구조는 다음과 같습니다.
  • 백그라운드 캐시에서 그리기
  • 백그라운드 캐시를 커밋할 내용
  • 1단계로 돌아가기
  • 음, 이것은 교환 체인을 만들어야 한다는 것을 의미합니다. 코드는 다음과 같습니다.
    DXGI_SWAP_CHAIN_DESC sd;//교환 체인의 일부 속성을 설명하는 데 사용
        sd.BufferDesc.Width = mClientWidth;//너비 및 높이
        sd.BufferDesc.Height = mClientHeight;
        sd.BufferDesc.RefreshRate.Numerator = 60;//HZ 새로 고침
        sd.BufferDesc.RefreshRate.Denominator = 1;
        sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;//픽셀 형식
        sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
        sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;//렌더링 대상으로
        sd.BufferCount = 1;
        sd.OutputWindow = mhMainWnd;
        sd.Windowed = true;
        sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
        sd.Flags = 0;
    IDXGIDevice* dxgiDevice = 0;
        HR(md3dDevice->QueryInterface(__uuidof(IDXGIDevice), (void**)&dxgiDevice));
    //인터페이스 액세스, COM 참조
        IDXGIAdapter* dxgiAdapter = 0;
        HR(dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void**)&dxgiAdapter));
        IDXGIFactory * dxgiFactory = 0;
        HR(dxgiAdapter->GetParent(__uuidof(IDXGIFactory), (void**)&dxgiFactory));
     
        HR(dxgiFactory->CreateSwapChain(md3dDevice, &sd, &mSwapChain));
     
    다음에 저는 데모 강좌를 내보낼 것입니다. 이 강좌는 교환 체인을 만들지 않았지만 간단한 그래픽 카드 매거진과 그래픽 카드와 상호작용하는 내용이 있고 HLSL 코드를 도입했습니다.

    좋은 웹페이지 즐겨찾기