?? bumpearth.cpp
字號:
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 + -