游戏开发论坛

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

为什么显示不出正方形啊。代码没问题。。交流群:14404051

[复制链接]

6

主题

10

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2010-9-18 10:39:00 | 显示全部楼层 |阅读模式
#include<windows.h>
#include<d3dx9.h>

HWND hWnd;
HDC hDC;
HINSTANCE hInstance;

LPDIRECT3D9 p_D3D;
LPDIRECT3DDEVICE9 p_D3DDevice;

RECT rect;

int sw=640;
int sh=480;

bool fullscreen=1;

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

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

/*my_vertex g_vertices[]=
{
        {-1.0f,1.0f,0.0f,0xFFFFFFFF},
        {-1.0f,-1.0f,0.0f,0xFFFFFFFF},
        {1.0f,-1.0f,0.0f,0xFFFFFFFF},
        {1.0f,1.0f,0.0f,0xFFFFFFFF}
};*/

my_vertex g_vertices[]=
{
        {-1.0f,1.0f,0.0f,1.0f,D3DCOLOR_XRGB(255,0,0)},
        {-1.0f,-1.0f,0.0f,1.0f,D3DCOLOR_XRGB(255,0,0)},
        {1.0f,-1.0f,0.0f,1.0f,D3DCOLOR_XRGB(255,0,0)},
        {1.0f,1.0f,0.0f,1.0f,D3DCOLOR_XRGB(255,0,0)}
};

WORD g_Indices[]={0,1,2,0,2,3};

IDirect3DVertexBuffer9 *g_vb=NULL;
IDirect3DIndexBuffer9 *g_pb=NULL;

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")

void D3DInit()
{
        HRESULT hr;
        unsigned char *vb_vertices;
        WORD *p_index=0;
        D3DXMATRIX view_matrix;
        D3DXMATRIX matProj;
       
        p_D3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
       
        hr=p_D3DDevice->CreateVertexBuffer(4*sizeof(my_vertex),
                D3DUSAGE_WRITEONLY,
                D3DFVF_CUSTOMVERTEX,
                D3DPOOL_MANAGED,
                &g_vb,0);
       
       
        hr=p_D3DDevice->CreateIndexBuffer(6*sizeof(WORD),
                D3DUSAGE_WRITEONLY,
                D3DFMT_INDEX16,
                D3DPOOL_MANAGED,
                &g_pb,0);
       
        hr=g_vb->Lock(0,0,(void**)&vb_vertices,0);
        memcpy(vb_vertices,g_vertices,sizeof(g_vertices));
        g_vb->Unlock();
       
       
       
        hr=g_pb->Lock(0,0,(void**)&p_index,0);
    memcpy(p_index,g_Indices,sizeof(g_Indices));
        g_pb->Unlock();
       
        D3DXMatrixLookAtLH(&view_matrix,
                &D3DXVECTOR3(0.0f,0.0f,-8.0f),
                &D3DXVECTOR3(0.0f,0.0f,0.0f),
                &D3DXVECTOR3(0.0f,1.0f,0.0f));
       
        p_D3DDevice->SetTransform(D3DTS_VIEW,&view_matrix);
       
        D3DXMatrixPerspectiveFovLH(&matProj,
                D3DX_PI/4,
                ((float)sw/(float)sh),
                1.0f,
                100.0f);
       
        p_D3DDevice->SetTransform(D3DTS_PROJECTION,&matProj);
}

D3DFORMAT find_16bit_mode(void)
{
        HRESULT hr;
        hr=p_D3D->CheckDeviceType(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,D3DFMT_R5G6B5,D3DFMT_R5G6B5,FALSE);
        if(SUCCEEDED(hr))
        {
                OutputDebugString("D3DFMT_R5G6B5\n");
                return D3DFMT_R5G6B5;
        }
        hr=p_D3D->CheckDeviceType(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,D3DFMT_X1R5G5B5,D3DFMT_X1R5G5B5,FALSE);
        if(SUCCEEDED(hr))
        {
                OutputDebugString("D3DFMT_X1R5G5B5\n");
                return D3DFMT_X1R5G5B5;
        }
        return (D3DFORMAT)NULL;
}

void D3DEnable()
{
        HRESULT hr;
        D3DPRESENT_PARAMETERS d3dpp;
        D3DDISPLAYMODE display_mode;
       
        p_D3D=Direct3DCreate9(D3D_SDK_VERSION);
       
        hr=p_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&display_mode);
       
        ZeroMemory(&d3dpp,sizeof(d3dpp));
       
        d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
        d3dpp.hDeviceWindow=hWnd;
        d3dpp.BackBufferCount=1;
       
        if(fullscreen)
        {
                d3dpp.Windowed=FALSE;
                d3dpp.BackBufferWidth=sw;
                d3dpp.BackBufferHeight=sh;
                d3dpp.BackBufferFormat=find_16bit_mode();
        }
        else
        {
                d3dpp.Windowed=TRUE;
                d3dpp.BackBufferFormat=display_mode.Format;
        }
        hr=p_D3D->CreateDevice(D3DADAPTER_DEFAULT,
                                           D3DDEVTYPE_HAL,
                                           hWnd,
                                           D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                           &d3dpp,
                                           &p_D3DDevice);
}

void D3DDisable()
{
        if(p_D3DDevice)
        {
                p_D3DDevice->Release();
                p_D3DDevice=NULL;
        }
        if(p_D3D)
        {
                p_D3D->Release();
                p_D3D=NULL;
        }
        if(g_vb)
        {
                g_vb->Release();
                g_vb=NULL;
        }
        if(g_pb)
        {
        g_pb->Release();
                g_pb=NULL;
        }
}

