?? bumpearth.cpp
字號:
m_pd3dDevice->SetTexture(D3DDMAPSAMPLER, m_pDispMapTexture);
D3DXMATRIX m;
D3DXMatrixMultiply(&m, &m_matWorld, &m_matView);
D3DXMatrixMultiplyTranspose(&m, &m, &m_matProj);
m_pd3dDevice->SetVertexShaderConstantF(0, (float*)&m, 4);
float c[4] = {0.15f,0,0,0};
m_pd3dDevice->SetVertexShaderConstantF(4, c, 1);
m_pd3dDevice->SetNPatchMode(4);
m_pd3dDevice->SetVertexDeclaration( m_pDispMapVertexDecl );
if( m_bBumpMapOn && m_bEnvMapOn )
{
m_pd3dDevice->SetVertexShader( m_pDispMapBumpShader );
}
else
{
m_pd3dDevice->SetVertexShader( m_pDispMapShader );
}
}
else
{
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 1 );
m_pd3dDevice->SetFVF( BUMPVERTEX::FVF );
}
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
if( m_bBumpMapOn && m_bEnvMapOn )
{
m_pd3dDevice->SetTexture( 1, m_psBumpMap );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 );
if( m_BumpMapFormat == D3DFMT_V8U8 )
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_BUMPENVMAP );
else
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_BUMPENVMAPLUMINANCE );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT00, F2DW(0.5f) );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT01, F2DW(0.0f) );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT10, F2DW(0.0f) );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT11, F2DW(0.5f) );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVLSCALE, F2DW(4.0f) );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVLOFFSET, F2DW(0.0f) );
if( m_bEnvMapOn )
{
m_pd3dDevice->SetTexture( 2, m_pEnvMapTexture );
if( !m_bDispMapOn )
m_pd3dDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 0 );
m_pd3dDevice->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_ADD );
m_pd3dDevice->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );
}
else
m_pd3dDevice->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_DISABLE );
}
else
{
if( m_bEnvMapOn )
{
m_pd3dDevice->SetTexture( 1, m_pEnvMapTexture );
if( !m_bDispMapOn )
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_ADD );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
}
else
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
m_pd3dDevice->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_DISABLE );
}
m_pd3dDevice->SetStreamSource( 0, m_pEarthVB, 0, sizeof(BUMPVERTEX) );
DWORD dwNumPasses;
HRESULT hr;
hr = m_pd3dDevice->ValidateDevice( &dwNumPasses );
if ( ( D3D_OK == hr) || ( D3DERR_DEVICELOST == hr ) )
{
m_bDeviceValidationFailed = FALSE;
}
else
{
m_bDeviceValidationFailed = TRUE;
}
m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, m_dwNumSphereVertices-2 );
if ( m_bDispMapOn )
{
m_pd3dDevice->SetNPatchMode(0);
m_pd3dDevice->SetVertexShader( NULL );
}
m_pd3dDevice->SetTexture( 0, NULL );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_pd3dDevice->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_DISABLE );
m_pd3dDevice->SetTextureStageState( 2, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_pFont->DrawText( 2, 0, D3DCOLOR_ARGB(255,255,255,0), m_strFrameStats );
m_pFont->DrawText( 2, 20, D3DCOLOR_ARGB(255,255,255,0), m_strDeviceStats );
if( m_bDeviceValidationFailed )
{
m_pFont->DrawText( 2, 40, D3DCOLOR_ARGB(255,255,0,0),
_T("Warning: Device validation failed. Rendering may not look right.") );
}
m_pd3dDevice->EndScene();
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: InitBumpMap()
// Desc:
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InitBumpMap()
{
LPDIRECT3DTEXTURE9 psBumpSrc = m_pEarthBumpTexture;
D3DSURFACE_DESC d3dsd;
D3DLOCKED_RECT d3dlr;
psBumpSrc->GetLevelDesc( 0, &d3dsd );
if( FAILED( m_pd3dDevice->CreateTexture( d3dsd.Width, d3dsd.Height, 1, 0,
m_BumpMapFormat, D3DPOOL_MANAGED, &m_psBumpMap, NULL ) ) )
{
return E_FAIL;
}
psBumpSrc->LockRect( 0, &d3dlr, 0, 0 );
DWORD dwSrcPitch = (DWORD)d3dlr.Pitch;
BYTE* pSrcTopRow = (BYTE*)d3dlr.pBits;
BYTE* pSrcCurRow = pSrcTopRow;
BYTE* pSrcBotRow = pSrcTopRow + (dwSrcPitch * (d3dsd.Height - 1) );
m_psBumpMap->LockRect( 0, &d3dlr, 0, 0 );
DWORD dwDstPitch = (DWORD)d3dlr.Pitch;
BYTE* pDstTopRow = (BYTE*)d3dlr.pBits;
BYTE* pDstCurRow = pDstTopRow;
for( DWORD y=0; y<d3dsd.Height; y++ )
{
BYTE* pSrcB0;
BYTE* pSrcB1;
BYTE* pSrcB2;
BYTE* pDstT;
pSrcB0 = pSrcCurRow;
if( y == d3dsd.Height - 1)
pSrcB1 = pSrcTopRow;
else
pSrcB1 = pSrcCurRow + dwSrcPitch;
if( y == 0 )
pSrcB2 = pSrcBotRow;
else
pSrcB2 = pSrcCurRow - dwSrcPitch;
pDstT = pDstCurRow;
for( DWORD x=0; x<d3dsd.Width; x++ )
{
LONG v00;
LONG v01;
LONG vM1;
LONG v10;
LONG v1M;
v00 = *(pSrcB0+0);
if( x == d3dsd.Width - 1 )
v01 = *(pSrcCurRow);
else
v01 = *(pSrcB0+4);
if( x == 0 )
vM1 = *(pSrcCurRow + (4 * (d3dsd.Width - 1)));
else
vM1 = *(pSrcB0-4);
v10 = *(pSrcB1+0);
v1M = *(pSrcB2+0);
LONG iDu = (vM1-v01);
LONG iDv = (v1M-v10);
WORD uL = ( v00>1 ) ? 63 : 127;
switch( m_BumpMapFormat )
{
case D3DFMT_V8U8:
*pDstT++ = (BYTE)iDu;
*pDstT++ = (BYTE)iDv;
break;
case D3DFMT_L6V5U5:
*(WORD*)pDstT = (WORD)( ( (iDu>>3) & 0x1f ) << 0 );
*(WORD*)pDstT |= (WORD)( ( (iDv>>3) & 0x1f ) << 5 );
*(WORD*)pDstT |= (WORD)( ( ( uL>>2) & 0x3f ) << 10 );
pDstT += 2;
break;
case D3DFMT_X8L8V8U8:
*pDstT++ = (BYTE)iDu;
*pDstT++ = (BYTE)iDv;
*pDstT++ = (BYTE)uL;
*pDstT++ = (BYTE)0L;
break;
}
pSrcB0+=4;
pSrcB1+=4;
pSrcB2+=4;
}
pSrcCurRow += dwSrcPitch;
pDstCurRow += dwDstPitch;
}
m_psBumpMap->UnlockRect(0);
psBumpSrc->UnlockRect(0);
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: InitDeviceObjects()
// Desc:
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InitDeviceObjects()
{
m_pFont->InitDeviceObjects( m_pd3dDevice );
if( FAILED( m_pSkyBox->Create( m_pd3dDevice, _T("lobby_skybox.x") ) ) )
return D3DAPPERR_MEDIANOTFOUND;
if( FAILED( D3DUtil_CreateTexture( m_pd3dDevice, _T("Block.bmp"),
&m_pBlockTexture, D3DFMT_R5G6B5 ) ) )
return D3DAPPERR_MEDIANOTFOUND;
if( FAILED( D3DUtil_CreateTexture( m_pd3dDevice, _T("Earth.bmp"),
&m_pEarthTexture, D3DFMT_R5G6B5 ) ) )
return D3DAPPERR_MEDIANOTFOUND;
if( FAILED( D3DUtil_CreateTexture( m_pd3dDevice, _T("Earthbump.bmp"),
&m_pEarthBumpTexture, D3DFMT_A8R8G8B8 ) ) )
return D3DAPPERR_MEDIANOTFOUND;
if( FAILED( D3DUtil_CreateTexture( m_pd3dDevice, _T("EarthEnvMap.bmp"),
&m_pEnvMapTexture, D3DFMT_R5G6B5 ) ) )
return D3DAPPERR_MEDIANOTFOUND;
D3DFORMAT adapterFormat = m_d3dSettings.DisplayMode().Format;
BOOL bCanDoV8U8 = SUCCEEDED( m_pD3D->CheckDeviceFormat( m_d3dCaps.AdapterOrdinal,
m_d3dCaps.DeviceType, adapterFormat,
0, D3DRTYPE_TEXTURE,
D3DFMT_V8U8 ) ) &&
(m_d3dCaps.TextureOpCaps & D3DTEXOPCAPS_BUMPENVMAP );
BOOL bCanDoL6V5U5 = SUCCEEDED( m_pD3D->CheckDeviceFormat( m_d3dCaps.AdapterOrdinal,
m_d3dCaps.DeviceType, adapterFormat,
0, D3DRTYPE_TEXTURE,
D3DFMT_L6V5U5 ) ) &&
(m_d3dCaps.TextureOpCaps & D3DTEXOPCAPS_BUMPENVMAPLUMINANCE );
BOOL bCanDoL8V8U8 = SUCCEEDED( m_pD3D->CheckDeviceFormat( m_d3dCaps.AdapterOrdinal,
m_d3dCaps.DeviceType, adapterFormat,
0, D3DRTYPE_TEXTURE,
D3DFMT_X8L8V8U8 ) ) &&
(m_d3dCaps.TextureOpCaps & D3DTEXOPCAPS_BUMPENVMAPLUMINANCE );
if( bCanDoV8U8 ) m_BumpMapFormat = D3DFMT_V8U8;
else if( bCanDoL6V5U5 ) m_BumpMapFormat = D3DFMT_L6V5U5;
else if( bCanDoL8V8U8 ) m_BumpMapFormat = D3DFMT_X8L8V8U8;
else return E_FAIL;
m_bCanDoDispMap = ( (m_pd3dDevice->GetSoftwareVertexProcessing() == FALSE) &&
(m_d3dCaps.DevCaps2 & D3DDEVCAPS2_DMAPNPATCH ) &&
m_d3dCaps.VertexShaderVersion >= D3DVS_VERSION(1,1) &&
SUCCEEDED( m_pD3D->CheckDeviceFormat( m_d3dCaps.AdapterOrdinal,
m_d3dCaps.DeviceType,
adapterFormat,
D3DUSAGE_DMAP,
D3DRTYPE_TEXTURE,
D3DFMT_L8 ) ) );
if( !m_bCanDoDispMap )
m_bDispMapOn = false;
HMENU hMenu = GetMenu( m_hWnd );
EnableMenuItem( hMenu, IDM_U8V8, bCanDoV8U8 ? MF_ENABLED : MF_GRAYED );
EnableMenuItem( hMenu, IDM_U5V5L6, bCanDoL6V5U5 ? MF_ENABLED : MF_GRAYED );
EnableMenuItem( hMenu, IDM_U8V8L8, bCanDoL8V8U8 ? MF_ENABLED : MF_GRAYED );
EnableMenuItem( hMenu, IDM_DISPMAPTOGGLE, m_bCanDoDispMap? MF_ENABLED : MF_GRAYED );
SetMenuStates();
if( FAILED( CreateEarthVertexBuffer() ) )
return E_FAIL;
if( FAILED( InitBumpMap() ) )
return E_FAIL;
if( m_bCanDoDispMap )
{
HRESULT hr;
TCHAR strPath[MAX_PATH];
if( FAILED( hr = DXUtil_FindMediaFileCb( strPath, sizeof(strPath), TEXT("Earthbump.bmp") ) ) )
return hr;
hr = D3DXCreateTextureFromFileEx( m_pd3dDevice,
strPath,
D3DX_DEFAULT,
D3DX_DEFAULT,
D3DX_DEFAULT,
D3DUSAGE_DMAP,
D3DFMT_L8,
D3DPOOL_MANAGED,
D3DX_DEFAULT,
D3DX_DEFAULT,
0,
NULL,
NULL,
&m_pDispMapTexture );
if( FAILED(hr) )
return D3DAPPERR_MEDIANOTFOUND;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -