游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3205|回复: 10

按照书本打的D3D程序~居然显示不出图形来?

[复制链接]

3

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2010-4-22 15:08:00 | 显示全部楼层 |阅读模式
// D3D rectangle.cpp : 定义应用程序的入口点。
//目的:演示三维坐标变换

#include "stdafx.h"
#include "D3D rectangle.h"
#include <d3d9.h>
#include <Windows.h>
#include <mmsystem.h>
#include <d3dx9math.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)

LPDIRECT3D9 g_pD3D = NULL;

LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;

LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;//顶点缓冲区指针

HWND g_Wnd = NULL;

struct CUSTOMVERTEX
{
D3DXVECTOR3 position;
DWORD color;
};
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;
}

g_pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);//多了这里
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING,true);
return S_OK;
}

HRESULT InitGeometry()
{
if(FAILED(g_pd3dDevice->CreateVertexBuffer(50*2*sizeof(CUSTOMVERTEX),
0,D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT,&g_pVB,NULL)))
{
return E_FAIL;
}
CUSTOMVERTEX* pVertices;
if(FAILED(g_pVB->Lock(0,0,(void**)&pVertices,0)))
return E_FAIL;
for(DWORD i = 0;i < 50;i ++)
{
FLOAT theta = (2*D3DX_PI*i)/(50-1);
pVertices[2 * i + 0].position = D3DXVECTOR3(sinf(theta),-1.0f,cosf(theta));
pVertices[2 * i + 0].color = 0xff0000ff;
pVertices[2 * i + 1].position = D3DXVECTOR3(sinf(theta), 1.0f,cosf(theta));
pVertices[2 * i + 1].color = 0xff0000ff;
}
g_pVB->Unlock();
return S_OK;
}
VOID Cleanup()
{
if(g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if(g_pD3D != NULL)
g_pD3D->Release();
if(g_pVB != NULL)
g_pVB->Release();
}
VOID SetupMatrices()
{
D3DXMATRIXA16 matWorld;
UINT iTime = timeGetTime() % 1000;
FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
D3DXMatrixRotationX(&matWorld,fAngle);
g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);

//建立一个观察矩阵
D3DXVECTOR3 vEyePt(0.0f , 3.0f , -5.0f);
D3DXVECTOR3 vLookatPt(0.0f , 0.0f , 0.0f);
D3DXVECTOR3 vUpVec(0.0f , 1.0f , 0.0f);
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH(&matView,&vEyePt,&vLookatPt,&vUpVec);
g_pd3dDevice->SetTransform(D3DTS_VIEW,&matView);

//建立一个透视投影矩阵
D3DXMATRIXA16 matProj;
//D3DXMatrixLookAtLH(&matProj,&vEyePt,&vLookatPt,&vUpVec);
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI / 4,1.0f,1.0f,100.0f);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);

//设置视区
RECT rect;
GetClientRect(g_Wnd,&rect);
D3DVIEWPORT9 vp;
vp.X = 0;
vp.Y = 0;
vp.Width = rect.right;
vp.Height = rect.bottom;
vp.MinZ = 0.0f;
vp.MaxZ = 1.0f;
g_pd3dDevice->SetViewport(&vp);
}
VOID Render()
{
/*if(NULL == g_pd3dDevice)
return;*/
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
g_pd3dDevice->BeginScene();
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{
SetupMatrices();
g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2 * 50 - 2);
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;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}

//应用程序入口

