这个简单的Direct3D程序我都搞不定了,求帮助

加油安娜 发布于 2012/10/24 16:17
阅读 675
收藏 0
//=============================================================================
// Desc: 使用顶点缓冲区绘制三角形
//=============================================================================

#include <d3d9.h>


//-----------------------------------------------------------------------------
// Desc: 全局变量
//------------------------------------------------------------------------------
LPDIRECT3D9             g_pD3D       = NULL;    //Direct3D对象
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL;    //Direct3D设备对象
LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL;    //顶点缓冲区对象


//-----------------------------------------------------------------------------
// Desc: 顶点结构
//-----------------------------------------------------------------------------
struct CUSTOMVERTEX
{
    FLOAT x, y, z, rhw;
    DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)  //灵活顶点格式


//-----------------------------------------------------------------------------
// Desc: 初始化Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
 //创建Direct3D对象, 该对象用于创建Direct3D设备对象
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

 //设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

 //创建Direct3D设备对象
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }

    return S_OK;
}


//-----------------------------------------------------------------------------
// Desc: 创建并填充顶点缓冲区
//-----------------------------------------------------------------------------
HRESULT InitVB()
{
 //顶点数据
    CUSTOMVERTEX vertices[] =
    {
  { 100.0f, 400.0f, 0.5f, 1.0f, 0xffff0000, },
        { 300.0f,  50.0f, 0.5f, 1.0f, 0xff00ff00, },
        { 500.0f, 400.0f, 0.5f, 1.0f, 0xff0000ff, },
    };

 //创建顶点缓冲区
    if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
                                                  0, D3DFVF_CUSTOMVERTEX,
                                                  D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
    {
        return E_FAIL;
    }

 //填充顶点缓冲区
    VOID* pVertices;
    if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
        return E_FAIL;
    memcpy( pVertices, vertices, sizeof(vertices) );
    g_pVB->Unlock();

    return S_OK;
}


//-----------------------------------------------------------------------------
// Desc: 释放创建的对象
//-----------------------------------------------------------------------------
VOID Cleanup()
{
 //释放顶点缓冲区对象
    if( g_pVB != NULL )       
        g_pVB->Release();

 //释放Direct3D设备对象
    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();

 //释放Direct3D对象
    if( g_pD3D != NULL )      
        g_pD3D->Release();
}


//-----------------------------------------------------------------------------
// Desc: 渲染图形
//-----------------------------------------------------------------------------
VOID Render()
{
 //清空后台缓冲区
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 );

 //开始在后台缓冲区绘制图形
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
  //在后台缓冲区绘制图形
        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
        g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
  g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );

  //结束在后台缓冲区绘制图形
        g_pd3dDevice->EndScene();
    }

 //将在后台缓冲区绘制的图形提交到前台缓冲区显示
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}


//-----------------------------------------------------------------------------
// Desc: 消息处理
//-----------------------------------------------------------------------------
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 );
}


//-----------------------------------------------------------------------------
// Desc: 入口函数
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
 //注册窗口类
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      L"ClassName", NULL };//刚才这里有个L
    RegisterClassEx( &wc );

 //创建窗口
    HWND hWnd = CreateWindow( L"ClassName", L"顶点缓冲区",
                              WS_OVERLAPPEDWINDOW, 200, 100, 600, 500,
                              GetDesktopWindow(), NULL, wc.hInstance, NULL );

 //初始化Direct3D
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
  //创建并填充顶点缓冲区
        if( SUCCEEDED( InitVB() ) )
        {
   //显示窗口
            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(L"ClassName", wc.hInstance);
    return 0;
} 
--------------------Configuration: VertexBuffer - Win32 Debug--------------------

Compiling...
VertexBuffer.cpp
D:\网络游戏引擎技术原理\精通directX\03_第三章 坐标系与基本图元\01_VertexBuffer\VertexBuffer.cpp(156) : error C2440: 'initializing' : cannot convert from 'unsigned short [10]' to 'const char *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
D:\网络游戏引擎技术原理\精通directX\03_第三章 坐标系与基本图元\01_VertexBuffer\VertexBuffer.cpp(162) : error C2664: 'CreateWindowExA' : cannot convert parameter 2 from 'unsigned short [10]' to 'const char *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
D:\网络游戏引擎技术原理\精通directX\03_第三章 坐标系与基本图元\01_VertexBuffer\VertexBuffer.cpp(192) : error C2664: 'UnregisterClassA' : cannot convert parameter 1 from 'unsigned short [10]' to 'const char *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.

VertexBuffer.obj - 3 error(s), 0 warning(s)

=========================================================

注:我一直怀疑我的VC++有重大问题,于是今天把注册表里的关于VC的东西全卸载了。重新装了VC++6.0,又装了DirectX,现在编译程序出现了这样的问题,网上说是什么Unicode编码问题,天,为什么我同学的就没问题。。求各位解释。。帮解决

加载中
0
zcfox
zcfox

大概就是类型问题,我把报错处的L去掉就可以编译通过了

vs2012 express for desktop

附运行效果:

0
加油安娜
加油安娜
对,就是这样的。我在网上又看了很多之后,让VC++配置UNICODE编码,之后运行程序就可以了,但是还得在头文件#pragma comment(lib, "d3d9.lib")。可是我明明已经将DirectX的库文件和头文件都配置到了VC++中,不知道为什么还要加这句话。。。
0
小耶果
小耶果
加上_UNICODE和UNICODE的定义试试
加油安娜
加油安娜
嗯,加上就好了。但不知道为什么?求解释
0
岛
属性-》常规-》字符集
加油安娜
加油安娜
这是什么?
0
r
rsong
头文件上加上 #include <tchar.h> ,然后再把L宏改为_T()宏,如  L"ClassName"改成_T(  "ClassName"),L是将字符串改成UNICODE型,VC6.0中默认的是ASCII码,而_T()宏根据你的环境,如果定义了Unicode字符集,那么它就等价于L,如果没有定义,则默认为ASCII.这样就可以方便一直到默认Unicode字符集的VS开发工具中了。当然,如果只是在VC6的环境,直接 把报错处的L去掉就好了
返回顶部
顶部