C++ DIRECTX9中CustomVertex的虚拟析构函数
这是我关于stackoverflow的第一个问题,如果我的问题很愚蠢,请原谅我。 我试图在Visual Studio 2012中简单地在DirectX9中渲染一个三角形,如下所示:www.directxtural.com/Lesson.aspx?lessonid=9-4-4 当我使用非虚拟析构函数创建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
// 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;
};