HGB

برمجة الجرافيكس DirectX

114 ردود في هذا الموضوع

أنتم اللي تعرفوا في الموضوع واللي تشوفوه مناسب اعملوه وأنا معاكم.

و يا ليت نبدأ بالتدريج وبأبسط مثال ممكن.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

أخي chik ,, الفكرة جيدة ,, لكن اذا أمكن يمكن أن نفتح موضوعا جديدا نضيف فيه مقدمة سريعة مع أمثلة مبسطة لبرمجة GDI ,, DirectDraw ,, لأنها فعلا ستضع الناس في طريق البداية الحقيقية ,, ونضع الرابط الخاص بها هنا ,, ونتابع هنا في ما يخص Direct3D ,, هذا في رأيي حتى لاتتداخل الامور ,, فما رأيكم ,,؟

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

نتابع ماتوقفنا عنده ,,

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

أما الان سنبدأ بال Teuturials ,, وهي موجودة افتراضيا في :

C:\DXSDK\Samples\C++\Direct3D\Tutorials\Tut02_Vertices

هذا المثال هو المثال الثاني في التمارين Teuturials ,, ولم أبدأ بالمثال الاول لأنه لايوجد به شيء لفهمه ,, فقط يقوم بعمل الشيء الرئيسي في أي مشروع Direct3D وهو انشاء ال Device ,, لذا سنأخذ المثال الثاني ,, وعلى بركة الله ,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

أولا شغل المثال بعد فتح ملف المشروع في المصرف وقم بتنفيذه ب F5 :)

ولاحظ أن المثال ليس الا مثلث واحد غريب الالوان ,, الان كيف حدث هذا ,,

لو رايت كود المشروع ستجد أول سطر

#include <d3d9.h>

هذا ملف الرأس الوحيد الذي نحتاجه هنا !! مع المكتبة d3d9.LIB ,, فقط ,,

لكن لماذا يوجد الكثير من المكتبات في مثال Lighting الذي تحدثت عنه في الموضوع السابق ,, السبب هو أننا لن نستفيد من المكتبات السابقة حيث أن مثالنا بسيط للغاية ,, وتوجد مكتبة كانت ستسهل العمل علينا وهي #include "D3DApp.h" ,

حيث يوجد بها كل الدوال اللازمة لابتداء نافذه Window خاصة بالوندوز ,, حيث أن هذه المهمة طويلة قليلا ,,

مهمة تجهيز النافذة Window موجودة في الدالة WinMain وهي مكافئة لتلك التي كنا نستعملها في برامج ال Console وهي main ,,

الدالة WinMain بالطبع هي نقطة بداية أي برنامج Windows على الاطلاق ,, حتى لبرامج ال Visual c++ وهي فئات ال MFC ,, عموما سنأخذ بعض الوقت لنعرف كيف يمكن انشاء نافذة وندوز وبشكل سريع ,, حيث أننا في الجلسات القادمة بع التمارين ,, لن نستخدم هذه الطريقة فسنقوم باستخدام الفئات الجاهزة المعرفة في ملفات الرأس كما في مثال Lighting ,,

اذهب الى الدالة WinMain ,, بداية لاحظ أنها تأخذ 4 بارمترات ,, في الحقيقة غالبا ماسنستفيد فقط من أول بارمتر ,, وهو من النوع HINSTANCE وهي عبارة عن بنية STRUCT معرفة مسبقا ,, والمتغير الخاص بها يملك تواجدا للبرنامج ,, بالمناسبة كل برامج الوندوز على الاطلاق تعمل بهذه الطريقة ,, يجب أن يكون لكل برنامج يعمل في الوندوز HINSTANCE خاص به ,, وهنا يقوم الوندوز بتمريره الى الدالة WinMain ,, حيث الوندوز هو من يهتم بتوزيعها ,,

الان السطر الاول :

WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                     GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                     "D3D Tutorial", NULL };
   RegisterClassEx( &wc );

ال WNDCLASSEX هي بنية أيضا STRUCT سنخزن فيها معلومات خاصة بالبرنامج لنقوم بتمريرها لاحقا للدالة CreateWindow التي ستنشيء لنا النافذة ,,

HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 02: Vertices",
                             WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
                             GetDesktopWindow(), NULL, wc.hInstance, NULL );

هذه الدالة هي التي ستنشيء لنا النافذة ,, لاحظ البارمتر الثاني وهو النص الذي سيتم عرضه في النافذة الخاصة ببرنامجنا ,, المتغيرات 4و5و6و7 بها معلومات عن موقع الزاوية اليسرى العليا للبرنامج وطول وعرض البرنامج ,, ثم البارمتر 8 وهو GetDesktopWindow() ,, وهي عبارة عن دالة تعطي مؤشرا للنافذة الخاصة بال DeskTOP ,, يمكن التغاضي عنه وتمرير NULL بدلا منه وسيعمل البرنامج أيضا ,, أخيرا البارمتر قبل الاخير فيه معلومات خاصة بالبنية WNDCLASSEX الذي تم انشاءها قبل قليل وبها معلومات عن البرنامج ,, وأهم معلومة بها هي الدالة MsgProc ,, وهي قلب أي برنامج وندوز ,, وهي الخاصة باستلام الرسائل لكي تعالج بالطريقة المناسبة ,, الرسائل الخاصة بالوندوز هي تلك الرسائل الخاصة بالاحداث مثل تحريك الماوس نقر زر على الماوس نقر زر على الكيبورد ,, تكبير نافذه ,, والكثييير من رسائل الاحداث ,, عموما كل الاشياء تقريبا للتحكم بالوندوز يتم معالجتها في الدالة الخاصة بالتحكم بالرسائل ,, مثلا لو حرك المستخدم الماوس سينتقل البرنامج فورا الى الدالة MsgProc ويبحث عن المدخل الخاص بتحريك الماوس وهي الرسالة WM_MOUSEMOVE فاذا وجدها سينفذ الاوامر الخاصة بها أو يخرج من الدالة ,,

الان فلنذهب ونرى هذه الدالة ,, الدالة موجودة فوق الدالة WinMain مباشرة وتصريحها كالتالي :

LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )

البارمتر الاول من النوع HWND به معلومات عن النافذة التي حدث فيها الحدث مثلا تحرك الماوس ,, البارمتر الثاني به معلومات عن نوع الرسالة Message وهي من النوع UINT وال UINT ليس الا unsigned int !!! بدل كتابة هذه العريضة فقط اكتب UINT ,, المهم البارمتر الثالث والرابع بهما معلومات الخاصة بالرسالة ,, مثلا موقع ضغط الماوس وهكذا ,,وفي داخل الدالة تجد أمر switch عادي لتحويل البرنامج لينفذ الامر الخاص بكل رسالة ,, لكن هنا نجد الرسالة WM_DESTROY فقط ,, وهي تمرر للدالة MsgProc عندما ينتهي البرنامج ,, ولا يوجد المزيد ليعالج هنا ,,