void D3DSceneShow()
{
        D3DXMATRIX matWorld;
       
        p_D3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
        if(SUCCEEDED(p_D3DDevice->BeginScene()))
        {
                //p_D3DDevice->SetVertexShader(D3DFVF_CUSTOMVERTEX);
                p_D3DDevice->SetStreamSource(0,g_vb,0,sizeof(my_vertex));
                p_D3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
                p_D3DDevice->SetIndices(g_pb);
                p_D3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,4,0,2);
                p_D3DDevice->EndScene();
        }
        p_D3DDevice-&gtresent(NULL,NULL,NULL,NULL);
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
        switch(message)
        {
        case WM_CREATE:
                GetWindowRect(hWnd,&rect);
                sw=rect.right-rect.left;
                sh=rect.bottom-rect.top;
                return 0;
        case WM_SIZE:
                return 0;
        case WM_CLOSE:
                ShowWindow(hWnd,SW_HIDE);
                PostQuitMessage(0);
                return 0;
        case WM_DESTROY:
                return 0;
        case WM_KEYDOWN:
                switch(wParam)
                {
                case VK_ESCAPE:
                        PostMessage(hWnd,WM_CLOSE,0,0);
                        break;
                }
                return 0;
                default:
                        return DefWindowProc(hWnd,message,wParam,lParam);
        }
}

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
        WNDCLASS wc;
        MSG msg;
        bool bQuit=false;
       
        if(MessageBox(NULL,"是否选择全屏模式?","全屏方式运行?",MB_YESNO|MB_ICONQUESTION)==IDNO)
        {
                fullscreen=0;
        }
       
        wc.style=CS_OWNDC;
        wc.lpfnWndProc=WndProc;
        wc.cbClsExtra=0;
        wc.cbWndExtra=0;
        wc.hInstance=hInstance;
        wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
        wc.hCursor=LoadCursor(NULL,IDC_ARROW);
        wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
        wc.lpszMenuName=NULL;
        wc.lpszClassName="Name";
        RegisterClass(&wc);
       
        if(fullscreen)
        {
                hWnd=CreateWindow("Name","Lesson2",WS_POPUP|WS_CLIPSIBLINGS|WS_VISIBLE,0,0,
                        GetSystemMetrics(SM_CXSCREEN),
                        GetSystemMetrics(SM_CYSCREEN),
                        NULL,NULL,
                        hInstance,
                        NULL);
        }
        else
        {
                hWnd=CreateWindow("Name","Lesson2",WS_TILEDWINDOW|WS_VISIBLE,
                        GetSystemMetrics(SM_CXSCREEN)/2-sw/2,
                        GetSystemMetrics(SM_CYSCREEN)/2-sh/2,
                        sw,sh,
                        NULL,NULL,
                        hInstance,
                        NULL);
                ChangeDisplaySettings(NULL,0);
        }
        ShowWindow(hWnd,SW_SHOW);
        UpdateWindow(hWnd);
        D3DEnable();
        D3DInit();
        if(!fullscreen)
        {
                GetWindowRect(hWnd,&rect);
                sw=rect.right-rect.left;
                sh=rect.bottom-rect.top;
        }
        while(!bQuit)
        {
                if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                        if(msg.message==WM_QUIT)
                                bQuit=true;
                        else
                        {
                                TranslateMessage(&msg);
                                DispatchMessage(&msg);
                        }
                        else
                        {
                                D3DSceneShow();
                        }
        }
        D3DDisable();
        ShowWindow(hWnd,SW_HIDE);
        DestroyWindow(hWnd);
        ChangeDisplaySettings(NULL,0);
        return msg.wParam;
        return 0;
}

0

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2010-9-18 13:39:00 | 显示全部楼层

Re:为什么显示不出正方形啊。代码没问题。。交流群:144

在你D3DInit()函数内加上
p_D3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);//禁用背面拣选

顶点坐标
my_vertex g_vertices[]=
{
        {-50.0f,-50.0f,0.0f,1.0f,D3DCOLOR_XRGB(255,0,0)},
        {50.0f,50.0f,0.0f,1.0f,D3DCOLOR_XRGB(255,0,0)},
        {-50.0f,50.0f,0.0f,1.0f,D3DCOLOR_XRGB(255,0,0)},
        {50.0f,-50.0f,0.0f,1.0f,D3DCOLOR_XRGB(255,0,0)},
};

顶点索引应该以具体坐标为准,逆时针顺序
顶点索引
WORD g_Indices[]={0,1,2,0,3,1};

0

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2010-9-18 14:48:00 | 显示全部楼层

Re:为什么显示不出正方形啊。代码没问题。。交流群:144

摄像机位置
          D3DXMATRIX view_matrix;
        D3DXMATRIX matProj;
          D3DXMATRIX matWorld;

        //创建世界坐标系
        D3DXMatrixIdentity(&matWorld);//规格化世界坐标系
        p_D3DDevice->SetTransform(D3DTS_WORLD,&matWorld);

        D3DXMatrixLookAtLH(&view_matrix,
                &D3DXVECTOR3(0.0f,0.0f,-200.0f),
                &D3DXVECTOR3(0.0f,0.0f,0.0f),
                &D3DXVECTOR3(0.0f,1.0f,0.0f));

        p_D3DDevice->SetTransform(D3DTS_VIEW,&view_matrix);

        D3DXMatrixPerspectiveFovLH(&matProj,
                D3DX_PI/4,
                ((float)sw/(float)sh),
                1.0f,
                1000.0f);

23

主题

64

帖子

64

积分

注册会员

Rank: 2

积分
64
发表于 2010-9-18 22:30:00 | 显示全部楼层

Re:为什么显示不出正方形啊。代码没问题。。交流群:144

同意楼上,少个世界矩阵
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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