예제 #1
0
    void init_for_dimensions(unsigned width, unsigned height)
    {
        if(zsv)
            zsv->Release();
        ID3D11Texture2D* zsbuf;
        D3D11_TEXTURE2D_DESC zsbufd;
        memset(&zsbufd, 0, sizeof(zsbufd));
        zsbufd.Width = width;
        zsbufd.Height = height;
        zsbufd.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
        zsbufd.ArraySize = 1;
        zsbufd.MipLevels = 1;
        zsbufd.SampleDesc.Count = 1;
        zsbufd.BindFlags = D3D11_BIND_DEPTH_STENCIL;
        ensure(dev->CreateTexture2D(&zsbufd, 0, &zsbuf));
        ensure(dev->CreateDepthStencilView(zsbuf, 0, &zsv));
        zsbuf->Release();

        ID3D11Texture2D* offscreen;
        if(offscreen_rtv)
        {
            offscreen_rtv->Release();
            offscreen_srv->Release();
            offscreen_rtv = 0;
            offscreen_srv = 0;
        }

        if(impressions > 1)
        {
            DXGI_FORMAT formats[] = {
                DXGI_FORMAT_R32G32B32A32_FLOAT,
                DXGI_FORMAT_R16G16B16A16_UNORM,
                DXGI_FORMAT_R16G16B16A16_FLOAT,
                DXGI_FORMAT_R10G10B10A2_UNORM,
            };
            DXGI_FORMAT format = DXGI_FORMAT_R8G8B8A8_UNORM; // this won't work well at all
            unsigned needed_support = D3D11_FORMAT_SUPPORT_RENDER_TARGET | D3D11_FORMAT_SUPPORT_BLENDABLE | D3D11_FORMAT_SUPPORT_SHADER_SAMPLE;
            for(unsigned i = 0; i < sizeof(formats); ++i)
            {
                unsigned support;
                dev->CheckFormatSupport(DXGI_FORMAT_R32G32B32A32_FLOAT, &support);
                if((support & needed_support) == needed_support)
                {
                    format = formats[i];
                    break;
                }
            }


            D3D11_TEXTURE2D_DESC offscreend;
            memset(&offscreend, 0, sizeof(offscreend));
            offscreend.Width = width;
            offscreend.Height = height;

            offscreend.Format = format;
            offscreend.MipLevels = 1;
            offscreend.ArraySize = 1;
            offscreend.SampleDesc.Count = 1;
            offscreend.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
            ensure(dev->CreateTexture2D(&offscreend, 0, &offscreen));
            ensure(dev->CreateRenderTargetView(offscreen, 0, &offscreen_rtv));
            ensure(dev->CreateShaderResourceView(offscreen, 0, &offscreen_srv));
            offscreen->Release();
        }

        cur_width = width;
        cur_height = height;
    }