اخر أمر يجب ملاحظته وهي الحلقة while الموجودة في الدالة WinMain ,, هذه الحلقة ستستمر حتى يتم تمرير الحدث WM_DESTROY عند اغلاق البرنامج ,, وبستلمها الدالة MsgProc لتمررها مرة أخرى لحلقة الرسائل ,, وتجد الرسالة WM_QUIT وهو الاستثناء الخاص بالدخول في حلقة الرسائل ويتم الخروج من الحلقة while وينتهي البرنامج !! ,, الحلقة كالتالي :

// Enter the message loop
           MSG msg;
           ZeroMemory( &msg, sizeof(msg) );
           while( msg.message!=WM_QUIT )
           {
               if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
               {
                   TranslateMessage( &msg );
                   DispatchMessage( &msg );
               }
               else
                   Render();
           }

أخيرا لاحظ لأهم شيء يخصنا هما وهي الدالة:

Render();

هذه الدالة هي التي سترسم لنا المثلث ,, لكن كيف ؟؟

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

بالنسبة للدالة Render ,, لو اضطلعنا على كودها المصدري سنجد السطر الاول كالتالي :

لاحظو هنا بدأنا تعلم ال Direct3D ,,

g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

هذه الدالة clear مهمتها أن تقوم بتحديث الشاشة وتلوينها كلها بلون البارمتر الرابع ,, يعني بالعربي تقوم بمسح جميع محتويات الشاشة السابقة لترسم الحالية ,, هذه الميزة سنستفيد منها في النماذج المتحركة,, حيث في كل مرة سنقوم برسم الجسم بالوضعية الجديدة لكن بعد مسح الشاشة ,, بعدة frames في الثانية كهذه يظهر المشهد وكأنه يتحرك ,,,,,, في هذا المثال لايوجد شيء يتحرك ,, لذا يمكن أن نكتفي باستدعاء الدالة Render مرة واحدة فقط ,, لكن مايحدث فعليا أنه سيتم استدعاءها مرارا داخل حلقة الرسائل ,, وهي فكرة رائعة والسبب في ذلك أنه اذا تم تكبير أو تصغير الاطار ,, فسيتم استدعاء Render لتعيد رسم الشاشة بالطريقة المطلوبة ,, لحسن الحظ ال Device الخاص بال Direct3D ذكي بما فيه الكفاية ليرسم السموت بطريقة تتناسب مع احداثيات الشاشة ,,

الان فلنخطو الى الامام زيادة ,,

g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
       g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
       g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );

دعك من الدالتين SetStramSource و SetFVF الان ,, فقط ركز في الدالة DrawPrimtives ,, هذه الدالة DrawPrimitive هي الاهم على الاطلاق في Direct3D ,, لأنها هي التي تقوم بعمليات تشبيك ورسم البيانات التي ستعرض على الشاشة في الذاكرة ,, هي لاترسم على الشاشة ,, لكن فقط تجهز البيانات على الذاكرة ,, لتقوم الدالة Present بعرضها على الشاشة ,,

لكن ماوظيفة DrawPrimitive ,, اذا فهمنا هذه الدالة بالشكل الصحيح سنفهم Direct3D بأكمله !! لذا يستحيل شرحها مالم نوضح أمورا أخرى ,, لكن كل ماعلينا فهمه هنا ,, هو أول بارمتر ممرر للدالة وهو هنا D3DPT_TRIANGLELIST ,, مامعناها ؟

هذا البارمتر يبلغ الدالة كيفية تشبيك السموت المعرفة لكائن معين ,, حيث السموت هي التي تمثل الكائن نفسه ,, وهي هنا 3 سموت وهي رؤوس المثلث الذي سيعرض ,, لكن أين تم تعريف احداثيات ومعلومات هذه السموت ؟

تم تعريفها في أعلى ملف المثال ,, ونرجع اليها في الجلسة التالية ,,

المهم هذه الدالة الطريقة D3DPT_TRIANGLELIST تبلغ الدالة أن طريقة ربط السموت وهي عبارة عن نقاط أو يمكن أن تقول رؤوس في مثلثات ,,(" لكن من الافضل تخيلها كنقاط ,,") ,, طريقة الربط سترسم خطوطا توصل هذه السموت معبعضها ,, وتقوم في النهاية بتوصيل أول نقطة مع اخر نقطة ,,

توجد بارمترات أخرى وهي :

  • D3DPT_POINTLIST
  • D3DPT_LINELIST
  • D3DPT_LINESTRIP
  • D3DPT_TRIANGLELIST
  • D3DPT_TRIANGLESTRIP
  • D3DPT_TRIANGLEFAN

كل واحدةمن هذه الطرق تبلغ الدالة عن طريقة ربط السموت ببعضها ,,

D3DPT_POINTLIST الاولى تقوم برسم نقط فقط لكل سمت ,,

D3DPT_LINELIST : توصل كل سمتين بخط مستقيم ,, فقط كل سمتين ولاتقوم بتوصيلهم جميعا ,,

D3DPT_LINESTRIP : توصل السمت بالذي يليه بخط مستقيم ,, لكن لاتوصل أول سمت بآخر سمت ,,

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

ملاحظة أخيرة قبل أن ننتقل لاخر دالة سنشرحخها في هذه الجلسة ,, وهي أن الدالة DrawPrimitive يجب أن تكون دائما بين الدالتين BeginScene و EndScene ,,

أخيرا لاحظ الدالة Present في آخر الدالة وهي لاتفعل سوى أنها تقوم بعملية تسمى قلب الصفحات أو Flipping ,, وهي التغيير بين المكدس الامامي والمكدس الخلفي في ذاكرة العرض ,, حيث أن المكدش الامامي هو الذي به البيانات الظاهرة على الشاشة ,, والبيانات التي يتم معالجتها من قبل الدالة DrawPrimitive موجودة في المكدس الخلفي ,, لذا لعرضها بالدالة Present فقط يتم عمل Swap بين الامامي والخلفي ,, وتظهر الصورة على الشاشة !!!

لكن ملاحظة كل الدوال التي تحدثت عنها أعلاه ,, لم يتم استدعاءها مباشرة بل استدعيت من قبل متغير وهو g_pd3dDevice الموجود في المثال ,, ماهذا المتغير ؟

