DirectX11(一)

前言

开始接触到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地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值