游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2335|回复: 2

天阿,画个三角,画了两天了!救命阿大哥!

[复制链接]

9

主题

13

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2005-5-19 23:47:00 | 显示全部楼层 |阅读模式
不是停止响应.就是什么也画不出来.....
有时候还把显存搞崩了......内存泄漏一大堆......

   郁闷中的郁闷!!!!!!!!!

代码如下


// 3DV.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "3DV.h"
#include <d3d9.h>
#include <d3dx9.h>
#include <d3dx9math.h>
#define MAX_LOADSTRING 100




LPDIRECT3D9 m_3d;
LPDIRECT3DDEVICE9 m_div;
LPDIRECT3DVERTEXBUFFER9 m_buff;
HWND hWnd;

bool HAL = false;


#define FVF (D3DFVF_XYZ)
struct  MFVF
{
        float x,y,z;
};


void Clease()
{
        if( m_buff != NULL)
        {
                m_buff->Release();
                m_buff = NULL;
        }
        if(m_div != NULL)
        {
                m_div->Release();
                m_div = NULL;
        }
        if(m_3d != NULL)
        {
                m_3d->Release();
                m_3d = NULL;
        }
}

bool GameInit()
{
        // 创建3D设备
        m_3d = Direct3DCreate9(D3D_SDK_VERSION);
          if(m_3d == NULL)
                  return false;

    D3DCAPS9 caps;
   
       
        if(FAILED(m_3d->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps)))
                return false;

        // 测试硬件支持
/*        if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
        {
           HAL = true;
        }
        else
        {
                HAL = false;
        }
*/
// 填充 D3DPRESENT_PARAMETERS 结构

        D3DPRESENT_PARAMETERS d3d;

        memset(&d3d,0,sizeof(d3d));
   
        // 窗体模式
        d3d.Windowed = true;
        // 有效的交换方式
        d3d.SwapEffect = D3DSWAPEFFECT_DISCARD;
        // 后备缓冲的像素格式.
        d3d.BackBufferFormat = D3DFMT_A8R8G8B8;
        //窗体句柄
        d3d.hDeviceWindow = hWnd;

        if(FAILED(m_3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3d,&m_div)))
                return false;

        return true;
}

bool GameMain()
{
        MFVF mfvf[] = {        {-1.0f , -1.0f, 0.0f},
                                        {1.0f, -1.0f, 0.0f},
                                        {1.0f,1.0f,0.0f} };

        if(FAILED(m_div->CreateVertexBuffer(sizeof(mfvf),0,D3DUSAGE_DYNAMIC,D3DPOOL_DEFAULT,&m_buff,NULL)))
                return false;
        void *buff;
       
        m_buff->Lock(0,sizeof(MFVF),(void **)&buff,0);

        memcpy(buff,mfvf,sizeof(mfvf));

        m_buff->Unlock();


        // 设定 世界坐标
        D3DXMATRIX WORD;
        D3DXMatrixTranslation(&WORD,-3.0f,2.0f,6.0f);

                m_div->SetTransform(D3DTS_WORLD,&WORD);


       
        //设定观察坐标
        //D3DXVECTOR3 eye(5.0f, 3.0f,?10.0f);
        D3DXVECTOR3 eye (5.0f,3.0f,-10.0f);                //参数指定摄相机在世界坐标系中的位置
        D3DXVECTOR3 look(0.0f, 0.0f, 0.0f);            //参数指定摄相机所观察的世界坐标系中的一个目标点
        D3DXVECTOR3 worldUp(0.0f, 1.0f, 0.0f);  //参数指定3D世界中的上方向,通常设Y轴正方向为上方向

        D3DXMATRIX V;
        //D3DXMatrixLookAtLH
        D3DXMatrixLookAtLH(&V,&eye,&look,&worldUp);
       
        m_div->SetTransform(D3DTS_VIEW,&V);

        //设定投影坐标
        D3DXMATRIX MAT;
        //D3DXMatrixPerspectiveFovLH
        D3DXMatrixPerspectiveFovLH(&MAT,D3DX_PI/4, 1.0f, 1.0f, 100.0f );

        m_div->SetTransform(D3DTS_PROJECTION,&MAT);
   
        return true;
}

void Draw()
{

        m_div->SetFVF(FVF);
        m_div->SetStreamSource(0,m_buff,0,sizeof(MFVF));

        m_div->BeginScene();
       
        m_div->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);

        m_div->EndScene();
}


// 全局变量:
HINSTANCE hInst;                                                                // 当前实例
TCHAR szTitle[MAX_LOADSTRING];                                        // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];                        // 主窗口类名