سنعرف في الجلسة المقبلة ,, وسنتعرف أكثر أين تمت عملية بناء السموت الخاصة بالمثلث ومتى تم تعيين اللون اليها ,,

يستحيل شرح كل الامورالمتعلقة ب Direct3D هكذا ,, حتى الكتب الضخمة تركز على بعض الامور ,, لكن أقول يمكن الوصول لمستويات متقدمة للغاية بعد فترة نضال تدوم لمدة من الزمن ,, يجب من الان أن تتم مراجعة ال Documentation الخاصة بال SDK ,, حيث يوجد بها الكثير من الامور الموضحة ,,

أخيرا سأرفق كتاب DirectX in 24 Hour ,, وحجمه كبير نسبيا 5 ميجابايت ,, وسأقسمه الى قسمين على دفعتين ,, به أمور مختلفة لكن الامور الاخرى متشابهه ,,

ويجب من الان محاولة تخمين الكود الموجود ,, والاضطلاع على كل الاكواد ,, وعمل الكثير من التجارب في الامثلة ,, مثلا في هذا المثال حاول امسح بعض البيانات أو استدعاء لدالة في Render مثلا ,, أو امسح الامر BegineScene ,, وستتعلم أكثر ,,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ما شاء الله عليك أخي هيثم و جزاك الله ألف خير دروسك تمام و أنت تمام تعجز الكلمات عن الشكر و أصبحت لدي رغبة قوية بدراسة DirectX ( بالرغم أنها لم تكن بالخطة ) كله بسببك ..... بس هل ممكن أن ترسل لي كتاب

DirectX in 24 Hour

على بريدي

[email protected]أو

[email protected][email protected]

و مشكور كتير كتير على جهدك الواضح بشدة في المنتدى يعني بالحقيقة بدأ المنتى ينشط بعد فترة ركود قاتلة و لكن ما كان باليد حيلة

تم تعديل بواسطه C&DEL
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الله يعطيك العافية يعني أنا حاس إن راح أتعلم معاك بسرعة لأنه ما في شي غريب في البرنامج الأول.

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

طبعاً أنا أول مرة أشوفها و ما تعودت عليها علشان كذا يا ليت تستمر جلسة أو جلستين على هذا المثال حتى نتعود على الإجراءات. ولأنه أساس كل الرسومات المثلث.

و يا ليت في كل إجراء تشرح البارمترات:

لو غيرت أي قيمة ماذا يمكن أن يحدث؟ لو زودت القيمة بواحد أو نقصت وهكذا.

على أساس ما نرجعلها مرة ثانية في المستقبل.

أخيراً أحس إني مثقل شوي يعني (شحاد و يتشرط) بس أنا ودي أتعلم مضبوط فاستحملوا أسئلتي البدائية في المستقبل ومشكوريـــــــــــــــــــــــــن.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

و يا ليت في كل إجراء تشرح البارمترات:

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

طبعاً أنا أول مرة أشوفها و ما تعودت عليها علشان كذا يا ليت تستمر جلسة أو جلستين على هذا المثال حتى نتعود على الإجراءات.

ولايهمك ,, سنأخذ جلستين واذا احتجنا أكثر حتى نتأكد من فهم المثال الاول ,, بأفضل صورة ,, لأن الامثلة الاخرى كل مثال به أمور جديدة ,,

لكن أروع مافي هذا ال Direct3D ,, هو أن الدوال ليست كثيرة جدا !! لكن البارمترات التي تمرر لها كثيرة نوعا ما ,, لذا فعلا أهم شيء فهم البارمترات بصورة صحيحة ,, لكن كما ذكرت فهي كثيرة ويستحيل تحديدها كلها ,, رويدا رويدا سنفصل فيها ,,

أخيراً أحس إني مثقل شوي يعني (شحاد و يتشرط) بس أنا ودي أتعلم مضبوط فاستحملوا أسئلتي البدائية في المستقبل

اسئل كما تشاء وستجدنا في الخدمة ,, :)

بس هل ممكن أن ترسل لي كتاب

سأرفع الكتاب الى المنتدى هنا ان شاء الله على الكثير في اليومين التاليين ,, ولايهمك ,,

سأعود بعد قليل لشرح باقي البرنامج ,, حتى نأخذ الاسئلة المهمة بعدها ,,

بالتوفيق ,,

تم تعديل بواسطه HGB
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

أريد أن أتكلم على ما عرف بالطلاسم.

هده ليست إللا طريقة برمجة نافدة مثل جميع النوافد التي نشاهدها ما عدى نوع dialog Box .وسأعطي غدا إن شاء الله مثالا عن هدا ولنعرف أن هدا ليس مرتبطا لا معى Directx أو أي شيء آخر بل هو ما نكتبه عندما نريد برمجة نافدة وندوز.

سأحاول إعطاء مثال يكون فيه إيقونة و Menu حتى نعرف الخطوات المتبعة لإضهار النافدة وكيف ستتعامل مع مختلف الرسائل ومادا سيحدث لو غيرنا ما يمكن تغييره كما قال الأخ CompuMan.وأضن أن هدا شيء أساسي في البداية رغم أنه يمكن أن نمر عليه ونستدعي نافدة مكونة سابقة من MFC وهي أيضا يمكن أن نعمل عليها DirectX ولكن أضن أن التعلم الأساسي هو الأفضل لأنه بعض المراة نحتاج بعض التفاصيل وهده نجدها بسرعة وبفهم كامل عندما نكون نحن الدي أنجزناها وليس هناك شيء آخر صنعها لنا.

وإلى اللقاء إن شاء الله.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

والثاني لتكون مرجعا لمن يرغب في تلك الامور ,, ولايريد معرفة شيء عن ال DirectX ,,

وفقك الله ,,,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

آسف تأخرت كثيرا هذه المرة ,, لأنني كنت أكتب لمدة 3 ساعات متواصلة !!!

المهم دعونا لانكثر الحديث وندخل للموضوع ,,

,,,,,,,,,,,,,,,,,,,,,,

في شرح التمرين السابق وهو تمرين المثال Vertices السموت لم نتناول الا بعض الدوال ,, شرحت بعض الامور الاساسية الخاصة ببرمجة الوندوز ,, وتطرقت للدالة Render المكتوبة من قبل المستخدم وبها استدعاءات لدوال خاصة بال Direct3D ,, أمثال DrawPrimitive ,, سنبدأ هذه المرة من أول المثال لنتعرف على بقية الامور ,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

صورة المثال وهو يعمل :

Triangle.jpg

في أول المثال يوجد ملف الرأس :

#include <d3d9.h>

