Driect3D初始化演示

Posted yaya12138

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Driect3D初始化演示相关的知识,希望对你有一定的参考价值。

初始化Direct3D演示

初始化Driect3D类:

#include "Commond3dApp.h"
#include <DirectXColors.h>

using namespace DirectX;

class InitDirect3DApp : public D3DApp
{
public:
    InitDirect3DApp(HINSTANCE hInstance);
    ~InitDirect3DApp();

    virtual bool Initialize()override;

private:
    virtual void OnResize()override;
    virtual void Update(const GameTimer& gt)override;
    virtual void Draw(const GameTimer& gt)override;
};


InitDirect3DApp::InitDirect3DApp(HINSTANCE hInscance) :D3DApp(hInscance)
{

}

InitDirect3DApp::~InitDirect3DApp()
{

}

bool InitDirect3DApp::Initialize()
{
    if (!D3DApp::Initialize())
    {
        return false;
    }
    return true;
}

void InitDirect3DApp::OnResize()
{
    D3DApp::OnResize();
}

void InitDirect3DApp::Update(const GameTimer& gt)
{

}

void InitDirect3DApp::Draw(const GameTimer& gt)
{
    //重置命令分配器
    ThrowIfFailed(mDirectCmdListAlloc->Reset());
    //重置命令列表
    ThrowIfFailed(mCommandList->Reset(mDirectCmdListAlloc.Get(), nullptr));
    //对资源的状态进行转变,将资源从呈现状态转变到渲染目标状态
    mCommandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(
        CurrentBackBuffer(),
        D3D12_RESOURCE_STATE_PRESENT,
        D3D12_RESOURCE_STATE_RENDER_TARGET
    ));
    //设置视口和裁剪矩形,他们需要跟随命令列表的重置而重置
    mCommandList->RSSetViewports(1, &mScreenViewport);
    mCommandList->RSSetScissorRects(1, &mScissorRect);
    //清除后台缓冲区和深度缓冲区
    mCommandList->ClearRenderTargetView(CurrentBackBufferView(), Colors::LightSteelBlue, 0, nullptr);
    mCommandList->ClearDepthStencilView(DepthStencilView(), D3D12_CLEAR_FLAG_DEPTH | D3D12_CLEAR_FLAG_STENCIL,
        1.0f, 0, 0, nullptr);
    //指定将要渲染的缓冲区
    mCommandList->OMSetRenderTargets(1, &CurrentBackBufferView(), true, &DepthStencilView());
    //再次对资源状态进行转变,将资源从渲染目标状态转变为呈现状态
    mCommandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(
        CurrentBackBuffer(), D3D12_RESOURCE_STATE_RENDER_TARGET,
        D3D12_RESOURCE_STATE_PRESENT
    ));
    //完成命令的记录
    ThrowIfFailed(mCommandList->Close());
    //将命令列表的命令加入到命令队列中
    ID3D12CommandList* cmdsList[] = { mCommandList.Get() };
    mCommandQueue->ExecuteCommandLists(_countof(cmdsList), cmdsList);
    //交换前后台缓冲区
    ThrowIfFailed(mSwapChain->Present(0, 0));;
    mCurrBackBuffer = (mCurrBackBuffer + 1) % SwapChainBufferCount;

    //等待此帧的命令执行完毕
    FlushCommandQueue();

}

主函数:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, PSTR cmdLine, int showCmd)
{
    //为调试版本开启运行时内存检测,方便监督内存泄漏的情况
#if defined(DEBUG) | defined(_DEBUG)
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
#endif

    try 
    {
        InitDirect3DApp theApp(hInstance);
        if (!theApp.Initialize())
        {
            return 0;
        }
        return theApp.Run();
    }
    catch (DxException& e)
    {
        MessageBox(nullptr, e.ToString().c_str(), L"HR Failed", MB_OK);
        return 0;
    }
}

运行结果

技术图片

接下来我们将介绍一些在前面没有提到的方法:

1、ClearRenderTargetView():将指定的渲染目标清理为给定的颜色

2、ClearDepthStencilView():清理指定的深度/模板缓冲区

3、OMSetRenderTargets():设置我们希望在渲染流水线上使用的渲染目标和深度/模板缓冲区

以上是关于Driect3D初始化演示的主要内容,如果未能解决你的问题,请参考以下文章

sql 这些代码片段将演示如何逐步使用PolyBase。你应该有一个blob存储和存储秘密方便

如何使用 Android 片段?

Android课程---Android Studio使用小技巧:提取方法代码片段

在案例演示中嵌入片段

android MVP - 我可以有多个演示者用于自定义视图和片段

如何使用 Swift 使用此代码片段为 iOS 应用程序初始化 SDK?