游戏开发论坛

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

这段程序为什么什么都画不出来?

[复制链接]

2

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2006-11-20 14:51:00 | 显示全部楼层 |阅读模式
#include <windows.h>
#include <d3d9.h>

struct Vertex {
        float x, y, z;
        DWORD diffuse;
};

/*****************************************************************************
GLOBALS
*****************************************************************************/
HWND hWnd = NULL;
PDIRECT3D9 pD3D = NULL;
PDIRECT3DDEVICE9 pd3dDevice = NULL;
PDIRECT3DVERTEXBUFFER9 pd3dVB = NULL;

/*****************************************************************************
PROTOTYPES
*****************************************************************************/
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg,
                                                        WPARAM wParam, LPARAM lParam);
int Initialize(HINSTANCE hInstance);
void Shutdown();
void Render();
void CreateWnd(HINSTANCE hInstance, int width, int height);
int CreateDevice();
void CreateVertexBuffer();
void SetupMatrices();

/*****************************************************************************/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int) {
        MSG msg;

        ZeroMemory(&msg, sizeof(msg));

        if (Initialize(hInstance)) {
                while (msg.message != WM_QUIT) {
                        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
                                DispatchMessage(&msg);
                        }
                        Render();
                }
        }
        Shutdown();
        return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg,
                                                        WPARAM wParam, LPARAM lParam) {
        switch(uMsg) {
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
        default:;
        }
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

int Initialize(HINSTANCE hInstance) {
        WNDCLASSEX wce;

        memset(&wce, 0, sizeof(wce));
        wce.cbSize = sizeof(wce);
        wce.lpfnWndProc = WindowProc;
        wce.hInstance = hInstance;
        wce.hCursor = LoadCursor(NULL, IDC_ARROW);
        wce.lpszClassName = "D3DWND";

        RegisterClassEx(&wce);
        CreateWnd(hInstance, 800, 600);

        pD3D = Direct3DCreate9(D3D_SDK_VERSION);
        if (pD3D == NULL) {
                return 0;
        }
        if (!CreateDevice()) {
                return 0;
        }
        SetupMatrices();
        CreateVertexBuffer();

        pd3dDevice->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE);
        pd3dDevice->SetStreamSource(0, pd3dVB, 0, sizeof(Vertex));

        return 1;
}

void CreateWnd(HINSTANCE hInstance, int width, int height) {
        RECT rt;
        DWORD style;

        rt.top = 0;
        rt.bottom = height;
        rt.left = 0;
        rt.right = width;
        style = WS_OVERLAPPEDWINDOW; //WS_POPUP | WS_CAPTION | WS_SYSMENU;
        AdjustWindowRectEx(&rt, style, 0, 0);

        width = rt.right - rt.left;
        height = rt.bottom - rt.top;
        hWnd = CreateWindowEx(WS_EX_TOPMOST, "D3DWND", "Direct3D Initialize",
                                                  style | WS_VISIBLE, 0, 0, width, height,
                                                  NULL, NULL, hInstance, NULL);
}

int CreateDevice(void) {
        D3DPRESENT_PARAMETERS d3dpp;
        DWORD behavior;

        memset(&d3dpp, 0, sizeof(d3dpp));
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.Windowed = TRUE;

        behavior = D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE;

        if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                                                  behavior, &d3dpp,
                                                                  &pd3dDevice))) {
                return 0;
        }
return 1;
}

void CreateVertexBuffer() {

Vertex vertices[] = {
                        400, 0, 0, 0xffff0000,
                        800, 600, 0, 0xff00ff00,
                        0, 600, 0, 0xff00ffff,
        };
        pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0,
                                                                   D3DFVF_XYZ | D3DFVF_DIFFUSE,
                                                                   D3DPOOL_DEFAULT, &pd3dVB, NULL);
        void* pV;
        pd3dVB->Lock(0, 0, &pV, 0);
        memcpy(pV, vertices, sizeof(vertices));
        pd3dVB->Unlock();
}

void SetupMatrices() {
        D3DMATRIX identity = {
                1, 0, 0, 0,
                0, 1, 0, 0,
                0, 0, 1, 0,
                0, 0, 0, 1
        };
        pd3dDevice->SetTransform(D3DTS_WORLD, &identity);
        pd3dDevice->SetTransform(D3DTS_VIEW, &identity);
        pd3dDevice->SetTransform(D3DTS_PROJECTION, &identity);
}

void Shutdown() {
        if (pd3dVB) {
                pd3dVB->Release();
                pd3dVB = NULL;
        }
        if (pd3dDevice) {
                pd3dDevice->Release();
                pd3dDevice = NULL;
        }
        if (pD3D) {
                pD3D->Release();
                pD3D = NULL;
        }
        if (hWnd) {
                DestroyWindow(hWnd);
                hWnd = NULL;
        }
}

void Render() {
        pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, 0, 0, 0);
        pd3dDevice->BeginScene();
           pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
        pd3dDevice->EndScene();
        pd3dDevice-&gtresent(NULL, NULL, NULL, NULL);
}

2

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2006-11-20 15:14:00 | 显示全部楼层

Re:这段程序为什么什么都画不出来?

用rhw就画得出来

125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
发表于 2006-11-20 18:29:00 | 显示全部楼层

Re:这段程序为什么什么都画不出来?

g_pd3dDevice->SetRenderState(D3DRS_LIGHTING,false);

125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
发表于 2006-11-20 18:41:00 | 显示全部楼层

Re:这段程序为什么什么都画不出来?

矩阵变换错了。

D3DXMATRIX   mWorld,mView, mProj;

D3DXMatrixRotationxY(&mWorld, timeGetTime()/1000.0f);
m_pd3dDevice->SetTransform(D3DTS_WORLD, &mWorld);

D3DXVECTOR3 eye(0.0f, 0.0f, -5.0f);
D3DXVECTOR3 pos(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
D3DXMatrixLookAtLH(&mView, &eye, &pos, &up);
m_pd3dDevice->SetTransform(D3DTS_VIEW, &mView);

D3DXMatrixPerspectiveFovLH(&mProj, D3DX_PI * 0.25f, (float)Width/(float)Height, 1.0f, 200.0f);
m_pd3dDevice->SetTransform(D3DTS_PROJECTION , &mProj);
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 22:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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