به كل الامور المتعلقة بال Direct3D التي نحتاجها ,,

ملاحظة مهمة : لايوجد في هذا المثال أي أمر يخص ال DirectDraw مطلقا ,, حيث تم تغليفها داخل ال Direct3D من الاصدارة الثامنة ,, لكن يمكنا أن نستخدم ال DirectDraw بشكل مباشر ,, لكن ليس الان ,,

المهم بعد السطر أعلاه يوجد الكود التالي :

LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering device
LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL; // Buffer to hold vertices

هذه الثلاثة أسطر مهمة جدا ,, وفيها تعريف الكائنات التي سنستعمل بها مستعمرة ال Direct3D بأكملها ,, يوجد غيرها لكن هذه تغطي حوالي 60 % من ال Direct3D ,,

السطر الاول : LPDIRECT3D9 ,, وبها تعريف الكائن الاول الذي يجب انشائه في جميع برامج ال Direct3D ,, لنستطيع أن ننشيء منه ال Device لاحقا كما سنرى ,,

حتى الان نحن فقط صرحنا عن المتغير الخاص ب Direct3D وهو g_pD3D ,, لكننا لم نكون التواجد الفعلي له بعد ولم نملأه بالمعلومات ,, سنرى كيف نكونه فعليا بعد قليل ,,

السطر الثاني : LPDIRECT3DDEVICE9 ,, هذا أهم كائن على الاطلاق في ال DirectX كلها ,, يجب الانتباه اليه ,, وهو الكائن Device ,, هذا الكائن هو الذي يقوم بكل العمليات المهمة للتلوين وانشاء ال Buffer الخاصة بالسموت وأغلب العمليات في المثال تم استدعاءها بال Device وهو هنا g_pd3dDevice ,, لكننا أيضا قمنا بتصريحه فقط ,, لكن لم نوضح كيف تم ملأه بالمعلومات والبيانات ,, سنعرف بعد قليل ,

السطر الثالث : LPDIRECT3DVERTEXBUFFER9 ,, وهو الكائن الذي سننشئه ونملأه بمعلومات السموت Vertices ("مفردها سمت Vertex ,,تمام :) ") ,, هذه السموت هي الاجسام التي سيقوم ال Device بتلوينها وعكس الاضواء عليها وتحويلها في الفضاء الثلاثي وبترها وأخيرا عرضها ,, هذه السموت هي التي تمثل رجل كامل مثلا في لعبة ثلاثية الابعاد ,, وهي أيضا كما في مثالنا البسيط المثلث ,, حيث يحتوي هذا المثلث فقط على 3 سموت ,, وموقع كل سمت كل رأس في المثلث ,, وأيضا لم نملأ المعلومات وسنملأها بعد قليل !!

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

الان لنتقدم مرحلة أخرى لنجد السطور التالية كالتالي :

struct CUSTOMVERTEX
{
   FLOAT x, y, z, rhw; // The transformed position for the vertex
   DWORD color;        // The vertex color
};

هنا سنعرف نحن البنية الخاصة بعلومات السموت !! مامعنى ذلك ؟

عرفنا أن السموت يمكننا أن نعتبرها رأس من رؤوس مثلث ,, لكي نرسم هذه النقاط ويتم تشبيكها بطريقة معينة مثلا D3DPT_TRIANGLELIST في الدالة DrawPrimitive ,, كما هو في مثالنا ,, يجب أن نعطي هذه النقاط معلومات ,, أول معلومة وهي الاساسية لكل أنواع السموت بالطبع هي الموقع ,, أين تقع هذه النقطة ,, وبالطبع في الفضاء الثلاثي الابعاد ,,XYZ ,,

وهي هنا ال float x ,y ,z ,, لكن ماذا عن ال rhw ؟؟

هذه ال rhw تسمى اللاتجانس لم أتأكد من معناه تماما ,, لذا سنؤجله قليلا ,, لكن ماقرأت سابقا أن قيمته غالبا مايجب أن تساوي 1 ,, سنعود اليه لاحقا ,,

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

هنا عرفنا البنية فقط التي ستحتضن معلومات السموت التي سنضعها في ال Buffer ثم نمررها لل Device ليقوم بتلوينها واجراء عملياته عليها ,,

لكن هل هذه المعلومات الموقع واللون واللاتجانس كافية ؟ الاجابة في مثالنا هذا نعم كاقية تماما فلا نحتاج لغيرها ,, لكن في الامثلة الاخرى قد نستغني عن بعضها وقد نزيد فيها ,, مثلا في المثال الذي يلي مثالنا ,, وسنأخذه ربما بعد يومين أو ثلاث ,, لن نحتاج الى rhw ,, وفي مثال الاضاءة بعد 6 أيام أو أكثر سنحتاج لأمر اخر ,, وهي معلومات ناظم السمت ,, التي تحدثت عنها في مثال الاضاءة ,, التي تحدد اتجاه انعكاس الضوء من السمت ,, لكن كل شيء في وقته ,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

السطر التالي :

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

هذا الامر define المألوف لدينا ,, وسنقوم فيه بتعريف المتحول الثابت D3DFVF_CUSTOMVERTEX على أنه يحتوي كل من D3DFVF_XYZRHW و D3DFVF_DIFFUSE ,, لأن هذا المتحول الثابت سنمرره كبارمتر عندما نبدأ بانشاء ال Buffer الذي سيحتوي على معلومات السموت ,, والسبب بالطبع لكي يفهم الملون ماذا نعني بالبنية التي أنشأناها التي شرحتها قبل قليل ,, والتي ستحوي أنواع المعلومات الخاصة بال Vertecis وهي البنية CUSTOMVERTEX ,,

لاحظ ل D3DFVF_XYZRHW وهي نوع بنية معرف مسبقا لدى Direct3D ومعناه أن بنية السموت ستحوي على معلومات الموقع XYZ وعلى معلومات اللاتجانس rhw ,,

D3DFVF_DIFFUSE : معناها أن بنية السموت ستحتوي على لون انتشاري وهي بالطبع اللون color المحدد في بنيتنا CUSTOMVERTEX ,,

ملاحظة مهمة جدا جدا : من الان اذا أردت أن تعرف مثلا ماهي الصيغ الاخرى اذهب فقط الى ال Documentation الخاصة بال DirectX9 والتي تمت اضافتها نع تثبيت ال SDK ,, واذهب الى Search واكتب مثلا D3DFVF_DIFFUSE وستجد معلومات عنها ,, ويجد كل الاوامر الاخرى التي يمكن استخدامها ,,

