游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2169|回复: 0

dx8中关于用索引缓冲渲染索引图元的问题

[复制链接]

3

主题

14

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2008-1-14 12:46:00 | 显示全部楼层 |阅读模式
下面是代码, 我也不想贴, 可是我实在找不出什么错误了,应该是Render()里面函数调用有问题,程序的功能是打印一个八边形。初学Direct3D,望哪位大侠给SEE SEE啊

#pragma comment(lib, "d3d8.lib")

#include <windows.h>
#include <windowsx.h>
#include <d3d8.h>
#include <math.h>

LPDIRECT3D8                                g_pD3D                = NULL;
LPDIRECT3DDEVICE8                g_pd3dDevice= NULL;
LPDIRECT3DVERTEXBUFFER8 g_pVB                = NULL;
LPDIRECT3DINDEXBUFFER8        g_pIB                = NULL;

struct CUSTOMVERTEX
{
        FLOAT x, y, z, rhw;
        DWORD color;                        // 注意这里一定要按顺序
};
#define        D3DFVF_CUSTOMVERTEX        (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

HRESULT InitD3D(HWND hWnd)
{
        if (!(g_pD3D = Direct3DCreate8(D3D_SDK_VERSION)))
                return E_FAIL;

        D3DDISPLAYMODE d3ddm;
        if (FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
                return E_FAIL;

        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory(&d3dpp, sizeof(d3dpp));
        d3dpp.Windowed                        = TRUE;
        d3dpp.SwapEffect                = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat        = d3ddm.Format;

        if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                        D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice)))
                return E_FAIL;

        return S_OK;
}

HRESULT InitVBAndIB()
{
        CUSTOMVERTEX vertices[9];
        vertices[0].x                = 300;
        vertices[0].y            = 250;
        vertices[0].z                = 0.5f;
        vertices[0].rhw                = 1.0f;
        vertices[0].color        = 0xffff0000;
        for (int i = 0; i < 8; i++)
        {
                vertices[i + 1].x = (float)((200 * sin(i * 3.14159 / 4.0)) + 300);
                vertices[i + 1].y = (float)((200 * cos(i * 3.14159 / 4.0)) + 250);
                vertices[i + 1].z = 0.5f;
                vertices[i + 1].rhw = 1.0f;
                vertices[i + 1].color = 0xff00ff00;
        }

        if (FAILED(g_pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB)))
                return E_FAIL;

        void* pVertices;
        if (FAILED(g_pVB->Lock(0, sizeof(vertices), (BYTE**)&pVertices, 0)))
                return E_FAIL;

        memcpy(pVertices, vertices, sizeof(vertices));
        g_pVB->Unlock();

        WORD indices[] = {0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5, 0, 5, 6, 0, 6, 7, 0, 7, 8, 0, 8, 1};

        if (FAILED(g_pd3dDevice->CreateIndexBuffer(sizeof(indices), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &g_pIB)))
                return E_FAIL;
       
        void* p_Indices;
        if (FAILED(g_pIB->Lock(0, sizeof(indices), (BYTE**)&p_Indices, 0)))
                return E_FAIL;
       
        memcpy(p_Indices, indices, sizeof(indices));
        g_pIB->Unlock();

        return S_OK;
}

void Cleanup()
{
        if (g_pVB)
                g_pVB->Release();

        if (g_pIB)
                g_pIB->Release();

        if (g_pd3dDevice)
                g_pd3dDevice->Release();

        if (g_pD3D)
                g_pD3D->Release();
}

void Render()
{
        g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

        if (SUCCEEDED(g_pd3dDevice->BeginScene()))
        {
                g_pd3dDevice->SetStreamSource(0, g_pVB, sizeof(CUSTOMVERTEX));
                g_pd3dDevice->SetVertexShader(D3DFVF_CUSTOMVERTEX);
                g_pd3dDevice->SetIndices(g_pIB, 0);
                g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 9, 0, 8);
                g_pd3dDevice->EndScene();
        }
        g_pd3dDevice-&gtresent(NULL, NULL, NULL, NULL);
}

LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
        switch (msg)
        {
        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        }
        return DefWindowProc(hWnd, msg, wParam, lParam);
}

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLint, int nShowCmd)
{
        HWND                hWnd;
        WNDCLASSEX        wc;
        MSG                        msg;
        static TCHAR szAppName[] = TEXT("D3D Turorial");

        wc.cbSize                        = sizeof(wc);
        wc.style                        = CS_CLASSDC;
        wc.lpfnWndProc                = WndProc;
        wc.cbClsExtra                = 0;
        wc.cbWndExtra                = 0;
        wc.hInstance                = hInstance;
        wc.hIcon                        = NULL;
        wc.hCursor                        = NULL;
        wc.hbrBackground        = NULL;
        wc.lpszMenuName                = NULL;
        wc.lpszClassName        = szAppName;
        wc.hIconSm                        = NULL;

        if (!RegisterClassEx(&wc))
        {       
                MessageBox(NULL, "Error", szAppName, MB_ICONERROR);
                return 0;
        }

        hWnd = CreateWindow(szAppName, "D3D Tutorial 02:Vertices", WS_OVERLAPPEDWINDOW,
                0, 0, 600, 600, GetDesktopWindow(), NULL, wc.hInstance, NULL);

        if (SUCCEEDED(InitD3D(hWnd)) && SUCCEEDED(InitVBAndIB()))
        {
                ShowWindow(hWnd, nShowCmd);
                UpdateWindow(hWnd);

                while (msg.message != WM_QUIT)
                {
                        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))       
                        {
                                TranslateMessage(&msg);
                                DispatchMessage(&msg);
                        }
                        else
                                Render();
                }
        }

        Cleanup();
        UnregisterClass(szAppName, wc.hInstance);
        return 0;
}

我把这里的下面的代码:
void Render()
{
        g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

        if (SUCCEEDED(g_pd3dDevice->BeginScene()))
        {
                g_pd3dDevice->SetStreamSource(0, g_pVB, sizeof(CUSTOMVERTEX));
                g_pd3dDevice->SetVertexShader(D3DFVF_CUSTOMVERTEX);
                g_pd3dDevice->SetIndices(g_pIB, 0);
                g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 9, 0, 8);
                g_pd3dDevice->EndScene();
        }
        g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
改成:
void Render()
{
        g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

        if (SUCCEEDED(g_pd3dDevice->BeginScene()))
        {
                g_pd3dDevice->SetStreamSource(0, g_pVB, sizeof(CUSTOMVERTEX));
                g_pd3dDevice->SetVertexShader(D3DFVF_CUSTOMVERTEX);
                g_pd3dDevice->SetIndices(g_pIB, 0);
                g_pd3dDevice->DrawIndexedPrimitive(D3DPT_LINESTRIP, 0, 9, 0, 23);
                g_pd3dDevice->EndScene();
        }
        g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}

结果可以正常输出。所以初始化应该没有问题,问题应该是处在函数调用上,哪位大侠知道原因帮小弟指导下啊,先谢谢了,还有哪位大侠知道有什么好点的dx8的基础书籍, 帮忙介绍下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-19 20:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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