游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4377|回复: 12

DirectX教程Out了么?……难道……是我OUT了??泪奔……

[复制链接]

1

主题

28

帖子

30

积分

注册会员

Rank: 2

积分
30
QQ
发表于 2010-5-24 07:08:00 | 显示全部楼层 |阅读模式
[em7]
诸多教程,使用的是DirectX9.0c SDK,然而现在最新的DX SDK貌似有很多地方与其不一致
比如下面的入门级的代码,渲染出一个三角形,
              1. 原版:  SetStreamSource(0, g_pVB, sizeof(CUSTOMVERTEX)
                 现在:  SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX)

              2。 原版: SetVertexShader(D3DFVF_CUSTOMVERTEX)
                  现在: SetVertexShader(NULL) (貌似分了两步)
                         SetFVF(D3DFVF_CUSTOMVERTEX)

              3。 现在: CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),0, D3DFVF_CUSTOMVERTEX,                                                  D3DPOOL_DEFAULT,         &g_pVB, NULL)))
                         最后的参数是新增的

搞不懂啊,大多数教程都这样,
原来照着一行行敲,编译就出错,狂baidu,狂google,搞成现在 这样子,窗口里还是毛都没得 ……
郁闷了,入个门容易么 ……

难道教材还没更新?还是我没找到最新的版本?为什么很少有人提及?都用的原来的老的SDK??
唉 ……

#include <d3d9.h>
#pragma comment(lib, "d3d9.lib")
HWND g_hWnd = NULL;
LPDIRECT3D9        g_pd3d = NULL;        // create d3d device
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;                // d3d device
//------------------------------------------------------------------------------
// chapter 2:
LPDIRECT3DVERTEXBUFFER9        g_pVB = NULL;        // vertex buffer
struct CUSTOMVERTEX
{
        FLOAT x, y, z;                // vertex coordinates
        DWORD color;                // vertex color
};
CUSTOMVERTEX g_Vertices[] = {        { -1.0f, -1.0f, 0.0f, 0xffff0000 },        // color:red
                        {  1.0f, -1.0f, 0.0f, 0xff0000ff },        // blue
                        {  0.0f,  1.0f, 0.0f, 0xffffffff }};        // white
// FVF(flexible vertex format) : self defined here
#define D3DFVF_CUSTOMVERTEX        (D3DFVF_XYZ | D3DFVF_DIFFUSE)
// end chapter 2.
//------------------------------------------------------------------------------
// initialize d3d
HRESULT InitD3D(HWND hWnd);
// release d3d
VOID Cleanup();
// render
VOID Render();
// window msg proc
LRESULT WINAPI MsgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
/////////////////////////////////////////////////////////////////////////////////////////////////////
// WINMAIN
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
        WNDCLASSEX wcex = {        sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                        GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                        "D3D Tutorial", NULL        };
        RegisterClassEx(&wcex);

        HWND hWnd = CreateWindowEx(NULL, "D3D Tutorial", "D3D Tutorial 01: CreateDevice",
                        WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
                        GetDesktopWindow(), NULL, wcex.hInstance, NULL);
        // initialize d3d
        if (SUCCEEDED(InitD3D(hWnd)))
        {
                ShowWindow(hWnd, SW_SHOWDEFAULT);
                UpdateWindow(hWnd);
                g_hWnd = hWnd;
                // message loop
                MSG msg;

                ::ZeroMemory(&msg, sizeof(msg));
                while (msg.message != WM_QUIT)
                {
                        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
                        {
                                TranslateMessage(&msg);
                                DispatchMessage(&msg);
                        }
                        else
                        {
                                Render();
                        }
                }
        }
        // over processing
        Cleanup();
        UnregisterClass("D3D Tutorial", wcex.hInstance);
        return        0;
}

LRESULT WINAPI MsgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        switch (message)
        {
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
        default:
                return        DefWindowProc(hWnd, message, wParam, lParam);
                break;
        }
        return        0;
}

