الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تعلم Direct3D الجماعي .. الجزء الثاني

مغلق
بدأه HGB في 18 سبتمبر 2004 · 6 رد · 2,740 مشاهدة · في DirectX
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ..

.......................................

رابط التعلم الجماعي الأول هنا :

/index.php?showtopic=37155

......................................

هاقد عدنا من جديد ,, آخر ماوصلنا اليه المرة السابقة ,, هو رسم مثلث ذو ألوان باهرة فقط ,, لكن صدقوني ان لم نتحرك بشل أسرع وبخطوات أكبر فلن ننجز شيئا ,, أمر آخر أني أريد أن أطور مهاراتي في الأمور التي استجدت في عالم Dierct3D ,, لذا سنبدأ فورا بتحميل النماذج ثلاثية الابعاد المعدة مسبقا ,, وفي المرة القادمة ,,"بعد الشرح طبعا " سننشيء نماذج Meshs خاصة بنا وبشكل ديناميكي في البرنامج ونستخدمها أيضا ,,

teapot_2.jpg

الفرق بين النماذج التي يجب أن تكون جاهزة ومصممة مسبقا وبين النماذج التي يمكننا تصميمها في البرنامج ,, هي أننا نصمم وفقا لمعادلة معينة في البرنامج ,, يعني يمكن أن نصمم كرة بشكل ديناميك ,, مربع مكعب مخروط ,, أو أي شكل منتظم يمكننا تحديد علاقة رياضية له ,,

يمكن مثلا أن نصمم لولب على شكل حلزون ,, باستخدام معادلة وسيطية باحداثيات :

sin x و cos x و z تكون كما هي ,,

المثال المرفق لتحميل نموذج براد شاي فقط ,, وتغليفه بصورة سيارة ,, وهي car.jpg موجودة في مجلد المشروع ,,

قبل تشغيل المشروع يجب أن يكون لديك ال DirectX9 ال Run Time ,, وليست ال SDK هذا فقط لتشغيل الملف DirectX9Application1.exe ,,, ليعمل المثال ,,

حرك الأسهم يمين شمال فوق تحت ,, وستجد أن البراد يتحرك ,,

لتطور في المشروع يجب أن يكون لديك ال SDK الخاص بالتطوير الموجود في رابط المصادر هنا في القسم ,,

خذ المثال واستعد للشرح بعد قليل ..

3D_TeaPot.rar

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#2

المثال يعمل ويبدو انه دسم جدا :)

بإنتظار الشرح

برمجة الجرافيكس والألعاب والوسائط المتعددة

=====================================

لقد توفي اخيكم على الدعيج ثالث ايام عيد الفطر 1425 ... ادعو له بالرحمه والمغفره ... إدارة المنتدى .

=====================================

#3

السلام عليكم ,,

المثال أعلاه لايحمل نموذج لملف 3ds وهو امتداد ملفات ال 3dMax بشكل مباشر ,, بل تتم عملية تحويلها أولا لملف x. ,, ال X Files هذه يمكن لل Direct3D أن يتعامل معها مباشرة ,, بمكتبة مساعدة مضافة لل Direct3D ,, وهي مجموعة دوال وبنى تبدأ ب D3DX مثلا D3DXLoadMeshFromX لتحميل نموذج من ملف x File , الأمر سهل فقط دالة واحدة ,,

وأيضا D3DXCreateTextureFromFile لتحميل texture لتغلف به مجسم 3d ,, أيضا دالة واحدة فقط لتحميل ال texture ,, لكن تبقى طريقة تفليفها على الكائن أو المجسم ,, ولها طرق سنقابلها لاحقا ,,

....................

الآن قبل أن نبدأ ,, سبق وذكرت لكم أنه يوجد Wizard يتم تثبيته في ال visual Studio عند تثبيت ال DirectX SDK ,, هذا ال Wizard هو الذي سنتستخدمه دائما في كل المشاريع ,,

