⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bumpearth.cpp

📁 VC++视频开发实例集锦(包括“远程视频监控”"语音识别系统"等13个经典例子)
💻 CPP
📖 第 1 页 / 共 3 页
字号:


        if( FAILED( hr = DXUtil_FindMediaFileCch( strPath, MAX_PATH,
                                                TEXT("EarthDispMap.fx") ) ) )
        {
            return hr;
        }
        LPD3DXEFFECT  pEffect;
        if( FAILED( hr = D3DXCreateEffectFromFile( m_pd3dDevice, strPath, NULL, NULL,
                                                0, NULL, &pEffect, NULL ) ) )
        {
            return hr;
        }

        D3DXHANDLE h = pEffect->GetParameterByName( NULL, TEXT("EarthBumpMap") );
        if( h == 0 )
        {
            SAFE_RELEASE( pEffect );
            return E_FAIL;
        }

        if( FAILED (hr = pEffect->GetVertexShader(h, &m_pDispMapBumpShader) ) )
            return hr;

        h = pEffect->GetParameterByName( NULL, TEXT("EarthNoBumpMap") );
        if( h == 0 )
        {
            SAFE_RELEASE( pEffect );
            return E_FAIL;
        }

        if( FAILED (hr = pEffect->GetVertexShader(h, &m_pDispMapShader) ) )
        {
            SAFE_RELEASE( pEffect );
            return hr;
        }

        SAFE_RELEASE( pEffect );


        D3DVERTEXELEMENT9 decl[] =
        {
            {0,  0, D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
            {0, 12, D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
            {0, 24, D3DDECLTYPE_FLOAT2,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
            {0, 32, D3DDECLTYPE_FLOAT2,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1},
            {0, 32, D3DDECLTYPE_FLOAT2,   D3DDECLMETHOD_LOOKUP,  D3DDECLUSAGE_SAMPLE, 0},
            D3DDECL_END()
        };
        if (FAILED(hr = m_pd3dDevice->CreateVertexDeclaration(decl, &m_pDispMapVertexDecl)))
        {
            return hr;
        }
    }

    m_bDeviceValidationFailed = FALSE;

    return S_OK;
}




//-----------------------------------------------------------------------------
// Name: RestoreDeviceObjects()
// Desc: 初始化scene 对象
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::RestoreDeviceObjects()
{
    m_pFont->RestoreDeviceObjects();
    m_pSkyBox->RestoreDeviceObjects( m_pd3dDevice );

    m_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP );
    m_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP );
    m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
    m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
    m_pd3dDevice->SetSamplerState( 1, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP );
    m_pd3dDevice->SetSamplerState( 1, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP );
    m_pd3dDevice->SetSamplerState( 1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
    m_pd3dDevice->SetSamplerState( 1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
    m_pd3dDevice->SetSamplerState( 2, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP );
    m_pd3dDevice->SetSamplerState( 2, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP );
    m_pd3dDevice->SetSamplerState( 2, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
    m_pd3dDevice->SetSamplerState( 2, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );

    m_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );

    FLOAT fAspect = ((FLOAT)m_d3dsdBackBuffer.Width) / m_d3dsdBackBuffer.Height;

    //设置投影矩阵 
    D3DXMatrixPerspectiveFovLH( &m_matProj, D3DX_PI/4, fAspect, 0.1f, 225.0f );
    m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &m_matProj );
  
	//设置ArcBall参数
    m_ArcBall.SetWindow( m_d3dsdBackBuffer.Width, m_d3dsdBackBuffer.Height, 3.0f );
    m_ArcBall.SetRadius( 1.0f );

    return S_OK;
}




//-----------------------------------------------------------------------------
// Name: InvalidateDeviceObjects()
// Desc:
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InvalidateDeviceObjects()
{
    m_pFont->InvalidateDeviceObjects();
    m_pSkyBox->InvalidateDeviceObjects();
    return S_OK;
}




