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事件