INT WINAPI _tWinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT)
{
//注册窗口类
//WNDCLASS wndclass = {0,MsgProc,0L,0L,hInst,
//NULL,NULL,NULL,NULL,L"D3D zengraoli"};
WNDCLASS wndclass = {CS_CLASSDC,MsgProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,L"D3D zengraoli"};

RegisterClass(&wndclass);

HWND hWnd = CreateWindow(L"D3D zengraoli",L"D3D zengraoli:CreateDevice",
WS_OVERLAPPEDWINDOW,100,100,300,300,GetDesktopWindow(),NULL,wndclass.hInstance,NULL);
g_Wnd = hWnd;
if(SUCCEEDED(InitD3D(hWnd)))
{
if(SUCCEEDED(InitGeometry()))
{
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"D3D Tutorial",wndclass.hInstance);
return 0;
}



谁能解决一下吗?我对着DirectX 3D 陈卡编的书打的?难道是书错了?

3

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2010-4-22 15:08:00 | 显示全部楼层

Re:按照书本打的D3D程序~居然显示不出图形来?

具体是什么都没显示,就一块空区域,没错误。。

11

主题

1238

帖子

1782

积分

金牌会员

Rank: 6Rank: 6

积分
1782
发表于 2010-4-22 15:15:00 | 显示全部楼层

Re:按照书本打的D3D程序~居然显示不出图形来?

关掉光照

3

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2010-4-22 15:37:00 | 显示全部楼层

Re:按照书本打的D3D程序~居然显示不出图形来?

已经关了还是不行。。

3

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2010-4-22 16:00:00 | 显示全部楼层

Re:按照书本打的D3D程序~居然显示不出图形来?

晕。。能帮忙解决一下吗?
为什么显示不出来呢。。。

3

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2010-4-22 19:09:00 | 显示全部楼层

Re:按照书本打的D3D程序~居然显示不出图形来?

我再顶一下 别让沉了

1

主题

266

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
发表于 2010-4-23 01:16:00 | 显示全部楼层

Re:按照书本打的D3D程序~居然显示不出图形来?

你在VOID Render()函数中连续两次调用g_pd3dDevice->BeginScene(),导致第二次调用失败,程序流程直接转至g_pd3dDevice-&gtresent(NULL,NULL,NULL,NULL)。
也就是说:什么也没做!  自然就是显示空白区啦

86

主题

2251

帖子

2384

积分

金牌会员

Rank: 6Rank: 6

积分
2384
QQ
发表于 2010-4-23 01:47:00 | 显示全部楼层

Re:按照书本打的D3D程序~居然显示不出图形来?

我把光照光了怎么就行了?
一切正常却看不到东西,一个原因是光照开着;还有一个原因是灯光材质设得有问题,比如设之前没清零。


// D3D rectangle.cpp : 定义应用程序的入口点。
//目的:演示三维坐标变换

#include <d3d9.h>
#include <Windows.h>
#include <mmsystem.h>
#include <d3dx9math.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)

LPDIRECT3D9 g_pD3D = NULL;

LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;

LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;//顶点缓冲区指针

HWND g_Wnd = NULL;

struct CUSTOMVERTEX
{
    D3DXVECTOR3 position;
    DWORD color;
};
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;
    }

    g_pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);// 多了这里
    g_pd3dDevice->SetRenderState(D3DRS_LIGHTING,false);
    return S_OK;
}