//-----------------------------------------------------------------------------
// Name: DeleteDeviceObjects()
// Desc: 程序退出或者设备改变时调用,该函数删除一切设备相关的对象
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::DeleteDeviceObjects()
{
    SAFE_RELEASE( m_pBlockTexture );
    SAFE_RELEASE( m_pEarthTexture );
    SAFE_RELEASE( m_pEarthBumpTexture );
    SAFE_RELEASE( m_pEnvMapTexture );
    SAFE_RELEASE( m_pDispMapBumpShader );
    SAFE_RELEASE( m_pDispMapShader );
    SAFE_RELEASE( m_pDispMapVertexDecl );
    SAFE_RELEASE( m_pDispMapTexture );

    m_pFont->DeleteDeviceObjects();
    m_pSkyBox->Destroy();

    SAFE_RELEASE( m_psBumpMap );
    SAFE_RELEASE( m_pEarthVB );
    return S_OK;
}




//-----------------------------------------------------------------------------
// Name: FinalCleanup()
// Desc:
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::FinalCleanup()
{
    SAFE_DELETE( m_pFont );
    SAFE_DELETE( m_pSkyBox );

    return S_OK;
}




//-----------------------------------------------------------------------------
// Name: ConfirmDevice()
// Desc: 设备初始化时调用,此函数检查设备必须具备的最低限度的功能
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::ConfirmDevice( D3DCAPS9* pCaps, DWORD dwBehavior,
                                          D3DFORMAT adapterFormat, D3DFORMAT backBufferFormat )
{
    if( pCaps->TextureOpCaps & D3DTEXOPCAPS_BUMPENVMAPLUMINANCE )
    {
        if( SUCCEEDED( m_pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal,
                                                  pCaps->DeviceType, adapterFormat,
                                                  0, D3DRTYPE_TEXTURE,
                                                  D3DFMT_X8L8V8U8 ) ) )
        {
            return S_OK;
        }

        if( SUCCEEDED( m_pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal,
                                                  pCaps->DeviceType, adapterFormat,
                                                  0, D3DRTYPE_TEXTURE,
                                                  D3DFMT_L6V5U5 ) ) )
        {
            return S_OK;
        }
    }

    if( pCaps->TextureOpCaps & D3DTEXOPCAPS_BUMPENVMAP )
    {
        if( SUCCEEDED( m_pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal,
                                                  pCaps->DeviceType, adapterFormat,
                                                  0, D3DRTYPE_TEXTURE,
                                                  D3DFMT_V8U8 ) ) )
        {
            return S_OK;
        }
    }
    
    return E_FAIL;
}




//-----------------------------------------------------------------------------
// Name: CreateEarthVertexBuffer()
// Desc: 建立要进行凹凸贴图地球体各个定点
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::CreateEarthVertexBuffer()
{
    SAFE_RELEASE( m_pEarthVB );

    // 选择 tesselation级
    DWORD dwNumSphereRings    = m_bHighTesselation ? 15 :  5;
    DWORD dwNumSphereSegments = m_bHighTesselation ? 30 : 10;
    m_dwNumSphereVertices = 2 * dwNumSphereRings * (dwNumSphereSegments+1);

    DWORD usage = D3DUSAGE_WRITEONLY;
    if( m_bDispMapOn )
        usage |= D3DUSAGE_NPATCHES;
    // 创建顶点缓冲
	if( FAILED( m_pd3dDevice->CreateVertexBuffer( m_dwNumSphereVertices*sizeof(BUMPVERTEX),
                                                  usage, BUMPVERTEX::FVF,
                                                  D3DPOOL_MANAGED, &m_pEarthVB, NULL ) ) )
        return E_FAIL;

    return S_OK;
}