لو حملت المشروع المرفق في الرد السابق ,, ستجد طن ملفات ,, كلها ليس له معنى سوى ملفين فقط ,, وهما DirectX9Application1.cpp و DirectX9Application1.h ,, فقط ,,

باقي الملفات بها فئات مساعدة مريحة جدا في عملة تطوير برنامج لل DirectX ,, ويمكن تشبهه تماما ببرمجة ال MFC الابتدائي من ال Wizard حيث ال MFC تعطينا ملفات جاهزة في المشروع بغرض أن نعدل ونضيف عليها ,, ونستفيد من بنيتها التحتية لتسريع عملية التطوير ,, فيمكن أن نعتير ال Wizard كال MFC تماما ,,

لذا من اليوم لن نطور أي مشروع الا بالاعتماد عليها ,, وسأذكر أين يجب أن نضيف بيناتنا في ملف DirectX9Application1.cpp ,, وماذا سيحدث بعدها ,,

.........................

في ملف ال DirectX9Application1.cpp عندما ينتهي ال wizard مباشرة سنجد الدوال التالية سأذكرها مع التوضيح :

WinMain :

وهي طبعا نقطة ابتداء البرنامج ,, ولاحظ للبساطة داخلها والدالة Create الموجودة في الفئة CMyD3DApplication ,, والتي ستبدأ لنا حلقة الرسائل الخاصة بالبرنامج الرئيسي ,,

ويجب أن تعرف ان الفئة الخاصة بمشروعك دائما هي CMyD3DApplication ,, وترث من الفئة CD3DApplication ,, التي بها حلقة الرسائل التي ستحرك البرنامج الرئيسي ,, وستكون بعيد عن تفاصيلها كليا لتركز في عملك لتطوير ال DirecX فقط ,, حيث أن الدالة Creat موجودة أصلا في الفئة CD3DApplication لكن لاحظ أن كائن الفئة CMyD3DApplication يمكنه الوصول اليها , والسبب طبعا أنه يرث من الفئة صاحبة الدالة وهي CD3DApplication ,,

....................

الدالة التالية :

المشيد :CMyD3DApplication : والمهدم ,, ولايحتاجان لتعريف ,,

...................

الثلاث دوال التي تليها وهي :

ReadSettings و WriteSettings وConfirmDevice الاولى والثانية من اسمها تكتب اعدادات في الرجستري ويمكن تخصيصها لبرنامجك وحفظ اعداداته عند التشغيل المرة التالية ,,

اما الدالة ConfirmDevice ,, من اسمها للتحقق من امكانيات بطاقة العرض الحالية أو امكانيات أي جهاز آخر ,, حسب نوع البرنامج ,, مثلا ستكون كرت الصوت في حالة برنامج DirectSound ,, أو عصى ألعاب Joystick في حال استخدام DirectInput,, ولن ندخل في تفاصيلها قريبا ,,

.................

الدالة : InitDeviceObjects :

وهي احدى الدوال المهمة ,, وفيها نمهد لل Objects التي سنحتاج لتشغيلها من البداية ,, أمثال ال VertexBuffers لتحميل المضلعات الخاصة بكائن معين أو ال Meshs الخاصة بكائنات أو ال Textures أو ال PixelShaders وال VertexShaders ,, وكل هذه الأمور ,, لاتجزع من هذه المصطلحات سنزورها لاحقا باذن الله ,,

لاحظ في المثال أن بنيت في هذه الدالة كلا من ال Mesh الخاص بالمثال هنا وهو براد الشاي ,, وال Texture الذي سأغلف به البراد لاحقا وهي صورة السيارة ,,

....................

RestoreDeviceObjects :

في هذه الدالة نغير كل الاعدادات الخاصة بوضعيات التلوين والرسم التي ستحدث وفقا لتفاعل المستخدم مثلا أو بطريقة آلية ,,

مثلا اذا أردنا زيادة شدة الضوء المحيطي أو انشاء نوع ضوء جديد وتفعيله ,, أو اغلاقه وتغيريه بضباب مثلا أو فعل أي شيء يتطلب تغيير أوضاع الرسم RenderState ,, فسنضيفها هنا ,,

