DirectX11(一)

来源:互联网 发布:html嵌入php 编辑:程序博客网 时间:2024/06/07 13:36

前言

开始接触到DirectX是大四时买了本《DIRECTX.9.0.3D游戏开发编程基础》开始的,当时只是照着书把书上的例子敲了一遍,由于不知道D3D的这些API背后的原理,看起来非常吃力,到了着色器语言那部分就完全晕了。最近实现了自己的软件光栅化渲染器,对图形学有了点了解,现在在接触D3D的一些API,自然而然能联想到一些背后的原理。现在打算认真学习下D3D11,先从官方SDK里带的例子开始学习吧。

初始化Direct3D 11 设备

首先必须要创建的是
ID3D11Device(设备):该设备包含创建资源的方法
ID3D11DeviceContext(上下文):主要用于在缓冲区执行渲染
IDXGISwapChain(交换链):将后台缓存与前台缓存交换,在显示器上显示
先要创建一个DXGI_SWAP_CHAIN_DESC 结构,填写相应的参数,
根据这个结构使用D3D11CreateDeviceAndSwapChain方法来创建。

    //DXGI_SWAP_CHAIN_DESC结构    DXGI_SWAP_CHAIN_DESC sd;    ZeroMemory( &sd, sizeof(sd) );    //缓冲区数量    sd.BufferCount = 1;    //缓冲区的宽高    sd.BufferDesc.Width = 640;    sd.BufferDesc.Height = 480;    //像素格式    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;    //刷新率分子    sd.BufferDesc.RefreshRate.Numerator = 60;    //刷新率分母    sd.BufferDesc.RefreshRate.Denominator = 1;    //如何使用缓冲区    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;    //输出窗口    sd.OutputWindow = g_hWnd;    //采样数    sd.SampleDesc.Count = 1;    //采样质量    sd.SampleDesc.Quality = 0;    //是否窗口化    sd.Windowed = TRUE;    //D3D_DRIVER_TYPE_HARDWARE表示将使用硬件加速,如果不支持,可选用软件,但是效率低    if( FAILED( D3D11CreateDeviceAndSwapChain( NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, featureLevels, numFeatureLevels,                     D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, NULL, &g_pImmediateContext ) ) )    {        return FALSE;    }

创建渲染目标视图

    // Create a render target view    ID3D11Texture2D *pBackBuffer;    if( FAILED( g_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), (LPVOID*)&pBackBuffer ) ) )        return FALSE;    hr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer, NULL, &g_pRenderTargetView );    pBackBuffer->Release();    if( FAILED( hr ) )        return FALSE;    g_pImmediateContext->OMSetRenderTargets( 1, &g_pRenderTargetView, NULL );

创建渲染目标视图,确保输出的管道渲染被写入到后台缓冲区

    ID3D11Texture2D *pBackBuffer;    //获取交换链的后台缓存    if( FAILED( g_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), (LPVOID*)&pBackBuffer ) ) )        return FALSE;    //绑定交换链的后面缓冲区作为渲染目标    hr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer, NULL, &g_pRenderTargetView );    pBackBuffer->Release();    if( FAILED( hr ) )        return FALSE;           g_pImmediateContext->OMSetRenderTargets( 1, &g_pRenderTargetView, NULL );

初始化视图

我们需要在Direct3D 11渲染设置的最后一件事是初始化视口。视口映射剪辑空间坐标,其中x和y范围从1到1,z范围从0到1,渲染目标空间,有时被称为像素空间。在Direct3D 9,如果应用程序没有设定一个视口,视口设置为默认大小为渲染目标相同。在Direct3D 11,默认不创建视口。因此,我们必须这样做之前,我们可以看到屏幕上的任何东西。因为我们想使用整个渲染目标的输出,我们设置左上角到(0,0)和宽度和高度是相同的渲染目标的大小。

    D3D11_VIEWPORT vp;    vp.Width = (FLOAT)width;    vp.Height = (FLOAT)height;    vp.MinDepth = 0.0f;    vp.MaxDepth = 1.0f;    vp.TopLeftX = 0;    vp.TopLeftY = 0;    g_pImmediateContext->RSSetViewports( 1, &vp );

渲染

以下代码只是单单的设置一个背景色

    void Render()    {        //用一种颜色来将后台缓存填充        float ClearColor[4] = { 0.0f, 0.125f, 0.6f, 1.0f }; // RGBA        g_pd3dDevice->ClearRenderTargetView( g_pRenderTargetView, ClearColor );        //交换,从而在显示器上显示        g_pSwapChain->Present( 0, 0 );    }

这里写图片描述
项目Github地址

原创粉丝点击