---- عند تطوير برامج الرسومات، وخاصة برامج الرسومات ثلاثية الأبعاد، اخترت DelphiOpenGL لأنني شعرت أن OpenGL لم يكن معقدًا مثل DirectX. من حيث الشعور، لم تكن دلفي معقدة مثل C++ وكانت أكثر سهولة في الاستخدام. لذلك اخترت دلفي +. في هذه العملية واجهت (بالتأكيد) بعض المشاكل، وأود أن أعرب عن أملي في أن أتمكن من التواصل مع أصدقائي.
---- الأول هو التهيئة. أثناء التهيئة، يجب تنفيذ العديد من المهام: ① إنشاء جدول وصف الجهاز (سياق الجهاز). (ملاحظة: فيما يتعلق بالـ DC، تختلف ترجمات المواد المختلفة، مثل بيئة الجهاز، وجدول وصف الجهاز، وسياق الجهاز، وما إلى ذلك، لكنها لا تبدو مناسبة جدًا. سيكون أمرًا رائعًا لو كان هناك مترجم مثل Li Shanlan. حالة RC أدناه هي نفسها)②قم بتعيين تنسيق البكسل المقابل (PIXELFORMAT DESCRipTOR). ③قم بإنشاء جدول وصف العرض (سياق العرض). هناك عدة طرق للحصول على أو إنشاء جداول سياق الجهاز في دلفي. أبسطها هو الحصول مباشرة على سمة المقبض (Handle) لكائن اللوحة القماشية (TCanvas)، مثل:
DC: HDC؛ DC: = Canvas.Handle، يمكنك أيضًا استخدام وظيفة API GetDC للحصول على جدول وصف الجهاز. مثل: DC:=GetDC(Handle, DC);
---- يمكنك أيضًا استخدام الوظيفة CreateCompatibleDC أو BeginPaint..EndPaint (تحتاج إلى الانتباه إلى الفرق بينهما) للحصول على جدول وصف الجهاز. ومع ذلك، بعد استخدام جدول وصف الجهاز، يجب أن تتذكر تحريره أو حذفه لتحرير الموارد. بمجرد الوصول إلى جدول سياق الجهاز، يمكنك تعيين تنسيق البكسل المقابل. تنسيق البكسل هو نوع سجل يحتوي على بعض الحقول أو الحقول قليلة الاستخدام (على الأقل في الوقت الحالي). بعد اكتمال وصف تنسيق البكسل، قم باستدعاء الوظيفتين ChoosePixelFormat وSetPixelFormat لمطابقته وتعيينه مع جدول وصف الجهاز. مثل الكود التالي:
وظيفة SetupPixelFormat(var dc:HDC):Boolean;var ppfd:PPIXELFORMATDESCRIPTOR;npixelformat:Integer;begin New(ppfd); =PFD_DRAW_TO_WINDOW أو pfd_support_opengl أو pfd_doublebuffer ؛ ؛ ppfd^.cStencilBits:=0; npixelformat:=ChoosePixelFormat(dc, ppfd); إذا (nPixelformat=0) ثم ابدأ messageBox(NULL, 'choosePixelFormat Failed', 'Error', MB_OK); ; إذا (SetPixelFormat(dc, npixelformat, ppfd)= FALSE) ثم ابدأ messageBox(NULL, 'SetPixelFormat', 'Error', MB_OK); pfd: PixelFormatDescriptor؛ nPixelFormat: عدد صحيح؛ fillChar(pfd,SizeOf(pfd),0); مع pfd تبدأ nSize:=sizeof(pfd); cDepthBits:=32; iLayerType:=Byte(PFD_MAIN_PLANE); nPixelFormat:=ChoosePixelFormat(DC,@pfd); استخدم DescribePixelFormat للتحقق مما إذا تم تعيين تنسيق البكسل بشكل صحيح DescribePixelFormat(DC,nPixelFormat,SizeOf(pfd),@pfd); if (pfd.dwFlags and PFD_NEED_PALETTE) < > 0 ثم SetupPalette(DC,pfd);//SetupPalette هو وظيفة مخصصة }النهاية؛
----بعد اكتمال العمل أعلاه، من الأفضل تشغيله مرة أخرى والتحقق من قيمة nPixelFormat. عادة، يجب أن تكون هذه القيمة أكبر من 0، وإلا ستكون هناك مشكلة. لنفس الكود، يمكنني الحصول على القيمة الصحيحة أكبر من 0 على جهاز NT ولكن ليس القيمة الصحيحة على جهاز PWIN97 أو 98. ومع ذلك، لن تكون هناك مشكلة عند الترجمة، وبعد الترجمة على NT، يمكن أن تكون كذلك المستخدمة على الجهاز PWIN97. حان الوقت الآن لإنشاء سياق التظليل (RC). قم باستدعاء الدالتين wglCreateContext وwglMakeCurrent، كما هو موضح في المثال التالي:
RC: HGLRC; RC:=wglCreateContext(DC); wglMakeCurrent(DC,RC); wglMakeCurrent(0,0); if RC< >null ثم wglDeleteContext(RC);
---- الكود التالي مقتبس من مثال OpenGL في C++ Builder 4. يبلغ حجم البرنامج المترجم حوالي 300 كيلو بايت، في حين أن حجم البرنامج المترجم ضمن C++ Builder 4 هو 384 كيلو بايت.
---- < a href="061403-05.zip ">رمز البرنامج Zip 3KB
---- تم شرح وظائف OpenGL وتنسيق البكسل في البرنامج بالتفصيل في MSHelp في دلفي، ولا تجرؤ هذه المقالة على شرح المزيد.