// 此代码模块中包含的函数的前向声明:
ATOM                                MyRegisterClass(HINSTANCE hInstance);
BOOL                                InitInstance(HINSTANCE, int);
LRESULT CALLBACK        WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK        About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
        // TODO: 在此放置代码。
        MSG msg;
        HACCEL hAccelTable;

        // 初始化全局字符串
        LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
        LoadString(hInstance, IDC_DV, szWindowClass, MAX_LOADSTRING);
        MyRegisterClass(hInstance);

        // 执行应用程序初始化:
        if (!InitInstance (hInstance, nCmdShow))
        {
                return FALSE;
        }

        GameInit();
        GameMain();

        hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_DV);

        // 主消息循环:
        while (GetMessage(&msg, NULL, 0, 0))
        {
                if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
                Draw();
               
        }

        return (int) msg.wParam;
}



//
//  函数: MyRegisterClass()
//
//  目的: 注册窗口类。
//
//  注释:
//
//    仅当希望在已添加到 Windows 95 的
//    “RegisterClassEx”函数之前此代码与 Win32 系统兼容时,
//    才需要此函数及其用法。调用此函数
//    十分重要,这样应用程序就可以获得关联的
//   “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
        WNDCLASSEX wcex;

        wcex.cbSize = sizeof(WNDCLASSEX);

        wcex.style                        = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc        = (WNDPROC)WndProc;
        wcex.cbClsExtra                = 0;
        wcex.cbWndExtra                = 0;
        wcex.hInstance                = hInstance;
        wcex.hIcon                        = LoadIcon(hInstance, (LPCTSTR)IDI_DV);
        wcex.hCursor                = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground        = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName        = NULL;//(LPCTSTR)IDC_DV;
        wcex.lpszClassName        = szWindowClass;
        wcex.hIconSm                = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

        return RegisterClassEx(&wcex);
}

//
//   函数: InitInstance(HANDLE, int)
//
//   目的: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   

   hInst = hInstance; // 将实例句柄存储在全局变量中

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
  // UpdateWindow(hWnd);

   return TRUE;
}

//
//  函数: WndProc(HWND, unsigned, WORD, LONG)
//
//  目的: 处理主窗口的消息。
//
//  WM_COMMAND        - 处理应用程序菜单
//  WM_PAINT        - 绘制主窗口
//  WM_DESTROY        - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        int wmId, wmEvent;
        PAINTSTRUCT ps;
        HDC hdc;

        switch (message)
        {
        case WM_COMMAND:
                wmId    = LOWORD(wParam);
                wmEvent = HIWORD(wParam);
                // 分析菜单选择:
                switch (wmId)
                {
                case IDM_ABOUT:
                        DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
                        break;
                case IDM_EXIT:
                        DestroyWindow(hWnd);
                        break;
                default:
                        return DefWindowProc(hWnd, message, wParam, lParam);
                }
                break;
        case WM_PAINT:
                //hdc = BeginPaint(hWnd, &ps);
                // TODO: 在此添加任意绘图代码...
                //EndPaint(hWnd, &ps);
                //GameMain();
                break;
        case WM_DESTROY:
                Clease();
                PostQuitMessage(0);
                break;
        default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
}

// “关于”框的消息处理程序。
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
        switch (message)
        {
        case WM_INITDIALOG:
                return TRUE;

        case WM_COMMAND:
                if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
                {
                        EndDialog(hDlg, LOWORD(wParam));
                        return TRUE;
                }
                break;
        }
        return FALSE;
}


还有个郁闷的. 在结束程序后.程序中断在 SetFVF 这个函数这里. 莫非好要释放????

   平台 WinXP Home   ,  DirectX9 , VC.net

7

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2005-5-20 08:26:00 | 显示全部楼层

Re:天阿,画个三角,画了两天了!救命阿大哥!

确实问题不少呀~你可以看看DirectX9的开发参考里面有一个画三角形的例子。你有些概念问题和win32基础问题。

看看这个例子:
#include <d3d8.h>

//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
LPDIRECT3D8             g_pD3D       = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE8       g_pd3dDevice = NULL; // Our rendering device
LPDIRECT3DVERTEXBUFFER8 g_pVB        = NULL; // Buffer to hold vertices
LPDIRECT3DINDEXBUFFER8  g_pIB                 = NULL;

// A structure for our custom vertex type
struct CUSTOMVERTEX
{
    FLOAT x, y, z, rhw; // The transformed position for the vertex
    DWORD color;        // The vertex color
};

// Our custom FVF, which describes our custom vertex structure
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

// 初始化D3D
HRESULT InitD3D( HWND hWnd )
{
    // Create the D3D object.
    if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    // Get the current desktop display mode, so we can set up a back
    // buffer of the same format
    D3DDISPLAYMODE d3ddm;
    if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
        return E_FAIL;

    // Set up the structure used to create the D3DDevice
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = d3ddm.Format;

    // Create the D3DDevice
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }

    // Device state would normally be set here

    return S_OK;
}

