游戏开发论坛

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

初学DirectX怎么显示不出三角形?

[复制链接]

14

主题

46

帖子

50

积分

注册会员

Rank: 2

积分
50
发表于 2010-9-9 19:14:00 | 显示全部楼层 |阅读模式
源代码如下:

#include "d3d9.h"
#include "windows.h"

LPDIRECT3D9                                g_pD3D                        =        NULL;
LPDIRECT3DDEVICE9                g_pd3dDevice        =        NULL;
LPDIRECT3DVERTEXBUFFER9        g_pVB                        =        NULL;

struct CUSTOMVERTEX
{
        FLOAT x,y,z, rhw;
        DWORD color;
};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)  //定点格式



HRESULT InitVB()
{
        CUSTOMVERTEX vertices[] =
        {                                                   {100.f, 400.f, 0.5f, 1.0f, 0xffff0000},
                                                           {300.f, 50.f,  0.5f, 1.0f, 0xff00ff00},
                                                           {500.f, 400.f, 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;
}

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;


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

        return S_OK;
}

VOID Cleanup()
{
        if(g_pVB!=NULL)
                g_pVB->Release();

        if(g_pd3dDevice!=NULL)
                g_pd3dDevice->Release();
        if(g_pD3D!=NULL)
                g_pD3D->Release();
}


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-&gtresent(NULL,NULL,NULL,NULL);

}


LRESULT        WINAPI        MsgProc(HWND hWnd, UINT msg,WPARAM        wParam,        LPARAM lParam)
{
        switch(msg)
        {
        case WM_DESTROY:
                Cleanup();
                PostQuitMessage(0);
                return 0;
        case WM_PAINT:
                Render();
                //ValidataRect(hWnd,NULL);
                return 0;

        }
        return DefWindowProc(hWnd,msg,wParam,lParam);
}


INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
//INT WINPAI WinMain( HINSTANCE hInst, HINSTANCE,        LPSTR, INT )
{
         WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      L"ClassName", NULL };

        RegisterClassEx( &wc );

        HWND hWnd=CreateWindow(L"ClassName",        L"最简单的",        WS_OVERLAPPEDWINDOW,       
                200,200,800,600,NULL,        NULL,        wc.hInstance,        NULL);

        if(SUCCEEDED(InitD3D(hWnd)))
        {
                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;
}

5

主题

42

帖子

42

积分

注册会员

Rank: 2

积分
42
发表于 2010-9-10 16:03:00 | 显示全部楼层

Re:初学DirectX怎么显示不出三角形?

你试一下设置摄像机 根据你的三角形位置,默认镜头好像看不到

4

主题

81

帖子

81

积分

注册会员

Rank: 2

积分
81
发表于 2010-9-10 19:50:00 | 显示全部楼层

Re:初学DirectX怎么显示不出三角形?

没有显示三角形的原因是
InitVB() 根本就没有调用

if(SUCCEEDED(InitD3D(hWnd))) 你只判断了设备是否初始化成功
加个if( SUCCEEDED( InitVB() ) )

PS:这个是经过变换的顶点坐标 不需要摄像机 [em11]

14

主题

46

帖子

50

积分

注册会员

Rank: 2

积分
50
 楼主| 发表于 2010-9-11 18:02:00 | 显示全部楼层

Re:初学DirectX怎么显示不出三角形?

饿,,谢谢大神们,问题正如LS所说!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-6 14:36

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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