Exemple #1
0
void RenderShadow()
{
    Device->SetRenderState(D3DRS_STENCILENABLE,    true);
    Device->SetRenderState(D3DRS_STENCILFUNC,      D3DCMP_EQUAL);
    Device->SetRenderState(D3DRS_STENCILREF,       0x0);
    Device->SetRenderState(D3DRS_STENCILMASK,      0xffffffff);
    Device->SetRenderState(D3DRS_STENCILWRITEMASK, 0xffffffff);
    Device->SetRenderState(D3DRS_STENCILZFAIL,     D3DSTENCILOP_KEEP);
    Device->SetRenderState(D3DRS_STENCILFAIL,      D3DSTENCILOP_KEEP);
    Device->SetRenderState(D3DRS_STENCILPASS,      D3DSTENCILOP_INCR); // increment to 1

    // position shadow
    D3DXVECTOR4 lightDirection(0.707f, -0.707f, 0.707f, 0.0f);
    D3DXPLANE groundPlane(0.0f, -1.0f, 0.0f, 0.0f);

    D3DXMATRIX S;
    D3DXMatrixShadow(
        &S,
        &lightDirection,
        &groundPlane);

    D3DXMATRIX T;
    D3DXMatrixTranslation(
        &T,
        TeapotPosition.x,
        TeapotPosition.y,
        TeapotPosition.z);

    D3DXMATRIX W = T * S;
    Device->SetTransform(D3DTS_WORLD, &W);

    // alpha blend the shadow
    Device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
    Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

    D3DMATERIAL9 mtrl = d3d::InitMtrl(d3d::BLACK, d3d::BLACK, d3d::BLACK, d3d::BLACK, 0.0f);
    mtrl.Diffuse.a = 0.5f; // 50% transparency.

    // Disable depth buffer so that z-fighting doesn't occur when we
    // render the shadow on top of the floor.
    Device->SetRenderState(D3DRS_ZENABLE, false);

    Device->SetMaterial(&mtrl);
    Device->SetTexture(0, 0);
    Teapot->DrawSubset(0);

    Device->SetRenderState(D3DRS_ZENABLE, true);
    Device->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
    Device->SetRenderState(D3DRS_STENCILENABLE,    false);
}
Exemple #2
0
// 그림자
void MSPlane::RenderShadow( void )
{
	// 태양광에 의한 그림자
	D3DLIGHT9  light;
	g_pDevice->GetLight(0, &light);
	light.Specular = D3DXCOLOR(0,0,0,0);		 
	light.Range = 0;

	// 내적을 위한 방향 전환
	D3DXVECTOR4 vLight(light.Direction, 0);
	vLight = - vLight;

	// 그림자용 투영행렬 생성
	D3DXPLANE plane(0,1,0,0);	// 그림자용 평면
	D3DXMATRIX mShadow;
	D3DXMatrixShadow(&mShadow, &vLight, &plane);

	m_pMesh->RenderShadow(m_mTM*mShadow);
}