أخيرا ماهذا ال | الفاصل بين D3DFVF_DIFFUSE و D3DFVF_XYZRHW ,, معناها أن البنية المعرفة الجديدة ستحتوي على كلا النوعين من المعلومات ,,

والامر | معرف في لغة السي وهي من العوامل البتية ,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

لنتقدم أكثر ,, السطر التالي به تعريف الدالة :

 HRESULT InitD3D( HWND hWnd )

هذه الدالة كما من اسمها InitD3D ,, تمهيد Direc3D ,, لكن نمهد لماذا ؟,, هاقد بدأنا المرح ,, سنمهد لكائن Direc3D الاب ,, وال Device أيضا ,, أي سنقوم أخيرا باعطائهما المعلومات الازمة لكي نستطيع استعمالهما لاستدعاء الدوال الخاصة بهم ,,

كائن Direct3D هو الذي صرحنا له في الاعلى وكان تصريحه كالتالي :

LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDevice

حيث الكائن هو g_pD3D ,, وكائن ال Device صرح كالتالي :

LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // Our rendering device

والكائن هو g_pd3dDevice ,, لاحظ أن كلا الكائنين قد أعطيا القيمة الابتدائية NULL ليدلان على أنهما فارغان ,, حتى هذه اللحظة ولايمكن استخدامهما ,,

السطر التالي في الدالة InitD3D كالتالي :

 if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
       return E_FAIL;

الان سنهمل أمر if وسنهتم بالزبدة وهي :

g_pD3D = Direct3DCreate9( D3D_SDK_VERSION )

الدالة Direct3DCreate9 ,, والحمد لله حولت برمجة ال Direct3D الى جنة !! بكل بساطة أصبح الكائن g_pD3D يحتوي على المعلومات الصحيحة التي يمكن أن نبدأ باستخدامه منها بعد الان ,,

هذه الدالة Direct3DCreate9 اختصرت كل التعقيدات التي كان مبرمجو ال DirectX7 يستخدمونها ,, حيث كان يجب البدأ بانشاء كائن DirectDraw ,, بدالة غريبة طويلة مخيفة بعض الشيء ,, ثم بعد ذلك تصنيع كائن واجهة ل Direct3D من كائن DirectDraw باستخدام الدالة أو الطريقة الخاصة ب COM وهي QueryInterface ,, من الواجهة IUnknown الافتراضية ,,

لكن نحن في عصر الالفية الثالثة حيث التسهيلات ,, فقط لانشاء كائن Direct3D هنا سنتدعي الدالة Direct3DCreate9 لانشاء كائن Direc3D9 للنسخة التاسعة ,, لو أردنا انشاء كائن للنسخة الثامنة والتي لن نستعملها هنا ,, فقط للتوضيح سنستدعي الدالة Direct3DCreate8 ,, لكن يجب أن يكون الكائن على يسار علامة ال = من النوع LPDIRECT3D8 وليس LPDIRECT3D9 ,,,,,, المهم ماعلينا ,, فقط لانشاء كائن Direct3D استدعي الدالة Direct3DCreate9 ومرر على يسارها كائن من النوع LPDIRECT3D9 ,, تمام ,,

الان مالذي أدخل الامر if هنا ؟ مهمة ال if التحقق من أن كائن Direc3D قد تم انشاءه بسلام ,, حيث يمنع البرنامج من الاستمرار اذا لم يتم انشاء الكائن بشكل سليم,, السبب الذي يدعو لعدم انشاء الكائن بشكل سليم ,, أنا أعرف سبب واحد ,, وهو عدم وجود مكتبة الربط الديناميكي وهي d3d9.dll في أي مسار خاص بمكتبات الربط الديناميكي ,, بالعربي أي رسالة تظهر لعدم توفر مكتبة DirectX المطلوبة ,, من أي لعبة تم تنصيبها حديثا على الجهاز تتطلب مكتبات DirectX سببها هذا التحقق من انشاء الكائن بشكل صحيح ,, وتحديدا هذه ال if الموجودة !!

لاحظ لل return E_FALE ,, وهي قيمة الاعادة للدالة InitD3D ,, حيث أن هذه الدالة في الاصل ستستدعى من ال WinMain ,, يوجد أمر تحقق اخر في WinMain لاستدعاء هذه الدالة سيسبب في اغلاق البرنامج لو كانت قيمة الاعادة من الدالة InitD3D هي E_FALE ,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,

السطور التالية هي :

D3DPRESENT_PARAMETERS d3dpp;
   ZeroMemory( &d3dpp, sizeof(d3dpp) );
   d3dpp.Windowed = TRUE;
   d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
   d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

البنية D3DPRESENT_PARAMETERS بها كل المعلومات التي ستخص ال Device الذي صرحناه سابقا وسنعطيه معلوماته بعد قليل ,,

معلومات البنية D3DPRESENT_PARAMETERS كثيرة ,, لمعرفتها اذهب الى DirectX Documentation ,, واكتب D3DPRESENT_PARAMETERS في ال Search ستجد معلومات عن تعريف البنية الاساسي ,,

d3dpp.Windowed : اذا كانت قيمتها TRUE فمعناها أن نخبر ال Device ان البرنامج سيكون في Window أما ان كانت FALSE معناها أننا سننشيء البرنامج FULL SCREEN كما في ألعاب ال 3d تماما ,,لكن نحتاج لأمور أخرى لنجهزه ليعمل على FULL SCREEN ,,

d3dpp.SwapEffect : تهتم بطريقة عمل ال SWAP بين المكدس الامامي والخلفي ,, لن أفصل هنا الا لاحقا ,,

d3dpp.BackBufferFormat : معلومات عن بنية المكس الخلفي ,, ولن أفصل كذلك ,, لأن التفصيل يحتاج لكتاب ,, والسبب الاخر أنني لاأعرف الكثير من الامور هنا :) ,, لكن أعدكم أن هناك الكثير من القيم لن ستعملها محترفو برمجة ال Direc3D ,,

,,,,,,,,,,,,,,,,,,,,,,,,,,

السطر التالي ,,,

if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                     D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                     &d3dpp, &g_pd3dDevice ) ) )
   {
       return E_FAIL;
   }

به الامر الذي سيقوم بتحميل المعلومات المهمة لأهم كائن في ال Direc3D وهو كائن ال Device ,, المسمى لدينا g_pd3dDevice ,,

من اسم الدالة CreateDevice ,, واضح أنه لانشاء ال Deivce ,, لكن ما هذه البارمترات ؟ البارمترات ليست صعبة ولحسن الحظ واضحة وأغلبها قيم ثايته وهي كالتالي :

