游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2022|回复: 3

关于导入.x文件但是一片漆黑

[复制链接]

4

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
QQ
发表于 2010-12-24 17:39:00 | 显示全部楼层 |阅读模式
我就是导入了samples中的Tiger.x文件,材质和纹理都设置了,可是为什么就是画不出来,下面是代码,是游戏开发技术详解里面的例子,可以直接运行。

#include <d3d9.h>
#include <d3dx9.h>

LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pD3DDevice = NULL;

LPD3DXMESH g_pMesh = NULL;
D3DMATERIAL9* g_pMeshMaterials = NULL;
LPDIRECT3DTEXTURE9* g_pMeshTextures = NULL;
DWORD g_dwNumMaterials = 0L;

HRESULT InitD3D(HWND hWnd)
{
        if(NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION )))
        {
                return E_FAIL;
        }

        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory(&d3dpp,sizeof(d3dpp));
        d3dpp.Windowed = TRUE;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
        d3dpp.EnableAutoDepthStencil = TRUE;
        d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

        if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDevice)))
        {
                return E_FAIL;
        }

        g_pD3DDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
        g_pD3DDevice->SetRenderState(D3DRS_AMBIENT,0xffffffff);

        return S_OK;
}

HRESULT InitGeometry()
{
        LPD3DXBUFFER pD3DXMtrelBuffer;
        if(FAILED(D3DXLoadMeshFromX("tiger.x",D3DXMESH_SYSTEMMEM,g_pD3DDevice,NULL,&pD3DXMtrelBuffer,NULL,&g_dwNumMaterials,&g_pMesh)))
        {
                return E_FAIL;
        }

        D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrelBuffer->GetBufferPointer();
        g_pMeshMaterials = new D3DMATERIAL9[g_dwNumMaterials];
        g_pMeshTextures = new LPDIRECT3DTEXTURE9[g_dwNumMaterials];

        for(DWORD i = 0; i < g_dwNumMaterials; i++)
        {
                g_pMeshMaterials = d3dxMaterials.MatD3D;

                g_pMeshMaterials.Ambient = g_pMeshMaterials.Diffuse;

                g_pMeshTextures = NULL;

                if(d3dxMaterials.pTextureFilename != NULL &&
                        lstrlen(d3dxMaterials.pTextureFilename) > 0)
                {
                       
                        if(FAILED(D3DXCreateTextureFromFile(g_pD3DDevice,d3dxMaterials.pTextureFilename,&g_pMeshTextures)))
                        {
                                return E_FAIL;
                        }
                }
        }
        pD3DXMtrelBuffer->Release();

        return S_OK;
}


void SetupMatrices()
{
        D3DXMATRIXA16 matWorld;
        D3DXMatrixRotationY(&matWorld,timeGetTime()/1000.0f);
        g_pD3DDevice->SetTransform(D3DTS_WORLD,&matWorld);

        D3DXVECTOR3 vEyePt(0.0f,3.0f,-5.0f);
        D3DXVECTOR3 vLookatPt(0.0f,0.0f,0.0f);
        D3DXVECTOR3 vUpVec(0.0f,1.0f,0.0f);

        D3DXMATRIXA16 matView;

        D3DXMatrixLookAtLH(&matView,&vEyePt,&vLookatPt,&vUpVec);
        g_pD3DDevice->SetTransform(D3DTS_VIEW,&matView);

        D3DXMATRIXA16 matProj;

        D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,100.0f);

        g_pD3DDevice->SetTransform(D3DTS_PROJECTION,&matProj);
}

void Render()
{
        g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
        if(SUCCEEDED(g_pD3DDevice->BeginScene()))
        {
                SetupMatrices();
                for(DWORD i = 0; i < g_dwNumMaterials; i++)
                {
                        g_pD3DDevice->SetMaterial(&g_pMeshMaterials);
                        g_pD3DDevice->SetTexture(0,g_pMeshTextures);

                        g_pMesh->DrawSubset(i);
                }

                g_pD3DDevice->EndScene();
        }

        g_pD3DDevice-&gtresent(NULL,NULL,NULL,NULL);
}

void Cleanup()
{
        if(g_pMeshMaterials != NULL)
                delete[] g_pMeshMaterials;
        if(g_pMeshTextures)
        {
                for(DWORD i = 0; i < g_dwNumMaterials;i++)
                {
                        if(g_pMeshTextures)
                                g_pMeshTextures->Release();
                }
                delete[] g_pMeshTextures;
        }
        if(g_pMesh != NULL)
                g_pMesh->Release();
        if(g_pD3DDevice != NULL)
                g_pD3DDevice->Release();
        if(g_pD3D != NULL)
                g_pD3D->Release();
}

LRESULT WINAPI MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
        switch(msg)
        {
        case WM_DESTROY:
                Cleanup();
                PostQuitMessage(0);
                return 0;
        }
        return DefWindowProc(hWnd,msg,wParam,lParam);
}

INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE, LPSTR, INT)
{
        WNDCLASSEX wc = {sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,"D3D Tutorial",NULL};
        RegisterClassEx(&wc);
        HWND hWnd = CreateWindow("D3D Tutorial","小老虎",WS_OVERLAPPEDWINDOW,100,100,800,600,GetDesktopWindow(),NULL,wc.hInstance,NULL);
        if(SUCCEEDED(InitD3D(hWnd)))
        {
                if(SUCCEEDED(InitGeometry()))
                {
                        ShowWindow(hWnd,SW_SHOWDEFAULT);
                        UpdateWindow(hWnd);

                        MSG msg;
                        ZeroMemory(&msg,sizeof(msg));
                        while(msg.message!=WM_QUIT)
                        {
                                if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
                                {
                                        TranslateMessage(&msg);
                                        DispatchMessage(&msg);
                                }
                                else
                                        Render();
                        }
                }
        }
        UnregisterClass("D3D Tutorial",wc.hInstance);
        return 0;
}

2

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2010-12-24 18:34:00 | 显示全部楼层

Re: 关于导入.x文件但是一片漆黑

加上D3DCLEAR_ZBUFFER

4

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
QQ
 楼主| 发表于 2010-12-24 21:08:00 | 显示全部楼层

Re: Re: 关于导入.x文件但是一片漆黑

如尘: Re: 关于导入.x文件但是一片漆黑

加上D3DCLEAR_ZBUFFER

太谢谢你了,哈哈,出来了,哈哈

5

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2010-12-25 01:45:00 | 显示全部楼层

Re:关于导入.x文件但是一片漆黑

汗死,导入一个X文件就要那么多代码吗
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-4 22:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表