VOID Render()
{
        if (NULL == g_pd3dDevice)
        {
                return;
        }
        // clear background color to blue
        g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET,
                        D3DCOLOR_XRGB(0, 0, 255), 1.0F, 0);
        // begin to draw scene
        g_pd3dDevice->BeginScene();

        // TODO: put what you want to do here
//--------------------------------------------------------------------------------------
// chapter 2:
        // specify the render source
        // g_pd3dDevice->SetStreamSource(0, g_pVB, sizeof(CUSTOMVERTEX));
        if (g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX)) != D3D_OK)
        {
                MessageBox(g_hWnd, "setstreamsource failed", "notice", MB_OK);
        }
        // specify the self definition FVF
        // error C2664: “IDirect3DDevice9::SetVertexShader”: 不能将参数 1 从“int”转换为“IDirect3DVertexShader9 *”
        // g_pd3dDevice->SetVertexShader(D3DFVF_CUSTOMVERTEX);
//        g_pd3dDevice->SetVertexShader(NULL);
        if (g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX) != D3D_OK)
        {
                MessageBox(g_hWnd, "setfvf failed", "notice", MB_OK);
        }
        // render
        if (g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 1) != D3D_OK)
        {
                MessageBox(g_hWnd, "draw failed", "notice", MB_OK);
        }
// end
//--------------------------------------------------------------------------------------

        // end draw scene
        g_pd3dDevice->EndScene();
        // show to screen
        g_pd3dDevice-&gtresent(NULL, NULL, NULL, NULL);
}

VOID Cleanup()
{
        if (g_pd3dDevice != NULL)
        {
                g_pd3dDevice->Release();
        }
        if (g_pd3d != NULL)
        {
                g_pd3d->Release();
        }
}

