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

📄 d3d9cartoon.cpp

📁 卡通渲染的一个DEMO
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Desc: Paired with InvalidateDeviceObjects()
//       The device exists, but may have just been Reset().  Resources in
//       D3DPOOL_DEFAULT and any other device state that persists during
//       rendering should be set here.  Render states, matrices, textures,
//       etc., that don't change during rendering can be set once here to
//       avoid redundant state setting during Render() or FrameMove().
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::RestoreDeviceObjects()
{
    // TODO: setup render states

    // Setup a material
    D3DMATERIAL9 mtrl;
    D3DUtil_InitMaterial( mtrl, 1.0f, 0.0f, 0.0f );
    m_pd3dDevice->SetMaterial( &mtrl );

    // Set up the textures
    m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
    m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
    m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
    m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE );
    m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
    m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
    m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
    m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );

    // Set miscellaneous render states
    m_pd3dDevice->SetRenderState( D3DRS_DITHERENABLE,   FALSE );
    m_pd3dDevice->SetRenderState( D3DRS_SPECULARENABLE, FALSE );
    m_pd3dDevice->SetRenderState( D3DRS_ZENABLE,        TRUE );
    m_pd3dDevice->SetRenderState( D3DRS_AMBIENT,        0x000F0F0F );

    // Restore the font
    m_pFont->RestoreDeviceObjects();

	///////////////////////////////////////////////////////////////
	D3DXVECTOR3 vEye=D3DXVECTOR3(0.0f,0.0f,-2.0f*m_ObjRadius);
    D3DXVECTOR3 vAt=D3DXVECTOR3(0.0f,0.0f,0.0f);
    D3DXVECTOR3 vUp=D3DXVECTOR3(0.0f,1.0f,0.0f);
	FLOAT fAspect;
	HRESULT hr;
	
    D3DXMatrixIdentity(&m_matWorld);
	D3DXMatrixLookAtLH(&m_matView,&vEye,&vAt,&vUp);
    fAspect=(FLOAT)m_d3dsdBackBuffer.Width/(FLOAT)m_d3dsdBackBuffer.Height;
    D3DXMatrixPerspectiveFovLH(&m_matProj,D3DXToRadian(60.0f),fAspect,0.1f,100.0f);
	
	m_pd3dDevice->SetTransform(D3DTS_WORLD,&m_matWorld);
    m_pd3dDevice->SetTransform(D3DTS_VIEW,&m_matView);
    m_pd3dDevice->SetTransform(D3DTS_PROJECTION,&m_matProj);

	m_ArcBall.SetWindow(m_d3dsdBackBuffer.Width,m_d3dsdBackBuffer.Height,0.8f);
    m_ArcBall.SetRadius(m_ObjRadius);

	hr=m_pObject->RestoreDeviceObjects(m_pd3dDevice);
	hr=m_pFloor->RestoreDeviceObjects(m_pd3dDevice);

    return S_OK;
}

//-----------------------------------------------------------------------------
// Name: FrameMove()
// Desc: Called once per frame, the call is the entry point for animating
//       the scene.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::FrameMove()
{
    // TODO: update world
	///////////////////////////////////////////////////////////////
	D3DXMATRIX matT,matX,matY,matZ;

	D3DXMatrixTranslation(&matT,0.01f,0.01f,0.01f);
	D3DXMatrixRotationX(&matX,10.0f*D3DX_PI/180.0f);
	D3DXMatrixRotationY(&matY,110.0f*D3DX_PI/180.0f);
	D3DXMatrixRotationZ(&matZ,15.0f*D3DX_PI/180.0f);
	D3DXMatrixMultiply(&m_matWorld,&matX,&matY);
	D3DXMatrixMultiply(&m_matWorld,&m_matWorld,&matZ);
	D3DXMatrixMultiply(&m_matWorld,&m_matWorld,&matT);

    D3DXMatrixMultiply(&m_matWorld,&m_matWorld,m_ArcBall.GetRotationMatrix());
    D3DXMatrixMultiply(&m_matWorld,&m_matWorld,m_ArcBall.GetTranslationMatrix());
	
	D3DXMATRIX matWVPTranspose,matWVTranspose,matViewTranspose,matProjTranspose;
	D3DXMATRIX matWVP,matWV;
	HRESULT hr;
	
	D3DXMatrixMultiply(&matWV,&m_matWorld,&m_matView);
	D3DXMatrixMultiply(&matWVP,&matWV,&m_matProj);
	D3DXMatrixTranspose(&matWVPTranspose,&matWVP);
	D3DXMatrixTranspose(&matWVTranspose,&matWV);
	D3DXMatrixTranspose(&matViewTranspose,&m_matView);
    D3DXMatrixTranspose(&matProjTranspose,&m_matProj);
	
	FLOAT fLight[4]={-1.0f,-1.0f,1.0f,0.0f};
	FLOAT fDiffuse[4]={1.0f,1.0f,0.0f,1.0f};
	FLOAT fAmbient[4]={0.25f,0.25f,0.25f,1.0f};
	
	hr=m_pd3dDevice->SetVertexShaderConstantF(1,(FLOAT*)&matWVTranspose,4);
	hr=m_pd3dDevice->SetVertexShaderConstantF(5,(FLOAT*)&matWVPTranspose,4);
	hr=m_pd3dDevice->SetVertexShaderConstantF(18,(FLOAT*)&matViewTranspose,4);
	hr=m_pd3dDevice->SetVertexShaderConstantF(22,(FLOAT*)&matProjTranspose,4);

	hr=m_pd3dDevice->SetVertexShaderConstantF(9,(FLOAT*)&fDiffuse,1);
	hr=m_pd3dDevice->SetVertexShaderConstantF(10,(FLOAT*)&fLight,1);
	hr=m_pd3dDevice->SetVertexShaderConstantF(11,(FLOAT*)&fAmbient,1);
  
    return S_OK;
}

//-----------------------------------------------------------------------------
// Name: UpdateInput()
// Desc: Update the user input.  Called once per frame 
//-----------------------------------------------------------------------------
void CMyD3DApplication::UpdateInput( UserInput* pUserInput )
{
    pUserInput->bRotateUp    = ( m_bActive && (GetAsyncKeyState( VK_UP )    & 0x8000) == 0x8000 );
    pUserInput->bRotateDown  = ( m_bActive && (GetAsyncKeyState( VK_DOWN )  & 0x8000) == 0x8000 );
    pUserInput->bRotateLeft  = ( m_bActive && (GetAsyncKeyState( VK_LEFT )  & 0x8000) == 0x8000 );
    pUserInput->bRotateRight = ( m_bActive && (GetAsyncKeyState( VK_RIGHT ) & 0x8000) == 0x8000 );
}

//-----------------------------------------------------------------------------
// Name: Render()
// Desc: Called once per frame, the call is the entry point for 3d
//       rendering. This function sets up render states, clears the
//       viewport, and renders the scene.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::Render()
{
    // Clear the viewport
    m_pd3dDevice->Clear( 0L, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
                         0x000000ff, 1.0f, 0L );

    // Begin the scene
    if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )
    {
        // TODO: render world
        
        // Render the teapot mesh
        //m_pD3DXMesh->DrawSubset(0);

		///////////////////////////////////////////////////////////
		HRESULT hr;

		hr=m_pd3dDevice->SetVertexDeclaration(m_pFloorVertexDecl);
		hr=m_pd3dDevice->SetVertexShader(m_pFloorVertexShader);
		hr=m_pFloor->Render(m_pd3dDevice);

		hr=m_pd3dDevice->SetVertexDeclaration(m_pSurfaceVertexDecl);
		hr=m_pd3dDevice->SetVertexShader(m_pSurfaceVertexShader);
		hr=m_pObject->Render(m_pd3dDevice);
		
		m_pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE,1);
		m_pd3dDevice->SetRenderState(D3DRS_ALPHAFUNC,D3DCMP_GREATEREQUAL);
		m_pd3dDevice->SetRenderState(D3DRS_ALPHAREF,200);

		hr=m_pd3dDevice->SetVertexDeclaration(m_pSilhouetteVertexDecl);
		hr=m_pd3dDevice->SetVertexShader(m_pSilhouetteVertexShader);
		hr=m_pObject->Render(m_pd3dDevice);

        // Render stats and help text  
        RenderText();

        // End the scene.
        m_pd3dDevice->EndScene();
    }

    return S_OK;
}