الاول : D3DADAPTER_DEFAULT ,, ويخبر الدالة عن وضعية العرض الخاصة بال Device ,, مثلا 800x600 وهكذا ,, يمكن تغيير وضعية العرض لكن بطرق أخرى ,, فهذا البارمتر يخبر ال Device أن تكون وضعية العرض فيه هي الوضعية الافتراضية حاليا ,, مثلا اذا كانت الكثافة حاليا 1024 * 768 فستكو كذلك لبرنامجنا !!

الثاني :D3DDEVTYPE_HAL ,, يخبر المصرف أن يستخدم الطبقة HAL ,, وهي طبقة خاصة بكروت الشاشة الشبه حديثة ,, توجد طبقات أخرى مثل RGB Emulation وال REF أو ال Refernce Rastarize ,, مشبك الاشارة ,,الذي تحدثت عنه سابقا ,,والذي يمكن الاجهزة من محاكاة عمليات كرت الشاشة على ال Processor ,, لكنها ستصبح بطيئة ,, وتمكن كل البرامج أن تعمل دون الحاجة لكروت شاشة حديثة ,,

الثالث: hWnd ,, وهو مقبض أو مؤشر للنافذه التي فيها برنامجنا ,, ولو تذكرنا من الجلسة السابقة أننا استلمنا هذا ال hWnd من الدالة CreateWindow التي استدعيناها في WinMain ,,التي أنشئت لنا النافذه الخاصة ببرنامجنا ,, اذن في البارمتر الثالث للدالة CreateDevice يجب أن نمرر مؤشر للنافذة الخاصة ببرنامجنا ,,

الرابع : D3DCREATE_SOFTWARE_VERTEXPROCESSING ,, لم أتأكد بعد منها ,, لكن للمراجعة أكثر اذهب لل Documentation ,, وستعرف أكثر كل القيم الاخرى ,,

الخامس : d3dpp وهو المتغير الذي قمنا بتعبئته قبل استدعاء الدالة ,و ولاذي كما ذكرنا يحتوي على معلومات تخص ال Device الذي سننشئه ,,

السادس والاخير : g_pd3dDevice وهو المتغير الخاص بنا الذي ستتم تعبئته بكل أطنان المعلومات السابقة ليصبح صالحا للعمل !!

بالطبع يوجد أمر تحقق if في استدعاء الدالة CreateDevice ,, للتأكد من أن المعلومات صالحة ,, أمر if في هذه الدالة مهم جدا جدا ,, ولايجب الاستغناء عنه نهائيا ,, لأن انشاء هذا ال Device أمر محفوف بالمخاطر ,, أي بارمتر غير صالح في هذه البارمترات سيفشل الدالة ,, لذا يجب توخي الحذر ,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

حتى الان نحن نتحدث عن الاساسيات في ال Direct3D وسننتهي قريبا منها ,, لنبدأ في المرح الحقيقي ,, لكن يجب أن نعمق فهمها ونركزها بشكل جيد ,, وأنا هنا أنصح بأن يكون تمرين لهذا المساء أن يتم كتابة برنامج ال Vertices الذي نتحدث عنه الان من أوله الى آخره حفظا !! الامر ليس صعبا باذن الله ,, حيث أن هذه الامور ستكون روتينية قريببا جدا ,, وسنستخدمها كما نكتب الدالة main في أي برنامج سي عادي ,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

أخيرا بقيت لنا آخر دالة في البرنامج وهي InitVB ,, لاختصار InitVertexBuffer ,,

السطر الاول بها :

