بسم الله الرحمن الرحيم السلام عليكم ورحمة الله وبركاته : كنا قد تكلمنا في السابق عن ذاكرة التقنيع "Stencil" وقد وضحنا اهمية هذه الذاكرة , وعرضنا بعض الامثلة على استخدام هذه الذاكرة , مثل : " إنشاء المرايا , إنشاء الظل للاجسام " وقد تكلمنا بالجزء الأول عن كيفية إنشاء المرايا , للإطلاع على الجزء الأول مــن هنـــا سنكمل الحديث اليوم عن هذه الذاكرة وسنستعرض المثال الثاني , الظل . ******************************************************************************** ****************** اولا : نقوم بإنشاء مشهد بسيط مثلا : غرفة بداخلها مرآة وفي منتصفها ابريق شاي " Teapot " وسأقوم باستخدام إضاءة موجهة Directional واضبط موقعها بحيث تظهر كأنها مسلطة على الجدار الامامي والايمن من الغرفة . الان وبعد تجهيز المشهد نقوم بكتابة الدالة Set_Shadow والتي ستقوم بإنشاء الظل . ثانيا : انشاء الظل . اولا نقوم بملأ ذاكرة Stencil بالقيمة صفر من خلال المنهج Clear
Device->Clear(0,0,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL,0xffffffff,1.0f,0);
Device->SetRenderState(D3DRS_STENCILENABLE,true);
Device->SetRenderState(D3DRS_STENCILREF,0x0);
Device->SetRenderState(D3DRS_STENCILMASK,0xffffffff); Device->SetRenderState(D3DRS_STENCILWRITEMASK,0xffffffff);
Device->SetRenderState(D3DRS_STENCILFUNC,D3DCMP_EQUAL)
Device->SetRenderState(D3DRS_STENCILFAIL,D3DSTENCILOP_KEEP); Device->SetRenderState(D3DRS_STENCILZFAIL,D3DSTENCILOP_KEEP); Device->SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_INCR);
Device->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
Device->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA); Device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
TeapotMaterial.Diffuse.a=0.5f;
D3DXPLANE plane(0.0f,-1.0f,0.0f,0.0f);
D3DXVECTOR4 Dir(-1,-1,-1, 0.0f);
D3DXMatrixShadow(&S,&Dir,&plane);
D3DXMatrixTranslation(&T,x,y,z);
W=T*S; Device->SetTransform(D3DTS_WORLD,&W);
Device->SetRenderState(D3DRS_ZENABLE,false);
Device->SetMaterial(&TeapotMaterial); Teapot->DrawSubset(0);
Device->SetRenderState(D3DRS_ZENABLE,true); Device->SetRenderState(D3DRS_ALPHABLENDENABLE,false); Device->SetRenderState(D3DRS_STENCILENABLE,false);