//-----------------------------------------------------------------------------
// Name: SetMenuStates()
// Desc:
//-----------------------------------------------------------------------------
VOID CMyD3DApplication::SetMenuStates()
{
    HMENU hMenu = GetMenu( m_hWnd );

    CheckMenuItem( hMenu, IDM_TEXTURETOGGLE,
                    m_bTextureOn ? MF_CHECKED : MF_UNCHECKED );
    CheckMenuItem( hMenu, IDM_BUMPMAPTOGGLE,
                    m_bBumpMapOn ? MF_CHECKED : MF_UNCHECKED );
    CheckMenuItem( hMenu, IDM_ENVMAPTOGGLE,
                    m_bEnvMapOn ? MF_CHECKED : MF_UNCHECKED );
    CheckMenuItem( hMenu, IDM_DISPMAPTOGGLE,
                    m_bDispMapOn ? MF_CHECKED : MF_UNCHECKED );

    CheckMenuItem( hMenu, IDM_U8V8L8,
                    m_BumpMapFormat==D3DFMT_X8L8V8U8 ? MF_CHECKED : MF_UNCHECKED );
    CheckMenuItem( hMenu, IDM_U5V5L6,
                    m_BumpMapFormat==D3DFMT_L6V5U5 ? MF_CHECKED : MF_UNCHECKED );
    CheckMenuItem( hMenu, IDM_U8V8,
                    m_BumpMapFormat==D3DFMT_V8U8 ? MF_CHECKED : MF_UNCHECKED );

    CheckMenuItem( hMenu, IDM_LOW_TESSELATION,
                    (!m_bHighTesselation) ? MF_CHECKED : MF_UNCHECKED );
    CheckMenuItem( hMenu, IDM_HIGH_TESSELATION,
                    m_bHighTesselation ? MF_CHECKED : MF_UNCHECKED );
}




//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: 消息处理函数,处理来自键盘和菜单的消息
//-----------------------------------------------------------------------------
LRESULT CMyD3DApplication::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam,
                                    LPARAM lParam )
{
    // 将鼠标消息传递给 ArcBall ,从而建立变换矩阵
    m_ArcBall.HandleMouseMessages( hWnd, uMsg, wParam, lParam );

    // Trap context menu
    if( WM_CONTEXTMENU == uMsg )
        return 0;

    //处理菜单命令
    if( WM_COMMAND == uMsg )
    {
        switch( LOWORD(wParam) )
        {
            case IDM_TEXTURETOGGLE:
                m_bTextureOn = !m_bTextureOn;
                break;

            case IDM_BUMPMAPTOGGLE:
                m_bBumpMapOn = !m_bBumpMapOn;
                break;

            case IDM_DISPMAPTOGGLE:
                m_bDispMapOn  = !m_bDispMapOn;
                CreateEarthVertexBuffer();
                break;

            case IDM_ENVMAPTOGGLE:
                m_bEnvMapOn  = !m_bEnvMapOn;
                break;

            case IDM_U8V8L8:
                SAFE_RELEASE( m_psBumpMap );
                m_BumpMapFormat = D3DFMT_X8L8V8U8;
                InitBumpMap();
                break;

            case IDM_U5V5L6:
                SAFE_RELEASE( m_psBumpMap );
                m_BumpMapFormat = D3DFMT_L6V5U5;
                InitBumpMap();
                break;

            case IDM_U8V8:
                SAFE_RELEASE( m_psBumpMap );
                m_BumpMapFormat = D3DFMT_V8U8;
                InitBumpMap();
                break;

            case IDM_LOW_TESSELATION:
                m_bHighTesselation = FALSE;
                CreateEarthVertexBuffer();
                break;

            case IDM_HIGH_TESSELATION:
                m_bHighTesselation = TRUE;
                CreateEarthVertexBuffer();
                break;
        }

        // 当有状态变化时,更新菜单
		SetMenuStates();
    }

    // 将其他消息传递给默认处理函数
    return CD3DApplication::MsgProc( hWnd, uMsg, wParam, lParam );
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -