texcolorblend.cpp

来自「DX例子中等难度的。全是新例子。VC2003」· C++ 代码 · 共 634 行 · 第 1/2 页

CPP
634
字号
	else if( blendFlag == 2 )
	{
		pd3dDevice->SetTexture( 0, g_pBaseTexture); 
		pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
		pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
		pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); 

		pd3dDevice->SetTexture(1, g_pDarkTexture); 
		pd3dDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0 );
		pd3dDevice->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
		pd3dDevice->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT );  

		static double fLastTime = 0.0f;
		static double interval = 0.0f;
		interval = fTime - fLastTime;

		if(interval<0.5f)
		{
			pd3dDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);
		}
		else if (interval>0.5f && interval<1.0f)
		{
			pd3dDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
		}
		else if (interval>1.0f && interval<1.5f)
		{
			pd3dDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE4X);
		}
		else if (interval > 1.5f)
		{
			fLastTime = fTime;
		}
		wcscpy( strBlendMethod,  L"黑暗贴图动画");
	}

	//混合纹理与材质漫反射颜色
	else if( blendFlag == 3 )  
	{
		pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
		pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00808080 );
		pd3dDevice->SetLight( 0, &light );
		pd3dDevice->LightEnable( 0, TRUE );
		pd3dDevice->SetMaterial( &mtrl );

		pd3dDevice->SetTexture( 0, g_pBaseTexture ); 
		pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
		pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
		pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
		pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_ADD );
		pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP,   D3DTOP_DISABLE );

		wcscpy( strBlendMethod,  L"混合纹理与材质漫反射颜色");
	}

	//混合黑暗贴图与材质漫反射颜色
	else if( blendFlag == 4 )  
	{
		pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
		pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00808080 );
		pd3dDevice->SetLight( 0, &light );
		pd3dDevice->LightEnable( 0, TRUE );
		pd3dDevice->SetMaterial( &mtrl );

		pd3dDevice->SetTexture( 0, g_pBaseTexture); 
		pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
		pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); 
		pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); 
		pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);

		pd3dDevice->SetTexture(1, g_pDarkTexture); 
		pd3dDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0 );
		pd3dDevice->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE); 
		pd3dDevice->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
		pd3dDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);

		wcscpy( strBlendMethod,  L"混合黑暗贴图与材质漫反射颜色");
	}

	//发光映射
	else if( blendFlag == 5 )  
	{
		pd3dDevice->SetTexture( 0, g_pBaseTexture );
		pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
		pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
		pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );

		pd3dDevice->SetTexture( 1, g_pDarkTexture );
		pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );
		pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
		pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
		pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_ADD );
		wcscpy( strBlendMethod,  L"发光映射");
	}

	//细节映射
	else if( blendFlag == 6 )  
	{
		pd3dDevice->SetTexture( 0, g_pBaseTexture );
		pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
		pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
		pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );

		pd3dDevice->SetTexture( 1, g_pDetailTexture );
		pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );
		pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
		pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
		hr = pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_ADDSIGNED );
		if( FAILED( hr ) )
			pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X );

		wcscpy( strBlendMethod,  L"细节映射");
	}
}


//-----------------------------------------------------------------------------
// Desc: 渲染场景
//-----------------------------------------------------------------------------
void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, 
							float fElapsedTime, void* pUserContext )
{
    HRESULT hr;
  
	//如果正在利用Direct3D设备设置对话框进行设置, 则不渲染场景
    if( g_SettingsDlg.IsActive() )
    {
        g_SettingsDlg.OnRender( fElapsedTime );
        return;
    }

    //清除后台颜色缓冲区和深度缓冲区
    V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 
		                 D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0) );

    //渲染场景
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )
    {
		//渲染图形
		pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
		pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
		pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2);

		//渲染文本和控件
        DXUT_BeginPerfEvent( DXUT_PERFEVENTCOLOR, L"HUD / Stats" ); 
        //RenderText();
        //V( g_HUD.OnRender( fElapsedTime ) );
        V( g_SampleUI.OnRender( fElapsedTime ) );
        DXUT_EndPerfEvent();

        V( pd3dDevice->EndScene() );
    }
}


//-----------------------------------------------------------------------------
// Desc: 渲染文本
//-----------------------------------------------------------------------------
void RenderText()
{
    CDXUTTextHelper txtHelper( g_pFont, g_pTextSprite, 15 );

    //显示当前Direct3D设备状态和渲染帧速率
    txtHelper.Begin();
    txtHelper.SetInsertionPos( 5, 5 );
    txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
    txtHelper.DrawTextLine( DXUTGetFrameStats(true) );
    txtHelper.DrawTextLine( DXUTGetDeviceStats() );

	//显示其他简要信息
    txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
	txtHelper.DrawTextLine( strBlendMethod );
    
    //显示简单帮助文本
    const D3DSURFACE_DESC* pd3dsdBackBuffer = DXUTGetBackBufferSurfaceDesc();
    if( g_bShowHelp )
    {
        txtHelper.SetInsertionPos( 10, pd3dsdBackBuffer->Height-15*9 );
        txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 0.75f, 0.0f, 1.0f ) );
        txtHelper.DrawTextLine( L"Controls (F1 to hide):" );
		
        txtHelper.SetInsertionPos( 40, pd3dsdBackBuffer->Height-15*8 );
		txtHelper.DrawTextLine( L"Quit: ESC" );
		txtHelper.DrawTextLine( L"1 : 黑暗映射" );
		txtHelper.DrawTextLine( L"2 : 黑暗贴图动画" );
		txtHelper.DrawTextLine( L"3 : 混合纹理与材质漫反射颜色" );
		txtHelper.DrawTextLine( L"4 : 混合黑暗贴图与材质漫反射颜色" );
		txtHelper.DrawTextLine( L"5 : 发光映射" );
		txtHelper.DrawTextLine( L"6 : 细节映射" );		
    }
    else
    {
        txtHelper.SetInsertionPos( 10, pd3dsdBackBuffer->Height-15*2 );
        txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
        txtHelper.DrawTextLine( L"Press F1 for help" );
    }
    txtHelper.End();
}


//-----------------------------------------------------------------------------
// Desc: 消息处理
//-----------------------------------------------------------------------------
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, 
						 bool* pbNoFurtherProcessing, void* pUserContext )
{
    *pbNoFurtherProcessing = g_DialogResourceManager.MsgProc( hWnd, uMsg, wParam, lParam );
    if( *pbNoFurtherProcessing )
        return 0;

    if( g_SettingsDlg.IsActive() )
    {
        g_SettingsDlg.MsgProc( hWnd, uMsg, wParam, lParam );
        return 0;
    }

    *pbNoFurtherProcessing = g_HUD.MsgProc( hWnd, uMsg, wParam, lParam );
    if( *pbNoFurtherProcessing )
        return 0;
   
	*pbNoFurtherProcessing = g_SampleUI.MsgProc( hWnd, uMsg, wParam, lParam );
    if( *pbNoFurtherProcessing )
        return 0;

    return 0;
}


//-----------------------------------------------------------------------------
// Desc: 键盘消息处理
//-----------------------------------------------------------------------------
void CALLBACK KeyboardProc( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext )
{
    if( bKeyDown )
	{
		switch( nChar )
		{
		case VK_F1: g_bShowHelp = !g_bShowHelp; break;

		//1键
		case 49: blendFlag = 1;
			break;

		//2键
		case 50: blendFlag = 2;
			break;

		//3键
		case 51: blendFlag = 3;
			break;

		//4键
		case 52: blendFlag = 4;
			break;

		//5键
		case 53: blendFlag = 5;
			break;

		//6键
		case 54: blendFlag = 6;
			break;
		}
    }
}


//-----------------------------------------------------------------------------
// Desc: 处理各种控件消息
//-----------------------------------------------------------------------------
void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, 
						 void* pUserContext )
{
    switch( nControlID )
    {
        case IDC_TOGGLEFULLSCREEN:
			DXUTToggleFullScreen(); 
			break;

        case IDC_TOGGLEREF:
			DXUTToggleREF(); 
			break;

        case IDC_CHANGEDEVICE:
			g_SettingsDlg.SetActive( !g_SettingsDlg.IsActive() ); 
			break;
    }
}


//-----------------------------------------------------------------------------
// Desc: 释放在OnResetDevice()中创建的资源
//-----------------------------------------------------------------------------
void CALLBACK OnLostDevice( void* pUserContext )
{
    g_DialogResourceManager.OnLostDevice();
    g_SettingsDlg.OnLostDevice();
    if( g_pFont )
        g_pFont->OnLostDevice();
    SAFE_RELEASE( g_pTextSprite );
}


//------------------------------------------------------------------------------
// Desc: 释放在OnCreateDevice()中创建的资源
//------------------------------------------------------------------------------
void CALLBACK OnDestroyDevice( void* pUserContext )
{
    g_DialogResourceManager.OnDestroyDevice();
    g_SettingsDlg.OnDestroyDevice();
    SAFE_RELEASE( g_pFont );

	SAFE_RELEASE( g_pVB );
	SAFE_RELEASE( g_pBaseTexture );
	SAFE_RELEASE( g_pDarkTexture );
	SAFE_RELEASE( g_pDetailTexture );
}

⌨️ 快捷键说明

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