游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2245|回复: 5

初学D3D,画不了线,各们DX帮我看一下。

[复制链接]

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2009-7-1 19:47:00 | 显示全部楼层 |阅读模式
我初学D3D,画个空白屏还可以,可是到画线的时候就是老不成功,各位大侠帮我看下问题出在哪里,谢谢了。

原码如下:
#include <d3d9.h>

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

#define WINDOW_CLASS "UGPDX"
#define WINDOW_NAME "Drawing Lines"

bool InitializeD3D(HWND hWnd,bool fullscreen);
bool InitializeObjects();
void RenderScene();
void Shutdown();

LPDIRECT3D9 g_D3D = NULL;
LPDIRECT3DDEVICE9 g_D3DDevice=NULL;
LPDIRECT3DVERTEXBUFFER9 g_VertexBuffer=NULL;

struct stD3DVertex
{
        float x,y,z;
        DWORD color;
};

#define D3DFVF_VERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)

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

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE prevhInst,LPSTR cmdLine,int show)
{
        WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0,0,hInst,NULL,NULL,NULL,NULL,WINDOW_CLASS,NULL};
        RegisterClassEx(&wc);
        HWND hWnd=CreateWindow(WINDOW_CLASS,WINDOW_NAME,WS_OVERLAPPEDWINDOW,100,100,640,480,GetDesktopWindow(),NULL,wc.hInstance,NULL);

        if(InitializeD3D(hWnd,false))
        {
                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
                        {
                                RenderScene();
                        }
                }
        }

        Shutdown();
        UnregisterClass(WINDOW_CLASS,wc.hInstance);
        return 0;
}

bool InitializeD3D(HWND hWnd,bool fullscreen)
{
        D3DDISPLAYMODE displayMode;
        g_D3D=Direct3DCreate9(D3D_SDK_VERSION);

        if(g_D3D== NULL) return false;
       
        if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&displayMode))) return false;

        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory(&d3dpp,sizeof(d3dpp));

        if(fullscreen)
        {
                d3dpp.Windowed=FALSE;
                d3dpp.BackBufferWidth=640;
                d3dpp.BackBufferHeight=480;
        }
        else
                d3dpp.Windowed=TRUE;
        d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat=displayMode.Format;
               
        if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_D3DDevice))) return false;
        if(!InitializeObjects())        return false;

        return true;
}

bool InitializeObjects()
{
        DWORD col=D3DCOLOR_XRGB(255,255,255);

        stD3DVertex objData[]={{420.5f,150.5f,0.5f,col,},{420.5f,350.5f,0.5f,col,},{220.5f,150.5f,0.5f,col,},{220.5f,350.5f,0.5f,col,},};

        if(FAILED(g_D3DDevice->CreateVertexBuffer(sizeof(objData),0,D3DFVF_VERTEX,D3DPOOL_DEFAULT,&g_VertexBuffer,NULL))) return false;

        void *ptr;
        if(FAILED(g_VertexBuffer->Lock(0,sizeof(objData),(void**)&ptr,0))) return false;
        memcpy(ptr,objData,sizeof(objData));
        g_VertexBuffer->Unlock();

        return true;
}

void RenderScene()
{
        g_D3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
        //-------------------
        g_D3DDevice->BeginScene();

        g_D3DDevice->SetStreamSource(0,g_VertexBuffer,0,sizeof(stD3DVertex));
        g_D3DDevice->SetFVF(D3DFVF_VERTEX);
        g_D3DDevice->DrawPrimitive(D3DPT_LINELIST,0,2);

        g_D3DDevice->EndScene();
        //------------------------
        g_D3DDevice-&gtresent(NULL,NULL,NULL,NULL);
}

void Shutdown()
{
        if(g_D3DDevice!=NULL) g_D3DDevice->Release();
        if(g_D3D!=NULL) g_D3D->Release();
        if(g_VertexBuffer!=NULL)        g_VertexBuffer->Release();

        g_D3DDevice=NULL;
        g_D3D=NULL;
        g_VertexBuffer=NULL;
}

2

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2009-7-2 17:05:00 | 显示全部楼层

Re:初学D3D,画不了线,各们DX帮我看一下。

没有指定顶点法向量的情况下,必须关闭光源,
否则画出来的全是黑色的,而你的背景正好是黑色的,所以看不到。
g_D3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); //默认是开启的

0

主题

398

帖子

577

积分

高级会员

Rank: 4

积分
577
发表于 2009-7-3 15:55:00 | 显示全部楼层

Re:初学D3D,画不了线,各们DX帮我看一下。

看得我眼睛花了,怎么没找到哪里设置矩阵?

2

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2009-7-3 22:49:00 | 显示全部楼层

Re:初学D3D,画不了线,各们DX帮我看一下。

struct stD3DVertex
{
float x,y,z, rhw;
DWORD color;
};


stD3DVertex objData[]={{420.5f,150.5f,0.5f,10.f col,},{420.5f,350.5f,0.5f,1.0f, col,},{220.5f,150.5f,0.5f,1.0f, col,},{220.5f,350.5f,0.5f,1.0f, col,},};
试一下


2

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2009-7-4 08:40:00 | 显示全部楼层

Re:初学D3D,画不了线,各们DX帮我看一下。

楼主是不是失踪了?就我们在这儿回来回去的。呵呵,开个玩笑~

对的,楼上的意见也很重要,只是漏了调整一处:
#define D3DFVF_VERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE) //之前是D3DFVF_XYZ

4

主题

31

帖子

31

积分

注册会员

Rank: 2

积分
31
发表于 2009-7-5 14:21:00 | 显示全部楼层

Re:初学D3D,画不了线,各们DX帮我看一下。

这等问题,只有咱菜鸟才回答
哎~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-19 21:54

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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