HRESULT InitD3D(HWND hWnd)
{
        // create d3d object
        if (NULL == (g_pd3d = Direct3DCreate9(D3D_SDK_VERSION)))
        {
                return        E_FAIL;
        }

        // get current show mode
        D3DDISPLAYMODE d3ddm;
       
        if (FAILED(g_pd3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
        {
                return        E_FAIL;
        }

        D3DPRESENT_PARAMETERS d3dpp;

        ZeroMemory(&d3dpp, sizeof(d3dpp));        // #define ZeroMemory RtlZeroMemory
        d3dpp.Windowed = TRUE;                // window mode
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;        // set up swap mode
        d3dpp.BackBufferFormat = d3ddm.Format;        // set up back buffer format as current left format
        // create d3d device
        if (FAILED(g_pd3d->CreateDevice(D3DADAPTER_DEFAULT,        // use default display card
                                           D3DDEVTYPE_HAL,    // request use HAL(硬件抽象层)
                                hWnd, // window handle
                        D3DCREATE_SOFTWARE_VERTEXPROCESSING,// use software processing vertex
                                &d3dpp, // parameter for created
                        &g_pd3dDevice)))        // d3d device pointer
        {
                return        E_FAIL;
        }

//--------------------------------------------------------------------------------
// chapter 2:
        // create vertex buffer area
// buffer area size (here we have 3 vertexs
        if (FAILED(g_pd3dDevice->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
                                         0,// //
                                         D3DFVF_CUSTOMVERTEX,// self definition FVF
                         D3DPOOL_DEFAULT,        // it shows how to create, use DEFAULT just OK
                                 &g_pVB, // return the pointer who pointed to the buffer
                                NULL)))
        {
                return E_FAIL;
        }
        // VOID *pVertices;
        CUSTOMVERTEX *pVertex;
        // error C2664: “IDirect3DVertexBuffer9:ock”: 不能将参数 3 从“BYTE **”转换为“void **”
        // g_pVB->Lock(0, sizeof(pVertices), (BYTE **)&pVertices, 0);
        // g_pVB->Lock(0, sizeof(pVertices), (VOID **)&pVertices, 0);
        // g_pVB->Lock(0, sizeof(pVertex), (VOID **)&pVertex, 0);
        if (FAILED(g_pVB->Lock(0, sizeof(g_Vertices), (VOID**)&pVertex, 0)))
        {
                return E_FAIL;
        }
        memcpy(pVertex, g_Vertices, sizeof(g_Vertices));
        g_pVB->Unlock();
// end
//--------------------------------------------------------------------------------

        return        S_OK;
}

34

主题

657

帖子

672

积分

高级会员

Rank: 4

积分
672
发表于 2010-5-24 11:42:00 | 显示全部楼层

Re:DirectX教程Out了么?……难道……是我OUT了??泪奔……

书上的代码用的SDK太老了吧。

1

主题

18

帖子

20

积分

注册会员

Rank: 2

积分
20
QQ
发表于 2010-5-24 17:49:00 | 显示全部楼层

Re: DirectX教程Out了么?……难道……是我OUT了??泪奔……

一看 就知道 书上用的是 8.0 的SDK   LZ换本书吧。。。

1

主题

28

帖子

30

积分

注册会员

Rank: 2

积分
30
QQ
 楼主| 发表于 2010-5-24 17:58:00 | 显示全部楼层

Re:DirectX教程Out了么?……难道……是我OUT了??泪奔……

尚晶晶写的一本DirectX9游戏技术 开发详解
的确是DirectX9.0a SDK,难道 挂羊头,卖狗肉 ??? ……
唉,,,好吧,谢谢各位了,真得换本书了  …… 杯具。。。

0

主题

398

帖子

577

积分

高级会员

Rank: 4

积分
577
发表于 2010-5-24 19:23:00 | 显示全部楼层

Re:DirectX教程Out了么?……难道……是我OUT了??泪奔……

9.0a到9.0c时有部分接口发生了变化,看下文档就知道了.只要了解他的含义改起来很容易...

0

主题

43

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2010-5-24 21:24:00 | 显示全部楼层

Re:DirectX教程Out了么?……难道……是我OUT了??泪奔……

楼主可以看看龙书,入门很合适。

1

主题

28

帖子

30

积分

注册会员

Rank: 2

积分
30
QQ
 楼主| 发表于 2010-5-25 10:14:00 | 显示全部楼层

Re: Re:DirectX教程Out了么?……难道……是我OUT了??泪奔

大家来找茬: ReirectX教程Out了么?……难道……是我OUT了??泪奔……

楼主可以看看龙书,入门很合适。


啥米 龙书???求解!!万分感谢!

11

主题

1238

帖子

1782

积分

金牌会员

Rank: 6Rank: 6

积分
1782
发表于 2010-5-25 10:46:00 | 显示全部楼层

Re: Re:DirectX教程Out了么?……难道……是我OUT了??泪奔

的确是DirectX9.0a SDK,难道 挂羊头,卖狗肉 ??? ……
唉,,,好吧,谢谢各位了,真得换本书了  …… 杯具。。。


哈哈哈~~太搞了吧~~龙书就是 http://www.netyi.net/Book/b80bc715-f332-4e8e-a4e4-4606850e793f.htm

1

主题

28

帖子

30

积分

注册会员

Rank: 2

积分
30
QQ
 楼主| 发表于 2010-5-25 14:25:00 | 显示全部楼层

Re: Re: Re:DirectX教程Out了么?……难道……是我OUT了??泪

游戏阿家: Re: ReirectX教程Out了么?……难道……是我OUT了??泪奔……



哈哈哈~~太搞了吧~~龙书就是 http://www.netyi.net/Book/b80bc715-f332-4e8e-a4e4-4606850e793f.htm

这龙书??持怀疑态度…… [em22]

1

主题

28

帖子

30

积分

注册会员

Rank: 2

积分
30
QQ
 楼主| 发表于 2010-5-25 14:29:00 | 显示全部楼层

Re: Re: Re:DirectX教程Out了么?……难道……是我OUT了??泪

游戏阿家: Re: ReirectX教程Out了么?……难道……是我OUT了??泪奔……



哈哈哈~~太搞了吧~~龙书就是 http://www.netyi.net/Book/b80bc715-f332-4e8e-a4e4-4606850e793f.htm

唉唉唉,自己有这电子书版的,一直没看! 汗颜……
不过,还是 看 纸质的 爽点 …… [em10]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-9 14:11

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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