C++ 使用DirectX 9显示网格 #包括 #包括 #包括 #定义抛出错误和退出(x){\ MessageBox(0,x,0,0)\ 返回-1\ } LRESULT回调WndProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM) { //处理关闭事件 开关(msg) { 案例WM_销毁: PostQuitMessage(0); 返回0; } 返回DefWindowProc(hWnd、msg、wParam、lParam); } int APICENTRY WinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevInstance、LPSTR lpCmdLine、int nCmdShow) { //注册班 WNDCLASSEX wcex; wcex.cbSize=sizeof(WNDCLASSEX); wcex.style=CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc=(WNDPROC)WNDPROC; wcex.cbClsExtra=0; wcex.cbWndExtra=0; wcex.hInstance=hInstance; wcex.hIcon=0; wcex.hCursor=LoadCursor(空,IDC_箭头); wcex.hbrBackground=(HBRUSH)(彩色窗口+1); wcex.lpszMenuName=0; wcex.lpszClassName=“MyMeshViewer”; wcex.hIconSm=0; 注册类别(&wcex); //创建窗口 HWND HWND=CreateWindow(“MyMeshViewer”、“MyMeshViewer”、WS_OVERLAPPEDWINDOW、CW_USEDEFAULT、CW_USEDEFAULT、CW_USEDEFAULT、CW_USEDEFAULT、NULL、NULL、hInstance、NULL); //创建Direct3D对象 LPDIRECT3D9 d3dObject=NULL; LPDIRECT3DDEVICE9 d3dDevice=NULL; d3dObject=Direct3DCreate9(D3D_SDK_版本); //创建Direct3D设备 if(NULL==d3dObject) 抛出错误和退出(“NULL==d3dObject”); D3D当前参数预参数; 零内存(&presParams,sizeof(presParams)); 预参数加窗=真; 预参数SwapEffect=D3DSWAPEFFECT_DISCARD; presParams.BackBufferFormat=D3DFMT_未知; presParams.PresentationInterval=D3D Present\u INTERVAL\u ONE; HRESULT hr=d3dObject->CreateDevice(D3DADAPTER\u默认值、D3DDEVTYPE\u HAL、hWnd、D3DCREATE\u硬件\u VERTEXPROCESSING、&presParams、&d3dDevice); 如果(失败(小时)) 抛出错误并退出(“d3dObject->CreateDevice”); //渲染 D3D设备->清除(0,空,D3D清除目标,D3D颜色XRGB(0255,0),1.0f,0); d3dDevice->BeginScene(); //加载网格 LPD3DXBUFFER materialBuffer=NULL; DWORD numMaterials=0; LPD3DXMESH mesh=NULL; hr=D3DXLoadMeshFromX(“tiger.x”,D3DXMESH_SYSTEMMEM, d3dDevice,NULL, &materialBuffer、NULL和numMaterials, &网状物); 如果(失败(小时)) 抛出错误并退出(“hr=D3DXLoadMeshFromX”); //加载物料缓冲区 D3DXMATERIAL*d3dxMaterials=(D3DXMATERIAL*)materialBuffer->GetBufferPointer(); //保存材质和纹理指针 D3DMATERIAL9*meshMaterials=新的D3DMATERIAL9[数值材料]; LPDIRECT3DTEXTURE9*meshTextures=新的LPDIRECT3DTEXTURE9[numMaterials]; //填充材质和纹理阵列 对于(DWORD i=0;iRelease(); 对于(DWORD i=0;iSetMaterial(&meshMaterials[i]); d3dDevice->SetTexture(0,网格纹理[i]); //绘制网格子集 网格->绘制子集(i); } d3dDevice->EndScene(); d3dDevice->Present(空,空,空,空); //橱窗 显示窗口(hWnd、nCmdShow); 更新窗口(hWnd); //处理消息 味精; while(GetMessage(&msg,NULL,0,0)) { 翻译信息(&msg); 发送消息(&msg); } 返回(int)msg.wParam; }
这是我的程序,用于加载网格C++ 使用DirectX 9显示网格 #包括 #包括 #包括 #定义抛出错误和退出(x){\ MessageBox(0,x,0,0)\ 返回-1\ } LRESULT回调WndProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM) { //处理关闭事件 开关(msg) { 案例WM_销毁: PostQuitMessage(0); 返回0; } 返回DefWindowProc(hWnd、msg、wParam、lParam); } int APICENTRY WinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevInstance、LPSTR lpCmdLine、int nCmdShow) { //注册班 WNDCLASSEX wcex; wcex.cbSize=sizeof(WNDCLASSEX); wcex.style=CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc=(WNDPROC)WNDPROC; wcex.cbClsExtra=0; wcex.cbWndExtra=0; wcex.hInstance=hInstance; wcex.hIcon=0; wcex.hCursor=LoadCursor(空,IDC_箭头); wcex.hbrBackground=(HBRUSH)(彩色窗口+1); wcex.lpszMenuName=0; wcex.lpszClassName=“MyMeshViewer”; wcex.hIconSm=0; 注册类别(&wcex); //创建窗口 HWND HWND=CreateWindow(“MyMeshViewer”、“MyMeshViewer”、WS_OVERLAPPEDWINDOW、CW_USEDEFAULT、CW_USEDEFAULT、CW_USEDEFAULT、CW_USEDEFAULT、NULL、NULL、hInstance、NULL); //创建Direct3D对象 LPDIRECT3D9 d3dObject=NULL; LPDIRECT3DDEVICE9 d3dDevice=NULL; d3dObject=Direct3DCreate9(D3D_SDK_版本); //创建Direct3D设备 if(NULL==d3dObject) 抛出错误和退出(“NULL==d3dObject”); D3D当前参数预参数; 零内存(&presParams,sizeof(presParams)); 预参数加窗=真; 预参数SwapEffect=D3DSWAPEFFECT_DISCARD; presParams.BackBufferFormat=D3DFMT_未知; presParams.PresentationInterval=D3D Present\u INTERVAL\u ONE; HRESULT hr=d3dObject->CreateDevice(D3DADAPTER\u默认值、D3DDEVTYPE\u HAL、hWnd、D3DCREATE\u硬件\u VERTEXPROCESSING、&presParams、&d3dDevice); 如果(失败(小时)) 抛出错误并退出(“d3dObject->CreateDevice”); //渲染 D3D设备->清除(0,空,D3D清除目标,D3D颜色XRGB(0255,0),1.0f,0); d3dDevice->BeginScene(); //加载网格 LPD3DXBUFFER materialBuffer=NULL; DWORD numMaterials=0; LPD3DXMESH mesh=NULL; hr=D3DXLoadMeshFromX(“tiger.x”,D3DXMESH_SYSTEMMEM, d3dDevice,NULL, &materialBuffer、NULL和numMaterials, &网状物); 如果(失败(小时)) 抛出错误并退出(“hr=D3DXLoadMeshFromX”); //加载物料缓冲区 D3DXMATERIAL*d3dxMaterials=(D3DXMATERIAL*)materialBuffer->GetBufferPointer(); //保存材质和纹理指针 D3DMATERIAL9*meshMaterials=新的D3DMATERIAL9[数值材料]; LPDIRECT3DTEXTURE9*meshTextures=新的LPDIRECT3DTEXTURE9[numMaterials]; //填充材质和纹理阵列 对于(DWORD i=0;iRelease(); 对于(DWORD i=0;iSetMaterial(&meshMaterials[i]); d3dDevice->SetTexture(0,网格纹理[i]); //绘制网格子集 网格->绘制子集(i); } d3dDevice->EndScene(); d3dDevice->Present(空,空,空,空); //橱窗 显示窗口(hWnd、nCmdShow); 更新窗口(hWnd); //处理消息 味精; while(GetMessage(&msg,NULL,0,0)) { 翻译信息(&msg); 发送消息(&msg); } 返回(int)msg.wParam; },c++,directx,C++,Directx,这是我的程序,用于加载网格tiger.x并显示它。但它不会显示。变量numMaterials的值始终保持为1。我想我的程序可能有问题。请有人帮我解决。谢谢 下面的tiger.xmesh文件 问题在于,您正在渲染窗口,然后调用UpdateWindow,这将强制重新绘制,从而删除图形 我建议您下载DirectX SDK并查看示例,以了解如何构建“正确”的渲染循环。问题在于,您正在渲染窗口,然后调用UpdateWindow,这将强制重新绘制,从而删除图形 #include <windows.h
tiger.x
并显示它。但它不会显示。变量numMaterials
的值始终保持为1。我想我的程序可能有问题。请有人帮我解决。谢谢
下面的
tiger.x
mesh文件
问题在于,您正在渲染窗口,然后调用UpdateWindow,这将强制重新绘制,从而删除图形
我建议您下载DirectX SDK并查看示例,以了解如何构建“正确”的渲染循环。问题在于,您正在渲染窗口,然后调用UpdateWindow,这将强制重新绘制,从而删除图形
#include <windows.h>
#include <d3d9.h>
#include <D3DX9Mesh.h>
#define THROW_ERROR_AND_EXIT(x) { \
MessageBox(0,x,0,0); \
return -1; \
}
LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
// Handle close event
switch( msg )
{
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// Registering class
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style= CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc= (WNDPROC)WndProc;
wcex.cbClsExtra= 0;
wcex.cbWndExtra= 0;
wcex.hInstance= hInstance;
wcex.hIcon= 0;
wcex.hCursor= LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName= 0;
wcex.lpszClassName= "MyMeshViewer";
wcex.hIconSm= 0;
RegisterClassEx(&wcex);
// Creating Window
HWND hWnd = CreateWindow("MyMeshViewer", "MyMeshViewer", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
// Creating Direct3D object
LPDIRECT3D9 d3dObject=NULL;
LPDIRECT3DDEVICE9 d3dDevice=NULL;
d3dObject=Direct3DCreate9(D3D_SDK_VERSION);
// Creating Direct3D device
if(NULL == d3dObject)
THROW_ERROR_AND_EXIT("NULL == d3dObject");
D3DPRESENT_PARAMETERS presParams;
ZeroMemory(&presParams,sizeof(presParams));
presParams.Windowed=TRUE;
presParams.SwapEffect=D3DSWAPEFFECT_DISCARD;
presParams.BackBufferFormat=D3DFMT_UNKNOWN;
presParams.PresentationInterval=D3DPRESENT_INTERVAL_ONE;
HRESULT hr=d3dObject->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &presParams, &d3dDevice);
if(FAILED(hr))
THROW_ERROR_AND_EXIT("d3dObject->CreateDevice");
// Rendering
d3dDevice->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,255,0),1.0f,0);
d3dDevice->BeginScene();
// Loading the mesh
LPD3DXBUFFER materialBuffer = NULL;
DWORD numMaterials = 0;
LPD3DXMESH mesh = NULL;
hr=D3DXLoadMeshFromX("tiger.x", D3DXMESH_SYSTEMMEM,
d3dDevice, NULL,
&materialBuffer,NULL, &numMaterials,
&mesh );
if(FAILED(hr))
THROW_ERROR_AND_EXIT("hr=D3DXLoadMeshFromX");
// Loading the material buffer
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)materialBuffer->GetBufferPointer();
// Holding material and texture pointers
D3DMATERIAL9 *meshMaterials = new D3DMATERIAL9[numMaterials];
LPDIRECT3DTEXTURE9 *meshTextures = new LPDIRECT3DTEXTURE9[numMaterials];
// Filling material and texture arrays
for (DWORD i=0; i<numMaterials; i++)
{
// Copy the material
meshMaterials[i] = d3dxMaterials[i].MatD3D;
// Set the ambient color for the material (D3DX does not do this)
meshMaterials[i].Ambient = meshMaterials[i].Diffuse;
// Create the texture if it exists - it may not
meshTextures[i] = NULL;
if (d3dxMaterials[i].pTextureFilename)
D3DXCreateTextureFromFile(d3dDevice, d3dxMaterials[i].pTextureFilename, &meshTextures[i]);
}
materialBuffer->Release();
for (DWORD i=0; i<numMaterials; i++)
{
// Set the material and texture for this subset
d3dDevice->SetMaterial(&meshMaterials[i]);
d3dDevice->SetTexture(0,meshTextures[i]);
// Draw the mesh subset
mesh->DrawSubset( i );
}
d3dDevice->EndScene();
d3dDevice->Present(NULL, NULL, NULL, NULL);
// Show Window
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// Handle messages
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
我建议您下载DirectX SDK并查看示例以了解如何构建“正确”的呈现循环。LRESULT回调WndProc(HWND-HWND,UINT-message,WPARAM-WPARAM,LPARAM-LPARAM)
#include <windows.h>
#include <d3d9.h>
#include <D3DX9Mesh.h>
#define THROW_ERROR_AND_EXIT(x) { \
MessageBox(0,x,0,0); \
return -1; \
}
LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
// Handle close event
switch( msg )
{
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// Registering class
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style= CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc= (WNDPROC)WndProc;
wcex.cbClsExtra= 0;
wcex.cbWndExtra= 0;
wcex.hInstance= hInstance;
wcex.hIcon= 0;
wcex.hCursor= LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName= 0;
wcex.lpszClassName= "MyMeshViewer";
wcex.hIconSm= 0;
RegisterClassEx(&wcex);
// Creating Window
HWND hWnd = CreateWindow("MyMeshViewer", "MyMeshViewer", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
// Creating Direct3D object
LPDIRECT3D9 d3dObject=NULL;
LPDIRECT3DDEVICE9 d3dDevice=NULL;
d3dObject=Direct3DCreate9(D3D_SDK_VERSION);
// Creating Direct3D device
if(NULL == d3dObject)
THROW_ERROR_AND_EXIT("NULL == d3dObject");
D3DPRESENT_PARAMETERS presParams;
ZeroMemory(&presParams,sizeof(presParams));
presParams.Windowed=TRUE;
presParams.SwapEffect=D3DSWAPEFFECT_DISCARD;
presParams.BackBufferFormat=D3DFMT_UNKNOWN;
presParams.PresentationInterval=D3DPRESENT_INTERVAL_ONE;
HRESULT hr=d3dObject->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &presParams, &d3dDevice);
if(FAILED(hr))
THROW_ERROR_AND_EXIT("d3dObject->CreateDevice");
// Rendering
d3dDevice->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,255,0),1.0f,0);
d3dDevice->BeginScene();
// Loading the mesh
LPD3DXBUFFER materialBuffer = NULL;
DWORD numMaterials = 0;
LPD3DXMESH mesh = NULL;
hr=D3DXLoadMeshFromX("tiger.x", D3DXMESH_SYSTEMMEM,
d3dDevice, NULL,
&materialBuffer,NULL, &numMaterials,
&mesh );
if(FAILED(hr))
THROW_ERROR_AND_EXIT("hr=D3DXLoadMeshFromX");
// Loading the material buffer
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)materialBuffer->GetBufferPointer();
// Holding material and texture pointers
D3DMATERIAL9 *meshMaterials = new D3DMATERIAL9[numMaterials];
LPDIRECT3DTEXTURE9 *meshTextures = new LPDIRECT3DTEXTURE9[numMaterials];
// Filling material and texture arrays
for (DWORD i=0; i<numMaterials; i++)
{
// Copy the material
meshMaterials[i] = d3dxMaterials[i].MatD3D;
// Set the ambient color for the material (D3DX does not do this)
meshMaterials[i].Ambient = meshMaterials[i].Diffuse;
// Create the texture if it exists - it may not
meshTextures[i] = NULL;
if (d3dxMaterials[i].pTextureFilename)
D3DXCreateTextureFromFile(d3dDevice, d3dxMaterials[i].pTextureFilename, &meshTextures[i]);
}
materialBuffer->Release();
for (DWORD i=0; i<numMaterials; i++)
{
// Set the material and texture for this subset
d3dDevice->SetMaterial(&meshMaterials[i]);
d3dDevice->SetTexture(0,meshTextures[i]);
// Draw the mesh subset
mesh->DrawSubset( i );
}
d3dDevice->EndScene();
d3dDevice->Present(NULL, NULL, NULL, NULL);
// Show Window
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// Handle messages
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
{
开关(信息)
{
案例WM_油漆:
{
//渲染
D3D设备->清除(0,空,D3D清除目标,D3D颜色XRGB(0,255,0),1.0f,0);
d3dDevice->BeginScene();
对于(DWORD i=0;iSetMaterial(&meshMaterials[i]);
d3dDevice->SetTexture(0,网格纹理[i]);
//绘制网格子集
网格->绘制子集(i);
}
d3dDevice->EndScene();
d3dDevice->Present(空,空,空,空);
}
打破
案例WM_销毁:
PostQuitMessage(0);
打破
违约:
返回DefWindowProc(hWnd、message、wParam、lParam);
}
返回0;
}
您必须处理WM_PAINT事件。LRESULT回调WndProc(HWND-HWND,UINT消息,WPARAM-WPARAM,LPARAM-LPARAM)
{
开关(信息)
{
案例WM_油漆:
{
//渲染
D3D设备->清除(0,空,D3D清除目标,D3D颜色XRGB(0,255,0),1.0f,0);
d3dDevice->BeginScene();
对于(DWORD i=0;iSetMaterial(&meshMaterials[i]);
d3dDevice->SetTexture(0,网格纹理[i]);
//绘制网格子集
网格->绘制子集(i);
}
d3dDevice->EndScene();
d3dDevice->Present(空,空,空,空);
}
打破
案例WM_销毁:
PostQuitMessage(0);
打破
违约:
返回DefWindowProc(hWnd、message、wParam、lParam);
}
返回0;
}
您必须处理WM_PAINT事件