//-----------------------------------------------------------------------------
// Name: RenderText()
// Desc: Renders stats and help text to the scene.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::RenderText()
{
    D3DCOLOR fontColor        = D3DCOLOR_ARGB(255,255,255,0);
    TCHAR szMsg[MAX_PATH] = TEXT("");

    // Output display stats
    FLOAT fNextLine = 40.0f; 

    lstrcpy( szMsg, m_strDeviceStats );
    fNextLine -= 20.0f;
    m_pFont->DrawText( 2, fNextLine, fontColor, szMsg );

    lstrcpy( szMsg, m_strFrameStats );
    fNextLine -= 20.0f;
    m_pFont->DrawText( 2, fNextLine, fontColor, szMsg );

    return S_OK;
}

//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: Overrrides the main WndProc, so the sample can do custom message
//       handling (e.g. processing mouse, keyboard, or menu commands).
//-----------------------------------------------------------------------------
LRESULT CMyD3DApplication::MsgProc( HWND hWnd, UINT msg, WPARAM wParam,
                                    LPARAM lParam )
{
	///////////////////////////////////////////////////////////////
	m_ArcBall.HandleMouseMessages(hWnd,msg,wParam,lParam);

    return CD3DApplication::MsgProc( hWnd, msg, wParam, lParam );
}

//-----------------------------------------------------------------------------
// Name: InvalidateDeviceObjects()
// Desc: Invalidates device objects.  Paired with RestoreDeviceObjects()
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InvalidateDeviceObjects()
{
    // TODO: Cleanup any objects created in RestoreDeviceObjects()
    m_pFont->InvalidateDeviceObjects();

	///////////////////////////////////////////////////////////////
	m_pObject->InvalidateDeviceObjects();
	m_pFloor->InvalidateDeviceObjects();

    return S_OK;
}

//-----------------------------------------------------------------------------
// Name: DeleteDeviceObjects()
// Desc: Paired with InitDeviceObjects()
//       Called when the app is exiting, or the device is being changed,
//       this function deletes any device dependent objects.  
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::DeleteDeviceObjects()
{
    // TODO: Cleanup any objects created in InitDeviceObjects()
    m_pFont->DeleteDeviceObjects();
    SAFE_RELEASE( m_pD3DXMesh );

	///////////////////////////////////////////////////////////////
	m_pObject->Destroy();
	m_pFloor->Destroy();

	SAFE_RELEASE(m_pSilhouetteVertexShader);
	SAFE_RELEASE(m_pSilhouetteVertexDecl);

	SAFE_RELEASE(m_pSurfaceVertexShader);
	SAFE_RELEASE(m_pSurfaceVertexDecl);

	SAFE_RELEASE(m_pFloorVertexShader);
	SAFE_RELEASE(m_pFloorVertexDecl);

    return S_OK;
}

//-----------------------------------------------------------------------------
// Name: FinalCleanup()
// Desc: Paired with OneTimeSceneInit()
//       Called before the app exits, this function gives the app the chance
//       to cleanup after itself.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::FinalCleanup()
{
    // TODO: Perform any final cleanup needed
    // Cleanup D3D font
    SAFE_DELETE( m_pFont );

	///////////////////////////////////////////////////////////////
	SAFE_DELETE(m_pObject);
	SAFE_DELETE(m_pFloor);

    return S_OK;
}

⌨️ 快捷键说明

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