Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ DIRECTX9中CustomVertex的虚拟析构函数_C++_Visual Studio 2012_Directx 9_Vertex Buffer - Fatal编程技术网

C++ DIRECTX9中CustomVertex的虚拟析构函数

C++ DIRECTX9中CustomVertex的虚拟析构函数,c++,visual-studio-2012,directx-9,vertex-buffer,C++,Visual Studio 2012,Directx 9,Vertex Buffer,这是我关于stackoverflow的第一个问题,如果我的问题很愚蠢,请原谅我。 我试图在Visual Studio 2012中简单地在DirectX9中渲染一个三角形,如下所示:www.directxtural.com/Lesson.aspx?lessonid=9-4-4 当我使用非虚拟析构函数创建CUSTOMVERTEX类时,它会毫无问题地渲染三角形。然而,如果我使析构函数为虚拟,则三角形不会被渲染 以下是虚拟析构函数的代码: // include the basic windows hea

这是我关于stackoverflow的第一个问题,如果我的问题很愚蠢,请原谅我。 我试图在Visual Studio 2012中简单地在DirectX9中渲染一个三角形,如下所示:www.directxtural.com/Lesson.aspx?lessonid=9-4-4

当我使用非虚拟析构函数创建CUSTOMVERTEX类时,它会毫无问题地渲染三角形。然而,如果我使析构函数为虚拟,则三角形不会被渲染

以下是虚拟析构函数的代码:

// include the basic windows header files and the Direct3D header file
#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>

// define the screen resolution
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600

// include the Direct3D Library file
#pragma comment (lib, "d3d9.lib")

#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

// global declarations
LPDIRECT3D9 d3d;    // the pointer to our Direct3D interface
LPDIRECT3DDEVICE9 d3ddev;    // the pointer to the device class
LPDIRECT3DVERTEXBUFFER9 v_buffer = NULL;    // the pointer to the vertex buffer

// function prototypes
void initD3D(HWND hWnd);    // sets up and initializes Direct3D
void render_frame(void);    // renders a single frame
void cleanD3D(void);    // closes Direct3D and releases memory
void init_graphics(void);    // 3D declarations
// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);



//************CUSTOMVERTEX CLASS**********/
class CUSTOMVERTEX {
public:
    CUSTOMVERTEX( float _X, float _Y, float _Z, float _RHW, DWORD _COLOR )
        : X(_X), Y(_Y), Z(_Z), RHW(_RHW), COLOR(_COLOR)
    {}

    virtual ~CUSTOMVERTEX(){
        OutputDebugString("Destructed!!!\n");
    }
    float X, Y, Z, RHW;
    DWORD COLOR;
};

// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    HWND hWnd;
    WNDCLASSEX wc;

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszClassName = "WindowClass";

    RegisterClassEx(&wc);

    hWnd = CreateWindowEx(NULL,
                          "WindowClass",
                          "Our Direct3D Program",
                          WS_OVERLAPPEDWINDOW,
                          0, 0,
                          SCREEN_WIDTH, SCREEN_HEIGHT,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

    ShowWindow(hWnd, nCmdShow);

    // set up and initialize Direct3D
    initD3D(hWnd);

    // enter the main loop:

    MSG msg;

    while(TRUE)
    {
        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        if(msg.message == WM_QUIT)
            break;

        render_frame();
    }

    // clean up DirectX and COM
    cleanD3D();

    return msg.wParam;
}


// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY:
            {
                PostQuitMessage(0);
                return 0;
            } break;
    }

    return DefWindowProc (hWnd, message, wParam, lParam);
}


// this function initializes and prepares Direct3D for use
void initD3D(HWND hWnd)
{
    d3d = Direct3DCreate9(D3D_SDK_VERSION);

    D3DPRESENT_PARAMETERS d3dpp;

    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow = hWnd;
    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
    d3dpp.BackBufferWidth = SCREEN_WIDTH;
    d3dpp.BackBufferHeight = SCREEN_HEIGHT;

    // create a device class using this information and the info from the d3dpp struct
    d3d->CreateDevice(D3DADAPTER_DEFAULT,
                      D3DDEVTYPE_HAL,
                      hWnd,
                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                      &d3dpp,
                      &d3ddev);

    init_graphics();    // call the function to initialize the triangle
}