HRESULT InitVB(  )
{
    // Initialize three vertices for rendering a triangle

        /*
    CUSTOMVERTEX g_Vertices[] =
    {
        { 150.0f,  50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color
                //{        1.0f, 100.0f, 0.5f, 1.0f, 0xff0000ff, },
        { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },
                //{  50.0f, 150.0f, 0.5f, 1.0f, 0xff00ffff, },
        {  50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },
    };
        */
               
        CUSTOMVERTEX g_Vertices[] =
        {
                {  150.0f,    1.0f,  1.0f, 1.0f, 0xffff0000, }, // A红色
                {  250.0f,   50.0f,  1.0f, 1.0f, 0xff0000ff, }, // B兰色
                {  200.0f,  200.0f,  1.0f, 1.0f, 0xff00ff00, }, // C绿色
                {  100.0f,  250.0f,  1.0f, 1.0f, 0xffff00ff, }, // D洋红
                {   50.0f,  200.0f,  1.0f, 1.0f, 0xffffffff, }, // E白色
        };
       

    // Create the vertex buffer. Here we are allocating enough memory
    // (from the default pool) to hold all our 3 custom vertices. We also
    // specify the FVF, so the vertex buffer knows what data it contains.
    if( FAILED( g_pd3dDevice->CreateVertexBuffer( sizeof(g_Vertices),
                                                  0, D3DFVF_CUSTOMVERTEX,
                                                  D3DPOOL_DEFAULT, &g_pVB ) ) )
    {
        return E_FAIL;
    }

    // Now we fill the vertex buffer. To do this, we need to Lock() the VB to
    // gain access to the vertices. This mechanism is required becuase vertex
    // buffers may be in device memory.
    VOID* pVertices;
    if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (BYTE**)&pVertices, 0 ) ) )
        return E_FAIL;
    memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
    g_pVB->Unlock();



        //创建索引缓冲区
        if( FAILED( g_pd3dDevice->CreateIndexBuffer( 6*sizeof(WORD),
                0,
                D3DFMT_INDEX16,
                D3DPOOL_DEFAULT,
                &g_pIB ) ) )
        {
                return E_FAIL;
        }

        //设置索引表
        WORD* pi;
        if( FAILED( g_pIB->Lock(0,12,(BYTE**)&pi,0 ) ) )
                return E_FAIL;
        pi[0] = 0;
        pi[1] = 1;
        pi[2] = 2;
        pi[3] = 0;
        pi[4] = 3;
        pi[5] = 4;
        g_pIB->Unlock();
       

    return S_OK;
}

// 释放D3D
VOID Cleanup()
{
        if( g_pIB != NULL )
                g_pIB->Release();

        if( g_pVB != NULL )
                g_pVB->Release();

    if( g_pd3dDevice != NULL)
        g_pd3dDevice->Release();

    if( g_pD3D != NULL)
        g_pD3D->Release();
}

// 渲染
VOID Render()
{
    // Clear the backbuffer to a blue color
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

    // Begin the scene
    g_pd3dDevice->BeginScene();

    // Draw the triangles in the vertex buffer. This is broken into a few
    // steps. We are passing the vertices down a "stream", so first we need
    // to specify the source of that stream, which is our vertex buffer. Then
    // we need to let D3D know what vertex shader to use. Full, custom vertex
    // shaders are an advanced topic, but in most cases the vertex shader is
    // just the FVF, so that D3D knows what type of vertices we are dealing
    // with. Finally, we call DrawPrimitive() which does the actual rendering
    // of our geometry (in this case, just one triangle).
    g_pd3dDevice->SetStreamSource( 0, g_pVB, sizeof(CUSTOMVERTEX) );
        g_pd3dDevice->SetIndices( g_pIB,0 );
    g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX );
        g_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST,0,5,0,2 );
    //g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 1, 1 );
        //g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 3 );

    // End the scene
    g_pd3dDevice->EndScene();

    // Present the backbuffer contents to the display
    g_pd3dDevice-&gtresent( NULL, NULL, NULL, NULL );
}


// 消息处理
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:        // 退出消息
            PostQuitMessage( 0 );
            return 0;

        case WM_PAINT:                // 绘制
            Render();
            ValidateRect( hWnd, NULL );
            return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}

// WinMain程序入口
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
     // Register the window class
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      "D3D Tutorial", NULL };
    RegisterClassEx( &wc );

    // Create the application's window
    HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 02: Vertices",
                              WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
                              GetDesktopWindow(), NULL, wc.hInstance, NULL );

    // Initialize Direct3D
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
        // Create the vertex buffer
        if( SUCCEEDED( InitVB() ) )
        {
            // Show the window
            ShowWindow( hWnd, SW_SHOWDEFAULT );
            UpdateWindow( hWnd );

            // Enter the message loop
            MSG msg;
            ZeroMemory( &msg, sizeof(msg) );
            while( msg.message!=WM_QUIT )
            {
                if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
                {
                    TranslateMessage( &msg );
                    DispatchMessage( &msg );
                }
                else
                    ;
            }
        }
    }

    // Clean up everything and exit the app
    Cleanup();
    UnregisterClass( "D3D Tutorial", wc.hInstance );
    return 0;
}


132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2005-5-20 12:34:00 | 显示全部楼层

Re:天阿,画个三角,画了两天了!救命阿大哥!

缺了m_div-&gtresent( NULL, NULL, NULL, NULL );
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-25 16:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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