在C ++中获取这两个错误(DirectX)

时间:2016-02-20 22:59:19

标签: c++ directx

我目前正在使用D3D渲染器,我收到了这些错误:

1.)FIRST ERROR

enter image description here

2.)第二个错误

enter image description here

任何建议我都非常高兴:) +错误标记为代码// 1。错误 - >和//2.ERROR - > //

DXApp.cpp

  #include "DXApp.h"
#include <d3dcommon.h>

namespace
{
    //USED TO FORWARD  MSGS TO USER DEFINED PROC FUNCTION //
    DXApp* g_pApp = nullptr;
}

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    if (g_pApp) return g_pApp->MsgProc(hwnd, msg, wParam, lParam);
    else return DefWindowProc(hwnd, msg, wParam, lParam);
}


DXApp::DXApp(HINSTANCE hInstance)
{
    m_hAppInstance = hInstance;
    m_hAppWnd = NULL;
    m_ClientHeight = 800;
    m_ClientWidth = 600;
    m_AppTitle = "DX11 APP";
    m_WndStyle = WS_OVERLAPPEDWINDOW;

    m_pDevice = nullptr;
    m_pImmediateContext = nullptr;
    m_pRenderTargetView = nullptr;
    m_pSwapChain = nullptr;
}

DXApp::~DXApp()
{ 
}

int DXApp::Run()
{
    //MAIN MESSAGE LOOP//
    MSG msg = { 0 };
    while (WM_QUIT != msg.message)
    {
        if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            //UPDATE..//
            Update(0.0f);
            //RENDER//
            Render(0.0f);
        }
    }
    return static_cast<int>(msg.wParam);
}

bool DXApp::Init()
{
    if (!InitWindow())
        return false; 

    return true;
}

bool DXApp::InitWindow()
{
    //WNDCLASSGENDER
    WNDCLASSEX wcex;
    ZeroMemory(&wcex, sizeof(WNDCLASSEX));
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_VREDRAW | CS_HREDRAW;
    wcex.hInstance = m_hAppInstance;
    wcex.lpfnWndProc = MainWndProc;
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = "DXAPPWNDCLASS";
    wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    if (!RegisterClassEx(&wcex))
    {
        OutputDebugString("\nFAILED TO CREATE WINDOW CLASS !\n");
        return false;
    }

    RECT r = { 0, 0, m_ClientWidth, m_ClientHeight };
    AdjustWindowRect(&r, m_WndStyle, FALSE);
    UINT width = r.right - r.left;
    UINT height = r.bottom - r.top;

    UINT x = GetSystemMetrics(SM_CXSCREEN) / 2 - width / 2;
    UINT y = GetSystemMetrics(SM_CYSCREEN) / 2 - height / 2;

    m_hAppWnd = CreateWindow("DXAPPWNDCLASS", m_AppTitle.c_str(), m_WndStyle,
        x, y, width, height, NULL, NULL, m_hAppInstance, NULL);
    if (!m_hAppWnd)
    {
        OutputDebugString("\nFAILED TO CREATE WINDOW CLASS !\n");
        return false;
    }

    ShowWindow(m_hAppWnd, SW_SHOW);

    return true;
}

bool DXApp::InitDirect3D()
{
    UINT createDeviceFlags = 0;

#ifdef _DEBUG
    createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif // _DEBUG

    D3D_DRIVER_TYPE driverTypes[] =
    {
        D3D_DRIVER_TYPE_HARDWARE,
        D3D_DRIVER_TYPE_WARP,
        D3D_DRIVER_TYPE_REFERENCE
    };
    UINT numDriverTypes = ARRAYSIZE(driverTypes);

    D3D_FEATURE_LEVEL featureLevels[] =
    {
        D3D_FEATURE_LEVEL_11_0,
        D3D_FEATURE_LEVEL_10_1,
        D3D_FEATURE_LEVEL_10_0,
        D3D_FEATURE_LEVEL_9_3,
    };
    UINT numFeatureLevels = ARRAYSIZE(featureLevels);

    DXGI_SWAP_CHAIN_DESC swapDesc;
    ZeroMemory(&swapDesc, sizeof(DXGI_SWAP_CHAIN_DESC));
    swapDesc.BufferCount = 1; //Double buffer 0 = 1, 1 = 2
    swapDesc.BufferDesc.Width = m_ClientWidth;
    swapDesc.BufferDesc.Height = m_ClientHeight;
    swapDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    swapDesc.BufferDesc.RefreshRate.Numerator = 60;
    swapDesc.BufferDesc.RefreshRate.Denominator = 1;
    swapDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    swapDesc.OutputWindow = m_hAppWnd;
    swapDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
    swapDesc.Windowed = true;
    swapDesc.SampleDesc.Count = 1;
    swapDesc.SampleDesc.Quality = 0;
    swapDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; //FULLSCREEN CEZ ALT-ENTER

    HRESULT result;
    for (int i = 0; i < numDriverTypes; ++i)
    {
        D3D11CreateDeviceAndSwapChain(NULL, driverTypes[i], NULL, createDeviceFlags,
            featureLevels, numFeatureLevels, D3D11_SDK_VERSION, &swapDesc, &m_pSwapChain, &m_pDevice,
            //1.ERROR-->// &featureLevels, &m_pImmediateContext);
        if (SUCCEEDED(result))
        {
            //2.ERROR-->// m_DriverType = driverTypes[i];
            break;
        }
    }
}

LRESULT DXApp::MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_DESTROY:
            PostQuitMessage(0);
            return 0;

    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
}