// this is the function used to render a single frame
void render_frame(void)
{
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

    d3ddev->BeginScene();

        // select which vertex format we are using
        d3ddev->SetFVF(CUSTOMFVF);

        // select the vertex buffer to display
        d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));

        // copy the vertex buffer to the back buffer
        d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

    d3ddev->EndScene();

    d3ddev->Present(NULL, NULL, NULL, NULL);
}


// this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
    v_buffer->Release();    // close and release the vertex buffer
    d3ddev->Release();    // close and release the 3D device
    d3d->Release();    // close and release Direct3D
}


// this is the function that puts the 3D models into video RAM
void init_graphics(void)
{
    // create the vertices using the CUSTOMVERTEX class
    CUSTOMVERTEX vertices[] =
    {
        CUSTOMVERTEX(400.0f, 62.5f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255)),
        CUSTOMVERTEX(650.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0)),
        CUSTOMVERTEX(150.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0)),
    };

    // create a vertex buffer interface called v_buffer
    d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
                               0,
                               CUSTOMFVF,
                               D3DPOOL_MANAGED,
                               &v_buffer,
                               NULL);

    VOID* pVoid;    // a void pointer

    // lock v_buffer and load the vertices into it
    v_buffer->Lock(0, 0, (void**)&pVoid, 0);
    memcpy(pVoid, vertices, sizeof(vertices));
    v_buffer->Unlock();
}
// include the basic windows header files and the Direct3D header file
#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>

// define the screen resolution
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600

// include the Direct3D Library file
#pragma comment (lib, "d3d9.lib")

#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

// global declarations
LPDIRECT3D9 d3d;    // the pointer to our Direct3D interface
LPDIRECT3DDEVICE9 d3ddev;    // the pointer to the device class
LPDIRECT3DVERTEXBUFFER9 v_buffer = NULL;    // the pointer to the vertex buffer

// function prototypes
void initD3D(HWND hWnd);    // sets up and initializes Direct3D
void render_frame(void);    // renders a single frame
void cleanD3D(void);    // closes Direct3D and releases memory
void init_graphics(void);    // 3D declarations
// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);



//************CUSTOMVERTEX CLASS**********/
class CUSTOMVERTEX {
public:
    CUSTOMVERTEX( float _X, float _Y, float _Z, float _RHW, DWORD _COLOR )
        : X(_X), Y(_Y), Z(_Z), RHW(_RHW), COLOR(_COLOR)
    {}

    ~CUSTOMVERTEX(){
        OutputDebugString("Destructed!!!\n");
    }
    float X, Y, Z, RHW;
    DWORD COLOR;
};

// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    HWND hWnd;
    WNDCLASSEX wc;

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszClassName = "WindowClass";

    RegisterClassEx(&wc);

    hWnd = CreateWindowEx(NULL,
                          "WindowClass",
                          "Our Direct3D Program",
                          WS_OVERLAPPEDWINDOW,
                          0, 0,
                          SCREEN_WIDTH, SCREEN_HEIGHT,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

    ShowWindow(hWnd, nCmdShow);

    // set up and initialize Direct3D
    initD3D(hWnd);

    // enter the main loop:

    MSG msg;

    while(TRUE)
    {
        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        if(msg.message == WM_QUIT)
            break;

        render_frame();
    }

    // clean up DirectX and COM
    cleanD3D();

    return msg.wParam;
}


// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY:
            {
                PostQuitMessage(0);
                return 0;
            } break;
    }

    return DefWindowProc (hWnd, message, wParam, lParam);
}