HRESULT InitGeometry()
{
    if(FAILED(g_pd3dDevice->CreateVertexBuffer(50*2*sizeof(CUSTOMVERTEX),
        0,D3DFVF_CUSTOMVERTEX,
        D3DPOOL_DEFAULT,&g_pVB,NULL)))
    {
        return E_FAIL;
    }
    CUSTOMVERTEX* pVertices;
    if(FAILED(g_pVB->Lock(0,0,(void**)&pVertices,0)))
        return E_FAIL;
    for(DWORD i = 0;i < 50;i ++)
    {
        FLOAT theta = (2*D3DX_PI*i)/(50-1);
        pVertices[2 * i + 0].position = D3DXVECTOR3(sinf(theta),-1.0f,cosf(theta));
        pVertices[2 * i + 0].color = 0xff0000ff;
        pVertices[2 * i + 1].position = D3DXVECTOR3(sinf(theta), 1.0f,cosf(theta));
        pVertices[2 * i + 1].color = 0xff0000ff;
    }
    g_pVB->Unlock();
    return S_OK;
}
VOID Cleanup()
{
    if(g_pd3dDevice != NULL)
        g_pd3dDevice->Release();
    if(g_pD3D != NULL)
        g_pD3D->Release();
    if(g_pVB != NULL)
        g_pVB->Release();
}
VOID SetupMatrices()
{
    D3DXMATRIXA16 matWorld;
    UINT iTime = timeGetTime() % 1000;
    FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
    D3DXMatrixRotationX(&matWorld,fAngle);
    g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);

    // 建立一个观察矩阵
    D3DXVECTOR3 vEyePt(0.0f , 3.0f , -5.0f);
    D3DXVECTOR3 vLookatPt(0.0f , 0.0f , 0.0f);
    D3DXVECTOR3 vUpVec(0.0f , 1.0f , 0.0f);
    D3DXMATRIXA16 matView;
    D3DXMatrixLookAtLH(&matView,&vEyePt,&vLookatPt,&vUpVec);
    g_pd3dDevice->SetTransform(D3DTS_VIEW,&matView);

    // 建立一个透视投影矩阵
    D3DXMATRIXA16 matProj;
    //D3DXMatrixLookAtLH(&matProj,&vEyePt,&vLookatPt,&vUpVec);
    D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI / 4,1.0f,1.0f,100.0f);
    g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);

    // 设置视区
    RECT rect;
    GetClientRect(g_Wnd,&rect);
    D3DVIEWPORT9 vp;
    vp.X = 0;
    vp.Y = 0;
    vp.Width = rect.right;
    vp.Height = rect.bottom;
    vp.MinZ = 0.0f;
    vp.MaxZ = 1.0f;
    g_pd3dDevice->SetViewport(&vp);
}
VOID Render()
{
    /*if(NULL == g_pd3dDevice)
    return;*/
    g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
    //g_pd3dDevice->BeginScene();
    if(SUCCEEDED(g_pd3dDevice->BeginScene()))
    {
        SetupMatrices();
        g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));
        g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
        g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2 * 50 - 2);
        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;
    }
    return DefWindowProc(hWnd,msg,wParam,lParam);
}

//应用程序入口

INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT)
{
    // 注册窗口类
    //WNDCLASS wndclass = {0,MsgProc,0L,0L,hInst,
    //NULL,NULL,NULL,NULL,L"D3D zengraoli"};
    WNDCLASS wndclass = {CS_CLASSDC,MsgProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,L"D3D zengraoli"};

    RegisterClass(&wndclass);

    HWND hWnd = CreateWindow(L"D3D zengraoli",L"D3D zengraoli:CreateDevice",
        WS_OVERLAPPEDWINDOW,100,100,300,300,GetDesktopWindow(),NULL,wndclass.hInstance,NULL);
    g_Wnd = hWnd;
    if(SUCCEEDED(InitD3D(hWnd)))
    {
        if(SUCCEEDED(InitGeometry()))
        {
            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"D3D Tutorial",wndclass.hInstance);
    return 0;
}

2

主题

36

帖子

38

积分

注册会员

Rank: 2

积分
38
发表于 2010-4-23 12:34:00 | 显示全部楼层

Re:按照书本打的D3D程序~居然显示不出图形来?

好像是这样的:
D3D如果你不打开光源的话,它会有一个默认的光源,能让你看到你渲染的模型。
如果你打开了光源,这个默认的光源就不存在了,这时候你就必须启用一个光源来照亮模型。我查了下,你没有LightEnable()这个方法。

11

主题

1238

帖子

1782

积分

金牌会员

Rank: 6Rank: 6

积分
1782
发表于 2010-4-23 13:52:00 | 显示全部楼层

Re:按照书本打的D3D程序~居然显示不出图形来?

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)

楼猪的顶点法线都没有,不知开光照作堪?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-10 00:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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