DXApp.h

#pragma once
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <string>
#include "DXUtil.h"

class DXApp
{
public:
    DXApp(HINSTANCE hInstance);
    virtual ~DXApp(void);

    //MAIN APP LOOP//
    int Run();

    //FRAMEWORK//
    virtual bool Init();
    virtual void Update(float dt) = 0;
    virtual void Render(float dt) = 0;
    virtual LRESULT MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

protected:

    //WIN 32 ATTRIBUTES//
    HWND            m_hAppWnd;
    HINSTANCE       m_hAppInstance;
    UINT            m_ClientWidth;
    UINT            m_ClientHeight;
    std::string     m_AppTitle;
    DWORD           m_WndStyle;

    //DirectX ATTRIBUTES//
    ID3D11Device*               m_pDevice;
    ID3D11DeviceContext*        m_pImmediateContext;
    IDXGISwapChain*             m_pSwapChain;
    ID3D11RenderTargetView*     m_pRenderTargetView;
    D3D_DRIVER_TYPE*            m_DriverType;
    D3D_FEATURE_LEVEL*          m_FeatureLevel;
    D3D11_VIEWPORT*             m_Viewport;

protected:

    //INIT WIN32 WINDOW//
    bool InitWindow();

    //INIT DirectX  
    bool InitDirect3D();

};

DXUtil.h

#pragma once
#include <d3d11.h>

#pragma comment(lib, "d3d11.lib")

namespace Memory
{
    template <class T> void SafeDelete(T& t)
    {
        if (t)
        {
            delete t;
            t = nullptr;
        }
    }

    template <class T> void SafeDeleteArr(T& t)
    {
        if (t)
        {
            delete[];
            t = nullptr;
        }
    }

    template <class T> void SafeRelease(T& t)
    {
        if (t)
        {
            t->Release();
            t = nullptr;

        }
    }
}

winmain.cpp

#include "DXApp.h"

class TestApp : public DXApp
{
public:
    TestApp(HINSTANCE hInstance);
    ~TestApp();

    bool Init() override;
    void Update(float dt) override;
    void Render(float dt) override;
};

TestApp::TestApp(HINSTANCE hInstance) : DXApp(hInstance)
{

}

TestApp::~TestApp()
{

}

bool TestApp::Init()
{
    if (!DXApp::Init())
        return false;

    return true;
}

void TestApp::Update(float dt)
{

}

void TestApp::Render(float dt)
{

}

int WINAPI WinMain(__in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd)
{
    TestApp tApp(hInstance);

    if (!tApp.Init()) return 1;

    return tApp.Run();
}

1 个答案:

答案 0 :(得分:1)

  

我建议你从C / C ++的一些基础教程开始,介绍如何使用指针,按值传递值,以及通过引用/指针传递值。这些问题与DirectX无关。

D3D_DRIVER_TYPE*            m_DriverType;
D3D_FEATURE_LEVEL*          m_FeatureLevel;
D3D11_VIEWPORT*             m_Viewport;

这些变量声明应该是值,而不是指针:

D3D_DRIVER_TYPE             m_DriverType;
D3D_FEATURE_LEVEL           m_FeatureLevel;
D3D11_VIEWPORT              m_Viewport;

,代码应为:

HRESULT result;
for (int i = 0; i < numDriverTypes; ++i)
{
    result = D3D11CreateDeviceAndSwapChain(NULL, driverTypes[i], NULL, createDeviceFlags,
        featureLevels, numFeatureLevels, D3D11_SDK_VERSION, &swapDesc, &m_pSwapChain,
        &m_pDevice, &m_FeatureLevel, &m_pImmediateContext);
    if (SUCCEEDED(result))
    {
        m_DriverType = driverTypes[i];
        break;
    }
}

在我看来,你正在使用一个有点过时的教程。你应该看一下DirectX Tool Kit tutorials