// this function initializes and prepares Direct3D for use
void initD3D(HWND hWnd)
{
    d3d = Direct3DCreate9(D3D_SDK_VERSION);

    D3DPRESENT_PARAMETERS d3dpp;

    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow = hWnd;
    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
    d3dpp.BackBufferWidth = SCREEN_WIDTH;
    d3dpp.BackBufferHeight = SCREEN_HEIGHT;

    // create a device class using this information and the info from the d3dpp struct
    d3d->CreateDevice(D3DADAPTER_DEFAULT,
                      D3DDEVTYPE_HAL,
                      hWnd,
                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                      &d3dpp,
                      &d3ddev);

    init_graphics();    // call the function to initialize the triangle
}


// this is the function used to render a single frame
void render_frame(void)
{
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

    d3ddev->BeginScene();

        // select which vertex format we are using
        d3ddev->SetFVF(CUSTOMFVF);

        // select the vertex buffer to display
        d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));

        // copy the vertex buffer to the back buffer
        d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

    d3ddev->EndScene();

    d3ddev->Present(NULL, NULL, NULL, NULL);
}


// this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
    v_buffer->Release();    // close and release the vertex buffer
    d3ddev->Release();    // close and release the 3D device
    d3d->Release();    // close and release Direct3D
}


// this is the function that puts the 3D models into video RAM
void init_graphics(void)
{
    // create the vertices using the CUSTOMVERTEX class
    CUSTOMVERTEX vertices[] =
    {
        CUSTOMVERTEX(400.0f, 62.5f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255)),
        CUSTOMVERTEX(650.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0)),
        CUSTOMVERTEX(150.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0)),
    };

    // create a vertex buffer interface called v_buffer
    d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
                               0,
                               CUSTOMFVF,
                               D3DPOOL_MANAGED,
                               &v_buffer,
                               NULL);

    VOID* pVoid;    // a void pointer

    // lock v_buffer and load the vertices into it
    v_buffer->Lock(0, 0, (void**)&pVoid, 0);
    memcpy(pVoid, vertices, sizeof(vertices));
    v_buffer->Unlock();
}
//包括基本windows头文件和Direct3D头文件
#包括
#包括
#包括
//定义屏幕分辨率
#定义屏幕宽度800
#定义屏幕高度600
//包括Direct3D库文件
#pragma注释(lib,“d3d9.lib”)
#定义自定义FVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
//全球宣言
LPDIRECT3D9 d3d;//指向Direct3D界面的指针
LPDIRECT3DDEVICE9 d3ddev;//指向设备类的指针
LPDIRECT3DVERTEXBUFFER9 v_buffer=NULL;//指向顶点缓冲区的指针
//功能原型
void initD3D(HWND HWND);//设置并初始化Direct3D
void渲染_帧(void);//渲染单个帧
空隙清理3d(空隙);//关闭Direct3D并释放内存
void init_图形(void);//三维声明
//WindowProc函数原型
LRESULT回调WindowProc(HWND-HWND,UINT消息,WPARAM-WPARAM,LPARAM-LPARAM);
//************自定义顶点类**********/
类CUSTOMVERTEX{
公众:
自定义顶点(浮点X、浮点Y、浮点Z、浮点RHW、DWORD颜色)
:X(X),Y(Y),Z(Z),RHW(RHW),COLOR(COLOR)
{}
虚拟顶点(){
OutputDebugString(“已破坏!!!\n”);
}
浮动X、Y、Z、RHW;
德沃德颜色;
};
//任何Windows程序的入口点
int WINAPI WinMain(HINSTANCE HINSTANCE,
HINSTANCE HPPrevenstance,
LPSTR lpCmdLine,
国际展览(nCmdShow)
{
HWND-HWND;
WNDCLASSEX wc;
零内存(&wc,sizeof(WNDCLASSEX));
wc.cbSize=sizeof(WNDCLASSEX);
wc.style=CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc=WindowProc;
wc.hInstance=hInstance;
wc.hCursor=LoadCursor(空,IDC_箭头);
wc.lpszClassName=“WindowClass”;
注册类别(&wc);
hWnd=CreateWindowEx(空,
“窗口类”,
“我们的Direct3D程序”,
WS_重叠窗口,
0, 0,
屏幕宽度,屏幕高度,
无效的
无效的
hInstance,
无效);
显示窗口(hWnd、nCmdShow);
//设置并初始化Direct3D
initD3D(hWnd);
//进入主循环:
味精;
while(TRUE)
{
while(peek消息(&msg,NULL,0,0,PM_-REMOVE))
{
翻译信息(&msg);
发送消息(&msg);
}
如果(msg.message==WM\u退出)
打破
渲染_帧();
}
//清理DirectX和COM
清洁d3d();
返回msg.wParam;
}
//这是程序的主要消息处理程序
LRESULT回调WindowProc(HWND-HWND,UINT消息,WPARAM-WPARAM,LPARAM-LPARAM)
{
开关(信息)
{
案例WM_销毁:
{
PostQuitMessage(0);
返回0;
}中断;
}
返回DefWindowProc(hWnd、message、wParam、lParam);
}
//此函数用于初始化和准备Direct3D以供使用
无效初始D3D(HWND HWND)
{
d3d=Direct3DCreate9(d3d_SDK_版本);
D3D当前参数d3dpp;
零内存(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed=TRUE;
d3dpp.SwapEffect=d3dswapeeffect_DISCARD;
d3dpp.hDeviceWindow=hWnd;
d3dpp.BackBufferFormat=D3DFMT_X8R8G8B8;
d3dpp.BackBufferWidth=屏幕宽度;
d3dpp.BackBufferHeight=屏幕高度;
//使用此信息和d3dpp结构中的信息创建设备类
d3d->CreateDevice(D3DADAPTER_默认值,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&民进党,,
&d3ddev);
init_graphics();//调用函数初始化三角形
}
//这是用于渲染单个帧的函数
void渲染帧(void)
{
d3ddev->清除(0,空,D3DCLEAR_目标,D3DCOLOR_XRGB(0,0,0),1.0f,0);
d3ddev->BeginScene();
//选择要使用的顶点格式
d3ddev->SetFVF(自定义FVF);
//选择要显示的顶点缓冲区
d3ddev->SetStreamSource(0,v_缓冲区,0,sizeof(CUSTOMVERTEX));
//将顶点缓冲区复制到后缓冲区
d3ddev->DrawPrimitive(D3DPT_三角形列表,0,1);
d3ddev->EndScene();
d3ddev->Present(空,空,空,空);
}
//这是清理Direct3D和COM的函数
清除空隙3d(空隙)
{
v_buffer->Release();//关闭并释放顶点缓冲区
d3ddev->Release();//关闭并释放3D设备
d3d->Release();//关闭并释放Direct3D
}
//这是将3D模型放入视频RAM的功能
void init_图形(void)
{
//使用CUSTOMVERTEX类创建顶点
自定义顶点[]=
{
CUSTOMVERTEX(400.0f、62.5f、0.5f、1.0f、D3DCOLOR_XRGB(0、0、255)),
CUSTOMVERTEX(650.0f、500.0f、0.5f、1.0f、D3DCOLOR_XRGB(0、255、0)),
CUSTOMVERTEX(150.0f、500.0f、0.5f、1.0f、D3DCOLOR_XRGB(255、0、0)),
};
//创建一个名为v_buffer的顶点缓冲区接口
d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
0,
自定义FVF,
D3DPOOL_管理,
&v_缓冲区,
无效);
VOID*pVoid;//一个VOID指针
//锁定v_缓冲区并将顶点加载到其中
v_buffer->Lock(0,0,(无效**
struct CUSTOMVERTEX {
    CUSTOMVERTEX( float _X, float _Y, float _Z, float _RHW, DWORD _COLOR )
        : X(_X), Y(_Y), Z(_Z), RHW(_RHW), COLOR(_COLOR)
    {}

    float X, Y, Z, RHW;
    DWORD COLOR;
};
class CUSTOMVERTEX {
public:
    CUSTOMVERTEX( float _X, float _Y, float _Z, float _RHW, DWORD _COLOR )
        : X(_X), Y(_Y), Z(_Z), RHW(_RHW), COLOR(_COLOR)
    {}

    virtual ~CUSTOMVERTEX(){
        OutputDebugString("Destructed!!!\n");
    }
    float X, Y, Z, RHW;
    DWORD COLOR;
};