CUSTOMVERTEX vertices[] =
   {
       { 150.0f,  50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color
       { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },
       {  50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },
   };

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

لاحظ للمتغير vertices يساوي ,, بيانات البنية CUSTOMVERTEX ,, حيث ترتيب هذه البيانات كما هو في تعريف البنية تماما الاو والثاني والثالث للاحداثيات XYZ والرابع لل rhw والخامس للون ,, حيث اللون هنا مكتوب بصيغة ستعشرية,, تمام ,,

لاحظ ن لدينا 3 سموت ,, ولاحظ أن في كل سمت القيمة الثالثة وهي احداث z يساوي 0.5 دائما ,,, لماذا ؟ هذا هو السبب الذي جعل المثلث المرسوم يبدو في بعد واحد حيث أن العمق هو 0.5 ,,

البارمتر الرابع يساوي كما ذكرت سابقا 1 دائما ,, والاخير هو اللون الخاص بكل Vertex ,, وهو كل رأس في مثلث ,, ورأس المثلث هو كل الزاوية ,, لذا فان اللون ينتشر من كل سمت ويتدرج ليبدأ بالتحول للون السمت الذي يقترب منه !!

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

السطر التالي :

if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
                                                 0, D3DFVF_CUSTOMVERTEX,
                                                 D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
   {
       return E_FAIL;
   }

وهنا أخيرا سنرفق المعلومات الخاصة بالسموت لنضعها في المكان المخصص لها وهو مكدس السموت ,, Vertex Buffer ,, يسمى هذا النوع من السموت المستخدم هنا في هذا المثال ,, مكدس السموت المرنة ,, حيث في نسخة Direct3D7 ,, كانت توجد أنواع أخرى معرفة وجاهزة ,, ولانحتاج فيها لكتابة نوع جديد بنا وتعريف Direct3dDevice به كما هنا الان ,, حيث أننا قمنا بتكوين نوع جديد وهو CUSTOMVERTEX الذي تم تعريفه في أعلى الملف ,, حيث يحتضن المعلومات الخاصة بالسموت ,, لكن في Direct3D9 ,, لاتوجد الا السموت المرنة ولاتوجد أنواع معرفة مسبقا ,, لذا دائما نعرف النوع الخاص بنا ثم نملأ بياناته ,, وأخيرا نستدعي الدالة CreateVertexBuffer ,, لتشحن لنا معلومات السموت من البينية المعرفة الى الكائن المتخصص بهذه الامور الخاص بالسموت المرنة فقط وهو LPDIRECT3DVERTEXBUFFER9 الذي عرفنا منه g_pVB كائن فوق في أعلى المثال ,, هنا في هذا ال g_pVB سنحتضن كل معلومات السموت الخاصة بالكائنات التي نريد عرضها !! ,, لكن أين ال Device من ذلك ؟ لقد قلت أن ال Device هو الذي يهتم بعمليات تشبيك السموت ,, لكن كيف والسموت موجودة في كائن آخر ونحن حتى الان لم نربط بين الكائن الذي يحتوي السموت وكائن ال Device بأي رابط ,, أقول الرابط قادم بعد قليل ,,

فلنعد للدالة CreateVertexBuffer بارمتراتها كالتالي :

الاول :يختص بالحجم الذي سنحجزه لكائن السموت لنملأ فيه البيانات ,, حيث القيمة الحالية 3*sizeof(CUSTOMVERTEX) ,, ومعناها 3 متغيرات من النوع CUSTOMVERTEX ,, وكما هو واضح هو عدد السموت التي قمنا بتعبئة معلوماتها ونريد حزمها في كائن السموت g_pVB ,,

الثاني : مهتم ببعض الامور المتقدمة قليلا ,, مثلا انشاء شيء يدعى بمكدس الروسمة Stencile Buffer ,, عموما الصفر سعين الشيء المطلوب هنا ,,لمعرفة باقي الصيغ راجع ال Documentation ,,

الثالث : D3DFVF_CUSTOMVERTEX ,, وهو النوع الذي قمنا بتعريفه في الاعلى بالمرشد define ,, في أعلى الملف ,, ومهمته اعلام مكدس السموت المرنة الذي ننشئه في هذه الدالة عن تفاصيل معلومات السموت كما وضحنا في الاعلى ,,,

الرابع : D3DPOOL_DEFAULT ,, يخبر ال Device الذي استدعى الدالة CreateVertexBuffer لانشاء مكس السموت أن يضع معلومات السموت في المكان الذي يجده مناسبا ,, اما في ذاكرة كرت الشاشة وان لم يجد يضعها في ذاكرة النظام Ram ,, ونعلم أنها لو كانت في ذاكرة كرت الشاشة ستكون أسرع بكثير ,,

عموما يمكن اجبار النظام أن يضعها في ذاكرة كرت الشاشة باستخدام D3DPOOL_MANAGED ,, توجد بارمترات أخرى لمعرفتها راجع ال Documentation ,,

الخامس : g_pVB ,, وهنا ستعبء معلومات السموت بكل التفاصيل أعلاه ,, ومن سيلونها ويقوم بتحويلها وعمليات الاضاءة وكل الحسابات المتعلقة بها ؟ بالطبع ال Device وهو الذي استدعى هذه الدالة التي أنشئت ال g_pVB ,, ولدينا هنا في المثال الكائنين ,, g_pd3dDevice لل Device و g_pVB لل Vertex Buffer ,,

السادس : لم يحدد بعد ,, لكنه محجوز للنسخ المستقبلية من Direct3D !!! لذا دائما نضعه NULL ,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

آخر شي في المثال والحمد لله هو :

VOID* pVertices;
   if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
       return E_FAIL;
   memcpy( pVertices, vertices, sizeof(vertices) );
   g_pVB->Unlock();

في أمر CreateVertexBuffer ,, فقط أنشئنا ال Buffer الذي سيحتضن البيانات الخاصة بالسموت ,, لكن بقي أن نعينها اليه ,, وهي كالتالي :

نذكر أن بيانات السموت قد جعلناها في متحولة تدعى vertices ,, وهذه ال vertices من النوع CUSTOMVERTEX في الاصل ,, لكن بنية السموت المرنة التي جعلناها هنا في مثالنا g_pVB التي ستحتضن بيانات السموت ,, لاتقبل سوى بيانات من النوع *void ,, لذا سنعامل معها بحجم عقلها ,, ونضع لها بيانات البنية vertices في متغير من النوع *void !! وهذ الامر كالتالي :

أولا ننشيء المتغير من النوع *VOID الذي سنضع في بيانات vertecies كالتالي :

VOID* pVertices

ثم سنجعل العلاقة بين مكس السموت المرن g_pVB والمتغير pVertices من النوع *VOID كالتالي :

 g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 )

لن أفصل في الامر Lock هنا ,, لكن لاحقا سأفصل ,, فقط ينبغي حفظه تماما كما هو هنا ,,

ثم :

    memcpy( pVertices, vertices, sizeof(vertices) );

وهو الامر الحقيقي الخاص بنقل كتل البيانات من أصلها vertices الى pVertecies ,, من النوع *VOID ,,

أخيرا :

g_pVB->Unlock();

الامر العكسي ل Lock وهو UnLock ,,

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

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

واقرأ كثيرا في ال Documentation ,, فهي سبيل الخلاص للكثير من الامور ,,

اذا فهمنا هذا المثال بشكل جيد ,, سنمضي بثبات في الامثلة التالية,,

أخيرا سأنتظر الاسئلة الدسمة ,, لأنه ان لم توجد أسئلة فمعناها لايوجد فهم ,, أو أن الفهم أكثر من اللازم ,, وسأكون أتعامل مع اخوان أنيشتاين وأنا لاأعلم ,,

بارك الله فيكم ,, والى الغد ,,

تم تعديل بواسطه HGB
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

أخي HGB في الفترة الأخيرة لم أستطع قراءة ماذكرتم عدا أول صفحة و التي تحتوي معلومات عن المطلوب للبدأ بالمشروع

لكن عندي تساؤل أنا نزلت DirectX9 من CD برامج تباع بالسوق عندنا بحلب و لقد كان تقرير WinXp هو كالتالي ( صورة مرفقة لمعلومات النظام و معلومات كرت الشاشة و رسالة الخطأ للبرنامج ) الا أن المثال الأول لم يعمل لدي فما هو السبب يا ترى ( مع الأخذ بعين الاعتبار بأن الانترنت عندي منزلية أي أحتاج حوالي النصف ساعة لتحميل ميجا واحد للكمبيوتر ) .

و أخيرا و ليس آخرا يوجد لدي سؤال هل توجد عندكم امتحانات بالكلية لأن امتحاناتي بدأت من اسبوع و لاتنتهي حتى 28/1/2004 و كما تعلم هندسة الميكانيك ليس لها علاقة بالـDirectX لذلك سأضطر مكرها على عدم المتابعة أول بأول لذلك أرجو منكم ( و خاصة HGB .. أبو ؟؟؟؟ - أنا أبو أحمد- ) أن تصبروا علي لأن مشاركاتي ستكون حسب معلومات قديمة نوعا ما الى أن ينتهي امتحاني ........ راجيا الرد و المشاورة

Desktop.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

أخي بشير كيف الحال ,, خذ راحتك في الامتحانات واياك أن تثقل على نفسك ,, سنستمر نحن الى أن يشاء الله ,, وبعد عودتك ننتظر أسئلتك :)

المهم لكل من جرب مثال Sprite الذي أرفقته في بداية المشروع ,, أنا آسف كان هناك ملف ناقص صورة ,, لم أضمنها ,و لذا كان المثال لايعمل ,, ليس للأمر علاقة ب DirectX 9 أو كرت الشاشة ,,

