بسم الله الرحمن الرحيم سأتكلم من خلال درسي هذا عن جزء مهم في برمجة الجرافيكس , وهو ذاكرة التقنيع او مايعرف بـ Stencil تقدم لنا ذاكرة التقنيع فوائد عديدة تمكننا من اضفاء جماليات على المشاهد يصعب انشاءها الا بالعمليات الرياضية المعقدة , سنأخذ على سبيل المثال انشاء المرايا وادخالها داخل المشهد .. انشاء المرايا : تكمن الفكرة بأنه يوجد جزء من المشهد يمثل المرآة تنعكس من خلاله اي جسم يمر من امامه ولهذا يجب ان نأخذ بعين الاعتبار بأن هذا الجسم المنعكس يجب ان لاينعكس الا اذا وقع امام هذه المرآة اما اذا وقع امام اي جسم اخر فأنه لاينعكس . نستطيع ان نكون المرآة من خلال عمليات رياضيه معقدة تسمى برياضيات الانعكاس , ولكن سنستخدم هنا طريقة ابسط توفرها لنا ذاكرة التقنيع Stencil ...... انشاء المرايا بواسطة ذاكرة التقنيع Stencil سنقسم الموضوع إلى ثلاثة اقسام : اولا: انشاء المشهد مع المرايا .. سنقوم بأنشاء اي مشهد , وعلى سبيل المثال قمت هنا بأنشاء غرفة تحتوي جدرانها على ارقام واحرف , وقمت بإنشاء صندوق خشبي ووضعته بمنتصف الغرفة , وفوقه ابريق شاي .. بعد ذلك انشأنا مجسم كسوناه بخامة ثلجية لتمثل لنا جسم المرآة . سنقوم بجعل هذه المرآة تعكس ابريق الشاي فقط اذا كان امام هذه المرآة اما اذا كان امام الجدار فإنه لاينعكس . ثانيا : انشاء المرآة اولا نقوم بملأ ذاكرة 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,0x1);
Device->SetRenderState(D3DRS_STENCILMASK,0xffffffff); Device->SetRenderState(D3DRS_STENCILWRITEMASK,0xffffffff);
Device->SetRenderState(D3DRS_STENCILFUNC,D3DCMP_ALWAYS);
Device->SetRenderState(D3DRS_STENCILFAIL,D3DSTENCILOP_KEEP); Device->SetRenderState(D3DRS_STENCILZFAIL,D3DSTENCILOP_KEEP); Device->SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_REPLACE);
Device->SetRenderState(D3DRS_ZWRITEENABLE,false); Device->SetRenderState(D3DRS_ALPHABLENDENABLE,true); Device->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ZERO); Device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);
Device->DrawPrimitive(D3DPT_TRIANGLELIST,30,2);
Device->SetRenderState(D3DRS_ZWRITEENABLE,true); Device->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_DESTCOLOR); Device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ZERO);
Device->SetRenderState(D3DRS_STENCILFUNC,D3DCMP_EQUAL); Device->SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_KEEP);
D3DXPLANE plane(0,0,1,0); D3DXMatrixReflect(&R,&plane); D3DXMatrixTranslation(&T,Tr.x,Tr.y,Tr.z); W=T*R; Device->SetTransform(D3DTS_WORLD,&W);
Device->Clear(0,0,D3DCLEAR_ZBUFFER,0,1,0); Device->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW);
Device->SetRenderState(D3DRS_STENCILENABLE,false); Device->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW); Device->SetRenderState(D3DRS_ALPHABLENDENABLE,false);