....................

الدالة :FrameMove

وفيها نغير أوضاع الكميرات واحداثيات الاجسام وعمليات الاسقاط ,, وكل شيء يمكن أن يحدث لكل frame ,, يعني مثلا عمليات الدوران لمجسم البراد موجوده هنا حسب تفاعل المستخدم مع لوحة المفاتيح ,,

ودوال الدوران هي D3DXMatrixRotationX و D3DXMatrixRotationY وكما تلاحظ من الاسم واحدة للدوران حول محور X والآخر حول محور Y ,,

ثم نستدعي الدالة D3DXMatrixMultiply لضرب المصوفتين التي تحملان معلومات الدوران لكل من المحورين ووضع الناتج في مصوفة العالم ,, والتي ستحول المجسم وتديره في الفراغ ,,

أخيرا نستدعي الدالة SetTransform لعمل التحويل لكي يضعه الملون Render Device في الحسبان لعملية التولين التالية لكي تظهر على الشاشة ,, حيث أن عمل التلوين Render تضاف معلوماته في الدالة التالية ,,

............

الدالة :Render

وهي أهم دالة للبيئة التطوير هذه ان صحت التسمية ,, فيها الدالة التي تظهر كل شيء على الشاشة وهي Present ,, لكنها ليست الدالة التي تفعل الأفاعيل ,, حيث أن الدالة present مهمتها عمل ال Flip أو القلب بين المكدس الأمامي والمكدس الخلفي فقط ,, لاظهار المحتويات النهايئة بعد عمليات التحويل والاضاءة والقطع والاسقاط وضرب المصفوفات وكل هذه الأمور ,, وهذه الأفاعيل تسمى بال PipeLine ,,اذن اين تتم كل هذه الأفاعيل ؟

تتم كلها في الدالة DrawPrimitives وهي غير واضحة في مثالنا لأننا لم نتعامل بال VertexBuffer بشكل مباشر ,, لكن سنمر على هذه الدالة لاحقا ,,

هنا سنلون ال Mesh فقط الذي حملناه سابقا في الكائن m_newMesh من النوع CD3DMesh ,,

وأضفنا اضاءة لتضيء الوجه الذي نراه في البراد ,, لكي نرى البراد !! لأن البراد يعكس الضوء النابع من المصدر على أعيننا وهكذا سنراه ,, والبراد يعكس الضوء لأننا غذينها بمعلومات النواظم Normals لكل سمت في البراد "حيث هي في الاصل من المجسم المصمم مسبقا" ,, وسنمر على هذا المفهوم باذن الله ,,

لاحظ أيضا أن كل عمليات طلب الرسم والتلوين Render موجودة بين بلوكين للدالتين

 m_pd3dDevice->BeginScene()

والدالة

 m_pd3dDevice->EndScene() ,,

ملاحظة أخرى أن البرنامج يمكنك من عملية رسم الجسم الخارجي فقط للمجسم البراد أي السموت فقط بالدالة

m_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);

ولو حولناها الى

m_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID)

فسيرسم كامل المجسم مع ال texture ,,

لاحظ أيضا للدالة :

m_pd3dDevice->Clear( 0L, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
                         RGB(25,70,30), 1.0f, 0L );

التي ستمسح كامل الشاشة استعدادا للتلوين التالي ,,

...........................

الدالة MsgProc ,, وهنا نضيف الأحداث التي يمكن للمستخدم انجازها ونريد معالجتها وفقا لتحركاته فيها ,,

مثلا لاضافة عنصر لMenu ,, فقط نضيف المعرف الخاص بعنصر ال Menu هنا ونكتب الكود الذي سيحدث عن الضغط على زر ال menu الفلاني مثلا ,,

وهكذا مع كل رسائل الأحداث المتوقعة أمثال تحريك الماوس والضغط على زر الماوس وغيرها كل أحداث الوندوز التي يمكن لبرنامجك أن يحدثها ,,

................

أخيرا الثلاث دوال InvalidateDeviceObjects و DeleteDeviceObjects و FinalCleanup لعمليات تنظيف الكائنات والمتغيرات التي تم حجزها ,,

...........................

انتهينا من التعريف ببيئة التطوير ,, وترون أني شرحت بسرعة كبيرة والسبب أن أغلب هذه الأمور تحدثنا عنها سابقا في موضوع التعلم الجماعي الأول ,, الموجود رابطه في الأعلى في اول رد في هذا الموضوع ,,

لذا لن أشرحها مرة أخرى ,,

وفي انتظار مايمكن توضيحه أكثر حول انشاء ال Meshs أو ال Wizard لأننا سنتقدم خطوة اضافية يوم غد باذن الله ,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#4

ماشاء الله اخ هيثم :)

بحاول اتابع الموضوع لأنى لم ألحق الجزء الأول بالكامل، ولكن عندى سؤال عند تطبيق المثال بعد فترة (ومازلت اعمل على التطبيق) لاحظت انخفاض سرعة الجهاز بشكل ملحوظ وكأنه قد تم استهلاك 80% من طاقة المعالج..فهل المثال قوى للدرجة التى تسحب هذه الطاقة أم ان معالج كرت الشاشة ضعيف فلم يستوعبه؟

#5

ليس كذلك لكن المعالج يعمل بأقصى طاقته لزيادة عدد ال frames في الثانية وليس له حدود ,, يعني أنا أعرف أن عين البني آدم تلاحظ حتى 70 FPS والفائض لايهم ,, فمثلا يمكن أن تشغل مثال يعمل ب 400 FPS ,, وتشغله على جهاز آخر فيعمل ب 600 FPS حسب قوة كرت الشاشة والمعالج وسرعة الرامات والنواقل الأمامية وال Speed Bus ,,

لذا أي مثال Direct3D ,, سيأخذ كل طاقة المعالج ,, ماعدا المعالجات التي تعمل بتقنية ال HT أو التي تسمى بال Hyper Thrading ,,

وهي المعالجات من 3.06 من أنتل فما فوق ,, حيث تعمل كمعالجين فعليا ,, فالبرنامج سيستهلك أحدهما فقط متيحا قوة معالجة أكبر لتطبيقات أخرى ,,

لكنه سيقلل الأداء قليلا حيث أن سرعة المعالج فعليا ستنخفض للنصف ,,

وتوجد تقنيات أخرى لقليل سرعة استهلاك طاقة المعالج يمكن تبنيها ,, لكن في الغالب ماسنحتاج لأداء أكبر ,, وليس تقليل عدد ال Frames في الثانية ,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#6

السلام عليكم ورحمة الله وبركاته

أخي HGB :

لدي ثلاث أسئلة أرجو التكرم بالإجابة عليها :

1- حاولت تشغيل المثال فأعطاني 26 خطأ علماً أني قد عرف المكاتب التالية d3d9.lib d3dx9.lib winmm.lib

فهل يمكن أن يكون سبب هذه الأخطاءأني أعمل على النسخة VC++6 .

2- باقي الملفات الموجودة ضمن هذا المثال كيف يمكن الحصول عليها ( فعندما أصنع مشروع جديد لايضيف أي من هذه الملفات ).

3- هل الـ VC++.Net هي الإصدار السابع أم أن هناك إصدارآخر قبل الـ VC++.Net رقمه 7

وشكرا جزيلا .

- طريق الألف ميل يبدأ بخطوة -

- ألعاب من تصميمي:

المنقذ

/index.ph...st&id=91370

الأربع تربح

/index.ph...st&id=91369

المتاهة

/index.ph...st&id=91374

#7

انا على استعداد تام للمساعدة فى اى شىء يخص ال 3D and Game Programming وجاصة بالDirectX

Mohamed Meshref

Performance Engineer

SQL Server Engine Team

Microsoft Corporation

Redmond, Washington, USA

http://www.microsoft.com/sql/

Blog: http://www.mmeshref.com

هذا الموضوع مغلق.

مواضيع مشابهة