خذو المثال المعدل ,,

بالسلامة ياأبو أحمد ,, وأنا أبو ؟؟؟ كما ذكرت ,, لأني طالب لاحول لي ولاقوة :)

Point_SPRITE.rar

تم تعديل بواسطه HGB
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

سأحاول أن أصنع نسخة مضغوطة من ال SDK ,, حيث لاتتضمن على مل الامثلة الموجودة ,, فقط بها ملفات ال h. lib. وبعض الامثلة المهمة ,, بحيث ليتجاوز حجمها ال 10 ميجابايت وربما أقل ,, لتكون متاحة للجميع ,, وكل مانأخذ مثال جديد أرفق معه ملفات المثال ,,

بالتوفيق ,,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ما هي مشكلة المثال الأول؟!!!!!!!!

اشتغل عندي لمن حملته على طول.

ترى جهازي يستعبط ويخالف الأمور دايماً icon6.gificon6.gificon6.gificon6.gif

راح يجنني كأنه بني آدم حقيقي وعنده نية يطفشني.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الأخ هيثم .... أنا مش متزوج كما فهمت بس عندنا بحلب (سورية) أو ببلاد الشام بشكل عام نطلق الألقاب حسب اسم الأب افتخارا بالنسب لا أكثر أو أقل

تم تعديل بواسطه C&DEL
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اشتغل المثال و مشكور ....

مثال رهيب بالفعل .....

أنا بشتغل منذ فترة طويلة على 3D max و أتابع كل ما هو جديد ( عندي اصدارة 6 منه ) بهذا المجال و على فكرة يوجد سكريبت بالبرنامج يتيح لك كتابة مثل هكذا تأثيرات مرئية و لكن للأسف لا أعرف كيف بسبب عدم معرفتي ببرمجة Direct X

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

أخي CompuM4n : البرنامج الذي لايعمل ليس مثال الاضاءة ,, بل هو المثال الاول ,, لذي قلت أنه متخصص جدا ,, كان اسمه PointSprite ,, حيث حتى الان تحدثنا عن 3 أمثلة ,,

لاتخاف جهازك مافيه جن لو تخيلت لك ,, لكني أوافقك على أن كل شيء عندك يشتغل من المرة الثانية :)

أخي بشير :) أعلم أنك غير متزوج ,, فلم أسمع عن شخص تزوج وهو طالب حتى الان ,, وخصوصا في الدول العربية ("باستثناء بعض دول الخليج ")

ولايهمك باذن الله أو ماأكتشف اسما لابني الذي سيأتي الى الدنيا "أعوذ بالله من طول الامل :) " سأذكر لك أبو من أكون ,,

بارك الله فيك جميعا ,,,

أقول شيء جيد جدا أن يكون لدينا اثنين من من يتعامل مع 3dMax ,, لأن المفهيم والمصطلحات ستكون متقاربة ,, والفائدة الاخرى ,, أننا سنستفيد منكم في رسم نماذج ب 3DMax لنقوم بتحميلها لبرنامجنا والتحكم بها ,, ومن يملك القدرة على التعامل مع 3D MAX و Direct3D سويا هو ششخص متميز فعلا ,,

ومالذي يجري معكم الان ,,

تم تعديل بواسطه HGB
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

إلى الأخ HGB :

بصراحة ردك زاد مخاوفي لأن المثال PointSprites اللي حملته في أول جلسة اشتغل بمجرد ما نزلت DirectX9 وثبته.

أكيد جهازي مصاب بجنون الحواسيب. هذا مرض جديد بدأ مع الذكاء الإصطناعي يعني الكمبيوتر صار يستهبل علينا وما نقدر نسويله أي شي.

صار يشتغل على كيفه (ذكي)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

أهلين CompuM4n ,,

نسيت أن أقول لك ,, سيعمل المثال عندك أنت فقط والسبب في ذلك أنك قمت بتنصيب ملف ال Setup الخاص بال SDK ,, ومن الملفات المنصبة ملف الصورة المفقودة !! لكن من أين أتى بها هذا الجني !!

يبحث البرنامج دائما في مجلد البرنامج عن ال Resource فان لم يجدها توجه فورا للمجلد الافتراضي media الموجود في DXSDK ,, وسيجد بها كل مايريد لتشغيل المثال ,,

يبدو أن برنامج ال Setup هو الجني المفقود !!

باالتوفيق ,,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم وأعانكم الله.

كما قلت سابقا لقد قمت بإعطاء بعض المفاهيم والأمثلة عن كيفية برمجة النوافد والتي غالبا ما تستعمل في هدا النوع من البرمجة.

وها هو الرابط للإطلاع :

http://www.arabteam2000.com/ib/index.php?s...showtopic=37509

متمنياتي بالتوفيق للجميع وإلى اللقاء.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

أين الشباب ,, هل تريدون المتابعة ,,

بارك الله فيكم,,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أخي HGB أنا عن نفسي كل يوم أشوف الموضوع حوالي ثلاث مرات لأرى اذا في تغير بس المشكلة أني مبتدأ باللغة و أتعلم الأساسيات و لذلك أفضل أبقى متفرج أو متابع على الأقل أقرأ ما يكتب الى حين يمن الله علي بالفهم :)

تابع أخي الكريم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أنا متواجد معاكم دائماً

بس المشكلة الإمتحانات النهائية تبدأ يوم السبت القادم وراح أتفرغلها بشكل كامل

لكن بعد الإمتاحانات راح أرجع وأقرأ الموضوع وأشارك بأسئلتي البليدة.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

أخي cold0zero :

بارك الله فيك على اهتمامك بالموضوع ,, وكل شيء غريب في هذه الحياة عندما يبدأ يكون صعبا ومخيفا ,, لكن كل مامر عليه الزمن ,, كل ماأصبح روتينيا ,, وأمنى أن يأتي اليوم الذي نجد فيه آلاف مبرمجي DirectX الذين ينظرون للأمر بأنه روتيني لاأكثر ,, آمين :)

أخي CompuM4n :

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

لكن أتمنى أن ينضم الينا المزيد من الجادين ,, لنستطيع المتابعة بشكل أفضل ,,

كان الله في عونكم ,,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

مضى شهر منذ توقفنا آخر مرة ,,

هل يوجد جادين للمتابعة ؟

أنا موجود باذن الله .

تم تعديل بواسطه HGB
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أنا مستعد لعودة الموضوع ويمكنك أن تسجلني في الكشف (حاضر).

و كما تعلم أخي HGB إنه كل شي عندي جاهز للبدء

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أنا بإذن الله معكم و متابع الموضوع من بدايته :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .