• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            學習頂點緩存與索引緩存(二)

            Posted on 2008-08-04 20:36 orlando 閱讀(357) 評論(0)  編輯 收藏 引用

            //=============================================================================
            // Desc: 坐標變換
            //=============================================================================

            #include <d3dx9.h>  //D3DX實用庫函數, 該頭文件中又包含了d3d9.h頭文件


            //-----------------------------------------------------------------------------
            // Desc: 全局變量
            //-----------------------------------------------------------------------------
            LPDIRECT3D9                g_pD3D       = NULL;    //Direct3D對象
            LPDIRECT3DDEVICE9          g_pd3dDevice = NULL;    //Direct3D設備對象
            LPDIRECT3DVERTEXBUFFER9    g_pVB        = NULL;    //頂點緩沖區對象
            HWND        g_Wnd     = NULL;    //窗口句柄
            D3DRECT                    g_ClentRect;
            LPDIRECT3DINDEXBUFFER9  g_pIB  = NULL;

            //-----------------------------------------------------------------------------
            // Desc: 頂點結構
            //-----------------------------------------------------------------------------
            struct CUSTOMVERTEX
            {
                D3DXVECTOR3 position;
                DWORD color;
            };
            #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)


            //-----------------------------------------------------------------------------
            // Desc: 設置世界矩陣
            //-----------------------------------------------------------------------------
            VOID SetupWorldMatrice()
            {
             //建立一個繞X軸動態旋轉的世界矩陣
                D3DXMATRIX matWorld;
                UINT  iTime  = timeGetTime() % 1000;
                FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
             D3DXMatrixIdentity( &matWorld );
                D3DXMatrixRotationX( &matWorld, fAngle );

             //設置世界矩陣
                g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
            }


            //-----------------------------------------------------------------------------
            // Desc: 設置觀察矩陣和投影矩陣
            //-----------------------------------------------------------------------------
            VOID SetupViewandProjMatrices()
            {
                //建立并設置觀察矩陣
                D3DXVECTOR3 vEyePt( 0.0f, 3.0f,-5.0f );
                D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
                D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
                D3DXMATRIX matView;
                D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
                g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

                //建立并設置投影矩陣
                D3DXMATRIX matProj;
                D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
                g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
            }


            //-----------------------------------------------------------------------------
            // Desc: 設置視區
            //-----------------------------------------------------------------------------
            VOID SetupViewPort()
            {
             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);
            }


            //-----------------------------------------------------------------------------
            // Desc: 初始化Direct3D
            //-----------------------------------------------------------------------------
            HRESULT InitD3D( HWND hWnd )
            {
             //創建Direct3D對象, 該對象用于創建Direct3D設備對象
                if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
                    return E_FAIL;

             //設置D3DPRESENT_PARAMETERS結構, 準備創建Direct3D設備對象
                D3DPRESENT_PARAMETERS d3dpp;
                ZeroMemory( &d3dpp, sizeof(d3dpp) );
                d3dpp.Windowed = TRUE;
                d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
                d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

             //創建Direct3D設備對象
                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 );

             //設置觀察和投影矩陣
             SetupViewandProjMatrices();

             //設置視區
             SetupViewPort();

             return S_OK;
            }


            //-----------------------------------------------------------------------------
            // Desc: 創建場景圖形
            //-----------------------------------------------------------------------------
            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   =0xffffff00;
                    pVertices[2*i+1].position = D3DXVECTOR3( sinf(theta), 1.0f, cosf(theta) );
              pVertices[2*i+1].color   =0xffffff00;
                }
                g_pVB->Unlock();

             WORD g_Indices[100] ;
             int index;
             for (index=0;index<100;index++)
             {
              g_Indices[index]=index;
             }
              //創建索引緩沖區
             if( FAILED( g_pd3dDevice->CreateIndexBuffer( 100*sizeof(WORD),
                                                              0, D3DFMT_INDEX16,  //索引類型
                                                              D3DPOOL_DEFAULT, &g_pIB,NULL ) ) )
                {
                    return E_FAIL;
                }

             //填充索引緩沖區
                VOID* pIndices;
                if( FAILED( g_pIB->Lock( 0, sizeof(g_Indices), (void**)&pIndices, 0 ) ) )
                    return E_FAIL;
                memcpy( pIndices, g_Indices, sizeof(g_Indices) );
                g_pIB->Unlock();


                return S_OK;
            }


            //-----------------------------------------------------------------------------
            // Desc: 釋放創建的對象
            //-----------------------------------------------------------------------------
            VOID Cleanup()
            {
             //釋放頂點緩沖區對象
                if( g_pVB != NULL )
                    g_pVB->Release();

             //釋放Direct3D設備對象
                if( g_pd3dDevice != NULL )
                    g_pd3dDevice->Release();

             //釋放Direct3D對象
                if( g_pD3D != NULL )
                    g_pD3D->Release();
            }


            //-----------------------------------------------------------------------------
            // Desc: 渲染圖形
            //-----------------------------------------------------------------------------
            VOID Render()
            {
             //清空后臺緩沖區
                g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 );

             //開始在后臺緩沖區繪制圖形
                if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
                {
              //設置世界矩陣
                    SetupWorldMatrice();

              //在后臺緩沖區繪制圖形

              g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
                    g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
                 g_pd3dDevice->SetIndices( g_pIB );  //設置索引緩沖區
                 g_pd3dDevice->DrawIndexedPrimitive ( D3DPT_LINELIST, 0,0,100,0,50 );


              //結束在后臺緩沖區渲染圖形
                    g_pd3dDevice->EndScene();
                }

             //將在后臺緩沖區繪制的圖形提交到前臺緩沖區顯示
                g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
            }


            //-----------------------------------------------------------------------------
            // Desc: 消息處理
            //-----------------------------------------------------------------------------
            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 );
            }


            //-----------------------------------------------------------------------------
            // Desc: 入口函數
            //-----------------------------------------------------------------------------
            INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
            {
             //注冊窗口類
                WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC , MsgProc, 0L, 0L,
                                  GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                                  L"ClassName", NULL };
                RegisterClassEx( &wc );

             //創建窗口
                HWND hWnd = CreateWindow( L"ClassName", L"坐標變換",
                                          WS_OVERLAPPEDWINDOW, 200, 100, 500,500,
                                          GetDesktopWindow(), NULL, wc.hInstance, NULL );
             g_Wnd=hWnd;

             //初始化Direct3D
                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"ClassName", wc.hInstance );
                return 0;
            }

            在上面的代碼中
              g_pd3dDevice->DrawIndexedPrimitive ( D3DPT_LINELIST, 0,0,100,0,50 );
            可以顯示出LINELIST
            但設置為(D3DPT_POINTLIST,0,0,100,0,100)時卻不能顯示POINT,
            這是為什么?

            posts - 16, comments - 17, trackbacks - 0, articles - 1

            Copyright © orlando

            久久夜色精品国产噜噜噜亚洲AV| 久久男人Av资源网站无码软件| 韩国无遮挡三级久久| 国产国产成人久久精品| 中文精品99久久国产| 狠狠色丁香久久综合婷婷| 久久国产精品久久精品国产| 久久久网中文字幕| 久久国产精品久久久| 久久久久99精品成人片牛牛影视| 91精品国产高清91久久久久久| 久久亚洲精品无码aⅴ大香| 国产精品亚洲美女久久久| 国产精品久久久久蜜芽| 久久久久免费看成人影片| 久久亚洲国产成人影院网站| 人妻无码αv中文字幕久久 | 久久人人青草97香蕉| 国产69精品久久久久9999| 久久精品国产久精国产果冻传媒| 久久久久这里只有精品 | 奇米影视7777久久精品人人爽| 精品久久久久久亚洲精品 | 久久精品黄AA片一区二区三区| 久久人人爽人爽人人爽av| 国产精品一久久香蕉国产线看| 久久精品女人天堂AV麻| 久久中文字幕一区二区| 97超级碰碰碰碰久久久久| 国产亚洲成人久久| 久久久久久A亚洲欧洲AV冫| 久久久久久毛片免费播放| 热99RE久久精品这里都是精品免费 | 久久免费视频1| 久久成人精品| 激情五月综合综合久久69| 青青草国产精品久久| 国产精品久久久久久久| 久久不见久久见免费视频7| 久久人人爽爽爽人久久久| 久久人人爽人人爽人人片AV不|