0
            void D3DApp::OnResize()
            {
                assert(md3dImmediateContext);
                assert(md3dDevice);
                assert(mSwapChain);

                // Release the old views, as they hold references to the buffers we
                // will be destroying.  Also release the old depth/stencil buffer.

                ReleaseCOM(mRenderTargetView);
                ReleaseCOM(mDepthStencilView);
                ReleaseCOM(mDepthStencilBuffer);


                // Resize the swap chain and recreate the render target view.

                HR(mSwapChain->ResizeBuffers(1, mClientWidth, mClientHeight, DXGI_FORMAT_R8G8B8A8_UNORM, 0));
                ID3D11Texture2D* backBuffer;
                HR(mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&backBuffer)));
                HR(md3dDevice->CreateRenderTargetView(backBuffer, 0, &mRenderTargetView));
                ReleaseCOM(backBuffer);

このコードが実際に何をしているのかを正確に理解するのに少し苦労しています。バッファーをメモリに格納してから、再度画面にレンダリングする現在のバックバッファーを取得していると思いますか? 取得されたバッファの内容には何がありますか? 私は非常に混乱しています。私のプログラムは 800 x 600 ピクセルのウィンドウを使用しています。

4

1 に答える 1

0

関数名が示すように、バックバッファとレンダー ターゲットをリセットするだけで、レンダー ウィンドウのサイズが変更されるたびにこの関数を呼び出す必要があります。

HR(mSwapChain->ResizeBuffers(1, mClientWidth, mClientHeight, DXGI_FORMAT_R8G8B8A8_UNORM, 0));

DirectX アプリケーションでは、常にウィンドウ サイズと同じバックバッファー サイズを設定するため、ウィンドウ サイズが変更された場合は、それに応じてバックバッファー サイズを更新する必要があります。そうしないと、シーンが引き伸ばされます。

ID3D11Texture2D* backBuffer;
HR(mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&backBuffer)));
HR(md3dDevice->CreateRenderTargetView(backBuffer, 0, &mRenderTargetView));
ReleaseCOM(backBuffer);

レンダー ターゲットは、更新する必要があるバックバッファーに基づいていました。

于 2013-08-05T08:13:27.017 に答える