K A S R A
13-09-08, 14:39
-------------------------------------------------------------------------------------------------------------------------
سلام :give_rose:
این پست پایان فعالیت من در PCNetwork عزیز هست .
حقیقتش اینه که دارم خودمو برای کنکور ارشد آماده می کنم . فکر کنم حداقل تا بهمن ماه درگیرش باشم .
ولی خب می خوام همه سعی و توانمو بذارم .
از همه مدیران و دوستان عزیز که توی این مدت همکاری چیزای زیادی ازشون یاد گرفتم , کمال تشکر رو دارم . :1. (21):
این مقاله رو برای درس گرافیک 1 به عنوان Document توصیفی پروژه آماده کردم به عنوان حسن ختام فعالیت در فروم تقدیم می شه به اعضای عزیز PCNetwork .:1. (40):
متن کامل مقاله به همراه فهرست و تصاویر و لیست منابع رو هم توی همین پست ضمیمه کردم . :great:
Ltema3 2a
موفق باشید
کسری:11():
---------------------------------------------------------------------------------------------------------------------------
آشنایی با اصول و مبانی برنامه نویسی DirectX
پيشگفتار
سپاس خدای را که ما را در راه علم و دانش توفيق داد. متنی که در اينجا تقديم می شود مقدمه ی کوتاهی است بر اصول و مبانی برنامه نویسیDirectX. نکته حائز اهمیت این است که پیچیده ترین بازیهای کامپیوتری با استفاده از همین اصول و مبانی توسعه پیدا کرده اند .
در حقیقت نباید کنسول های بازی رایانه ای و تجهیزات و سخت افزارهای پیچیده و پیشرفته ای که در دو دهه اخیر رواج داشته اند را با علمی که موجب پیدایش و ساخت و توسعه آنها شده است یکی بدانیم .
اما برای کسانی که آشناییشان با علم کامپیوتر بستگی خیلی نزدیک به چنین وسایل خاصی دارد , باید به وضوح و روشنی تفاوت میان وسایل و ابزار و علم پدید آورنده این تجهیزات بیان شود .
متن حاضر می کوشد تا بیانگر این تفاوتها باشد .
به نام خدا
DirectX
دیباچه :
بازی های کامپیوتری , برنامه های Multimedia و سایر برنامه های کاربردی گرافیکی برای اجرا شدن موفق و صحیح بر روی یک سیستم به طور مستقیم از واسط های DirectX و OpenGL استفاده می کنند . از این رو برای آشنایی با نحوه عملکرد برنامه های گرافیکی به ویژه بازیهای کامپیوتری آشنایی با DirectX اجتناب ناپذیر است .
در این جا به صورت کلی به معرفی ساختار و معماری DirectX و ارتباط آن با سایر اجزا نرم افزاری و سخت افزاری و همینطور با توسعه دهنده برنامه های گرافیکی و بازیهای کامپیوتری ( برنامه نویس) می پردازیم .
معرفی اجزا و Component های اصلی DirectX و شرح مختصر و در بعضی از موارد تفصیلی هر بخش را ارائه می دهیم .
مقایسه ای بین ورژن های مختلف DirectX که نشان دهنده پیشرفت بسیار سریع این تکنولوژی است و در آخرهم تا حدودی وارد بحث برنامه نویسی گرافیکی با توابع DirectX می شویم و امکاناتی که زبان های برنامه نویسی وIDE هادر اختیار توسه دهنده بازی می گذارند را بررسی می کنیم .
البته بحث برنامه نویسی با API های گرافیکی بسیار وسیع و متنوع می باشد که هدف ما فقط طرح مقدمه ای از این بحث و بیان نیازهایی است که برنامه نویسان در این بخش دارند .
برای بحث تفصیلی منابع معتبری در این مقاله معرفی می شوند که خواننده مشتاق از رجوع به آنها بی نیاز نخواهد بود .
همچنین مروری کوتاه بر اجزای اصلی OpenGL , تاریخچه , موارد کاربرد , ورژن های مختلف , نحوه عملکرد آن و در نهایت مقایسه ای بین OpenGL و DirectX خواهیم داشت .
تاریخچه :
سال 1995 همراه با ظهور ویندوز 95 شرکت Microsoft اولین نسخه از DirectX , DX 1.0را به بازار نرم افزار عرضه کرد . یک سال بعد یعنی 1996 نسخه جدیدتری از2.0DX معرفی شد .
در همان سال DX 3.0 به سرعت منتشر شد .
روند توسعه DX سیر صعودی خود را به سرعت طی کرد تا اینکه در سال 2002 نسخه 9.0 منتشر شد .
این نسخه برای اولین بار همراه با ویندوز xp از سوی Microsoft عرضه شد .
2 سال بعد 2004 با ورود کنسول XBOX 360 نسخه جدیدتری از DX 9.c تولید شد .
در سال 2006 نسخه فوق العاده قوی DX 10.0 همراه با ویندوز Vista انتشار یافت .
سرانجام در سال 2008 آخرین نسخه DX 10.1 از سوی Microsoft تولید و انتشار یافت .
در شکل زیر توسعه DX به خوبی نشان داده شده است .
Only the registered members can see the link
تعریف و بیان مفاهیم کلی :
تنوع زیاد سخت افزار و معماری های مختلف و همچنین سیستمهای عامل به عنوان بستری برای اجرای برنامه های کاربردی از یک سو و از سوی دیگر تلاش برای کسب رضایت کاربران باعث طرح و تدوین استاندارهایی از سوی سازمان های متولی استاندارد در صنعت کامپیوتر می شود .
گاهی اوقات هم بعضی محصولات موفق و همه گیر خود را به عنوان استاندارد جدیدی مطرح می کنند . و از این به بعد سازندگان دیگر باید محصولات خود را هماهنگ و سازگار با این استاندارد جدید تولید کنند .
نمونه ی بارز برای این نوع محصول , DirectX می باشد که از سوی Microsoft غول نرم افزاری دنیا ارائه شده است .
تعاریف جامعی از DirectX وجود دارد که هر کدام از دیدگاه خاصی DirectX را تعریف می کند .
دیدگاه Developer:
DX به عنوان مجموعه ای از Application Programing InterfaceAPI های گرافیکی است که شامل توابع و روال های از پیش تعریف شده است که می توان آنها را در برنامه نویسی به کار گرفت .
دیدگاه سیستم عاملی :
DX مجموعه ای است از توابع و روال های RunTime سیستم عامل در قالب فایل های .dll و .lib که در زمان اجرا در اختیار Application قرار می گیرد .
دیدگاه سخت افزاری :
DX مجموعه ای از توابع Low-level می باشد که برای اجرا شدن احتیاج به سخت افزار شتاب دهنده گرافیکی یا Graphics Accelerator مناسب با توان اجرای دستورات گرافیکی پایه , دارد .
در کل می شود گفت : DX مجموعه ای ازInterface های گرافیکی است که در قالب فایل های .dll و .lib در ویندوز قرار گرفته اند و توسط Microsoft ساخته شده اند و برای اینکه در برنامه نویسی بتوانیم از این Interface ها استفاده کنیم , Microsoft در DirectX API امکان دسترسی به توابع DirectX رو فراهم کرده است .
تعریفی که Microsoft از DirectX ارائه می کند :
DirectX
Microsoft DirectX is a collection of industry-leading graphics technologies designed to deliver the most advanced, stable, and visually impressive graphics experience on Microsoft platforms. DirectX is comprised of best-in-breed runtime technologies, developer tools, graphics programming interfaces and languages. The DirectX standard is supported by a wide variety of consumer and workstation-class graphics software and hardware solutions.
MS Directx مجموعه ای است از برترین تکنولوژیهای گرافیکی که با هدف ارتقا سطح کیفی , پایداری و تاثیر گذاری تصاویر و کار های گرافیکی در پلتفرم های مبنی بر محصولات Microsoft طراحی و ایجاد شده است .
DirectX شامل بهترین توابع و تکنولوژیهای زمان اجرا , ابزارهایی برای سازندگان و طراحان و همینطور API های گرافیکی برای برنامه نویسان گرافیکی می باشد .
در حال حاضراستانداردهای DirectX از سوی حجم وسیعی از کاربران و سازندگان نرم افزار و سخت افزار مورد حمایت قرار گرفته است . شركت مايكروسافت در سال 1995 DirectX را توسعه دادهاست.
اين نرمافزار شامل مجموعه يكپارچهاي از ابزارهاي برنامهنويسي است كه به توسعهدهندگان امكان ميدهد انواع مختلف نرمافزارهاي مالتيمديا را روي پلتفرم ويندوز توليد كنند.
اجزای اصلی DirectX :
DirectX 10.1 جدیدترین ورژن از DX در حال حاضر می باشد و دارای 7 مولفه اصلی Direct3D , DirectDraw , DirectPlay , DirectShow , DirectMusic , DirectSound , DirectInput می باشد در زیر به بررسی کلی هر کدام می پردازیم :
1 –Direct3D
اصلی ترین بخش DX , DX3D است . ابتدا تعریف مختصری از DirectX و در ادامه بررسی مفصل نقش این کامپوننت در بازی .
اين كامپوننت، دسترسي به توابع رندركننده گرافيك سهبعدي تعبيه شده در بيشتر كارتهاي گرافيك را فراهم ميكند. Direct3D يك API سطح پايين سهبعدي است كه به نرمافزار امكان ميدهد مستقل از سختافزار، با سختافزار شتابدهنده ارتباط برقرار كند.
لايهاي كه براي توسعهدهندگان بازي و گرافيك كامپيوتري امكان طراحي و ساخت بازيها را مستقل از سختافزار كامپيوترها فراهم ميكند، لايهاي به نام HAL یا Hardware Accelerator Layer است .
2 –DirectDraw
DirectDraw ، كامپوننتي ويژه طراحي دوبعدي است كه به برنامهنويس اجازه ميدهد مستقيماً به حافظه كارت گرافيك دسترسي يابد، صحنهها و فريمها را با هم تركيب نمايد يا bitmap ها را در آنجا ذخيره كند.
همچنين، براي برنامهها امكان دسترسي به سختافزارهاي ويژه نمايش را مستقل از نوع سختافزار فراهم ميكند.
هر برنامه كاربردي DirectDraw الگوي يكساني دارد كه عبارت است از:
- ايجاد يك شي
- شروع حلقه
- انتقال به مانتيور
- پايان حلقه
- پاك كردن آن شي
منظور از واژه يك شي ميتواند هر تصوير دوبعدياي باشد و منظور از حلقه، حلقهاي است كه در برنامهنويسي هنگام تكرار منظم دستهاي از دادهها يا دستورها به كار ميبريم. تصوير ايجادشده پس از مدتي پاك ميشود و جاي خود را به تصوير ديگري ميدهد.
3 –DirectPlay
اين كامپوننت امكان بازي چند نفر را در بازيهاي چندنفره فراهم ميآورد، دسترسي به سرويسهاي ارتباطي را آسان ميسازد و راهي را براي بازي فراهم ميكند تا مستقل از پروتكل يا نوع سرويس آنلاين با يكديگر در ارتباط باشند.
همچنين ازپروتكلهاي ارتباطي مطمئن پشتيبانيميكند تا مانع از گم شدن دادههاي مهم بازي روي شبكه شود. در واقع DirectPlay به صورت لايهاي است كه روي پروتكلهاي معمول شبكه مانند IPX ،TCP/IP و ... قرار دارد.
در واقع يك session يا جلسه در DirectPlay يك كانال ارتباطي بين چندين كامپيوتر است . يك برنامه كاربردي پيش از آنكه بتواند با سيستمهاي ديگر ارتباط برقرار كند، بايد در يك Session يا جلسه باشد .
هر جلسه تنها يك ميزبان دارد و آن برنامه كاربردياي است كه آن جلسه را ايجاد كردهاست. تنها ميزبان ميتواند ويژگيهاي يك Session را تغيير دهد.
4 –DirectShow
اين كامپوننت از بسياري از فرمتهاي صوتي و ويديويي مانند AVI ،MPEG ،ASF ،WMA/WMV ،DV و MP3 و DirectX پشتيباني ميكند و روي ويندوزهاي 98، 2000، xp vista , و نرمافزار اينترنت اكسپلورر عرضه شده است .DirectShow پروسه كارهاي مالتيمديا مانند نمايش فايل ويديويي را به مجموعهاي از مراحل كه با نامfilter شناخته ميشوند تقسيم ميكند.
فيلترها تعدادي pin ورودي و خروجي دارند كه آنها را به هم متصل ميكند. طراحي كلي سازوكار اتصال به اين صورت است كه فيلترها ميتوانند به روشهاي مختلف به هم متصل شوند كه هر نوع از اين اتصالها به معني انجام دادن يك كار است و توسعهدهندگان نرمافزار ميتوانند افكتهاي خود يا فيلترهاي ديگري را به بخشي از اين گراف براي انجام كار ويژهاي بيفزايند.
گراف فيلتر DirectShow به صورت گسترده در ضبط صدا و فيلم، و ويرايش آنها به كار ميرود.
5 –DirectMusic
تاكنون بازيهايي را تجربه كردهايد كه در تمام مدت يك مرحله، موسيقي يكنواخت و ثابتي دارند؟ بازياي را در نظر بگيريد كه برنامهنويسان آن ميخواهند يك آهنگ، در تمام مدت، در يك مرحله از آن به صدا دربيايد. با استفاده از برنامه DirectMusic Producer،آنهاميتواننددرآن مرحلرويآهنگ،يكدرجهدر نظربگيرند.
اين درجه ميتواند بسته به نوع عملكرد شخصيت بازي ، تغيير كند . اگر شخصيت بازي در حال راه رفتن است ، آهنگ آرام و هنگامي كه با دشمن خود مبارزه ميكند ، آهنگ تندتر ميشود و يا نوع آهنگ تغيير ميكند و هنگامي كه مبارزه تمام ميشود ، آهنگ دوباره آرام ميشود .
اين تغييرها بدون ايجاد وقفه، به صورت پويا و بدون دخالت كاربر انجام ميشود .
چون براساس DirecMusic، آهنگ به صورت شناور و بدون وقفه با نواختن وارياسيونهاي مختلف با قابليت واكنش به رويدادهاي بازي توليدميشود.
DirectMusic ، با دادههاي موسيقي براساس پيامهاي حاوي اطلاعات كار ميكند .
يك آهنگ ميتواند در داخل سختافزار و با نرمافزارهاي آهنگساز مانند Microsoft Synthesizerساخته شود . DirectMusic از استانداردهای MIDI , DLS پشتيباني ميكند.
6 –DirectSound
اين كامپوننت همزمان با ساخت ويندوز 95 ، زماني كه درايورهاي صوتي از نوع VXD بودند به DirectX افزوده شد . در اين كامپوننت APIهاي ويژهاي ايجاد شد كه نويسندگان درايورهاي صوتي ميبايست آنها را به محصولات خود ، كه فرمت VXD داشت، ميافزودند تا به درستي با DirectSound كار كند .
برنامههاي چندرسانهاي با اين كامپوننت به سختافزارهاي صوتي مانند كارت صوتي دسترسي پيداميكنند. از مهمترين ويژگيهاي اين API، تركيب صدا و كنترل سطح آن است. همچنين اجازه ميدهد چندين برنامه كاربردي، بدون پيش آوردن وقفه، همزمان به كارت صوتي دسترسي داشته باشند. ايجاد افكتهاي صوتي از ديگر تواناييهاي DirectSound است.
پس از سالها توسعه، اكنون DirectSound يك API پخته و كامل است و بسياري قابليتهاي ديگر را نيز فراهم ميكند؛ مانند قابليت پخش صداهاي چند كاناله با وضوح و دقت بالا.
7 –DirectInput
اين كامپوننت، سازوكار مشتركي را براي دسترسي به بسياري از كنترلكنندههاي بازي مانند دسته بازي، گيمپد، صفحه كليد و ماوس فراهم ميآورد. مهمترين تغييري كه هنگام عرضه DirectX8 در DirectInput ايجاد شد، آمدنaction map بود. action map از توابعي مانند راندن يك وسيله يا شليك يك گلوله (كه بهوسيله دستگاههاي ورودي ايجاد ميشود) استفاده ميكند.
زماني كه يك سختافزار ورودي مانند دسته بازي را ميخريد، معمولا ًaction mapنيز براي بسياري از انواع رايج بازيها مانند شبيهساز پرواز، تيراندازي اول شخص و بازيهاي مسابقهاي در آن پيادهسازي شده است.
بررسی کا مپوننت Direct3D :
D3D شامل توابع و روتین های Low-level برای رندر کردن اشیای دنیای مجازی با استفاده از سخت افزار شتاب دهنده گرافیکی است . D3D مانند پل رابطی بین App و HW عمل میکند .
برای مثال می توان با فراخوانی تابع Idirect3ddevice10::clear به کارت گرافیک فرمان پاک کردن صفحه نمایش صادر کرد.
Only the registered members can see the link
همانطور که در شکل بالا مشاهده می شود کامپوننت اصلی DX که مستقیما با HAL یا Hardware Accelerator Layer
( درایور کارت گرافیک ) در ارتباط است , Direct3D است . Direct3D نمی تواند به طور مستقیم با کارت گرافیک ارتباط برقرار کند به دلیل اینکه تنوع کارت های گرافیک بسیار زیاد است و هر کدام از روش ها و راهکار های خاصی برای اجرای دستور العمل های گرافیکی استفاده می کنند .
HAL مجموعه ای از کدهای مشخص است که توسط سازنده کارت گرافیک ارائه می شود و به کارت گرافیک نحوه اجرای یک عملیات را می آموزد . در نتیجه D3D نیازی به آگاهی از جزئیات کار کرد کارت گرافیک نخواهد داشت .
HAL دستورات D3D را به دستورات قابل فهم برای کارت گرافیک تبدیل می کند . این کار باعث می شود تا D3D کار خود را مستقل از سخت افزار خاص انجام دهد و در عوض HAL ارتباط بین Device و D3D را برقرار می کند .
سازنده کارت گرافیک تمام ویژگی ها و امکانات Device را در HAL پیاده سازی می کند . فراخوانی یک متد خاص از D3D که توسط کارت گرافیک HAL , پشتیبانی نمیشود موجب خطای زمان اجرا میشود که در این مورد به صورت یک نویز گرافیکی روی صفحه نمایش پدیدار می شود .
در برنامه نوع D3DDEVTYPE_HAL که یکی از اعضای نوع شمارشی D3DDEVTYPE است , نشان دهنده یک HAL Device است . این نوع بسیار مهم است چون برای شناسایی HAL کارت گرافیک به کار می رود .
قسمتی از پیاده سازی برنامه به زبان C++ :
در ادامه قسمت اصلی یک برنامه بسیار ساده DX که وظیفه آن نمایش طیف رنگی در صفحه نمایش است را بررسی می کنیم .
void Render()
{ Rendering_Device->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
if( SUCCEEDED( Rendering_Device->BeginScene() ) )
{ Rendering_Device>SetStreamSource(0,Vertex_Buffer,0,sizeof(CUSTOMVER T; Rendering_Device->SetFVF( D3DFVF_CUSTOMVERTEX );
Rendering_Device->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );
Rendering_Device->EndScene(); } Rendering_Device->Present( NULL, NULL, NULL, NULL );
} توضیح :
تابع Render کار اصلی را در برنامه انجام می دهد . برای شروع کار Render کردن بایستی پیشفرض های اولیه مانند پر کردن بافر Vertex انجام شده باشد .
کار Render کردن با پاک کردن صفحه پس زمینه به رنگ آبی انجام میشود . خط زیر اینکار را انجام میدهد .
Rendering_Device->Clear( 0, NULL, D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255), 1.0f, 0L );
Rendering_Device ->BeginScene();
سپس تابع BeginScene فراخوانی می شود . رندر کردن داده های Vertex از بافر Vertex در چند مرحله انجام می شود . ابتدا باید منبع جریان یا StreamSource مشخص شود .
Rendering_Device>SetStreamSource(0,Vertex_Buffer,0,sizeof(CUSTOMVER T((;
پارامتر اول نشان دهنده شماره منبع جریان و پارامتر دوم اشاره گری است به بافر Vertex , پارامتر سوم نشان دهندهازOffset شروع جریان و شروع داده های Vertex است و پارامتر چهارم تعداد بایتهای هر Vertex است .
مرحله بعد فراخوانی SetFVF( D3DFVF_CUSTOMVERTEX );است وظیفه Vertex Shading خیلی ساده و ابتدایی را بر عهده دارد .
در مرحله بعد کار Render در بافر Vertex شروع می شود .
مرحله آخر پایان یافتن Render و رساندن اطلاعات به Front Buffer است که در این مرحله کار تمام می شود و اطلاعات درون Front Buffer آماده نمایش هستند .
برنامه نویسی با توابع و روتین های DirectX کاری طاقت فرسا و در عین حال مهیج و جالب است و این به خاطر وجود خروجی های گرافیکی و 3 بعدی این برنامه هاست .
قسمتی از پیاده سازی برنامه به زبان C# :
به طور کلی وظیفه تابع Render ایجاد تصویر بر روی صفحه نمایش است . این تابع زمانی فراخوانی می شود که تمامی متغیرها و Flag ها به شکل صحیحی مقداردهی شده باشند . در زیر ساختار یک تابع Render دو بعدی ساده آمده است :
private void Render()
{
D3DDev.Clear( ClearFlags.Target | ClearFlags.ZBuffer,
Color.FromArgb(255, 100, 100, 100), 1.0f, 0 );
D3DDev.BeginScene();
// Here we can render costomize geometric shapes
D3DDev.EndScene();
D3DDev.Present();
}
این تابع هیچ پارامتر ورودی و خروجی ندارد .
متغیر D3DDev که به معنی Direct3D Device می باشد از نوع Device یکی از انواع از پیش تعریف شده در کتابخانه Direct3D است که فایل DLL. آن به صورت Refrence در برنامه موجود است .
این متغیر یک Device مجازی که یک انتزاع از Device سخت افزاری واقعی است را تعریف می کند . به این ترتیب برنامه نویس می تواند به سخت افزار واقعی از طریق متدها و خصوصیات Device::D3DDev دسترسی داشته باشد .
تابع clear یکی از متدهای Device:: است و چهار پارامتر می گیرد : به ترتیب ClearFlag, Color, Zdepth, Stencil . هر یک از این پارامتر ها خصوصیتی از Direct3D را مقدار دهی می کنند . این تابع برای Reset کردن Device به کار می رود .
در حقیقت Back Buffer را با یک مقدار (رنگ) مقدار دهی می کند .
تابع BeginSence آغاز مرحله Render می باشد . این تابع از متد های ::Direct3D است و همواره به همراه تابع EndSence می آید . تعریف Microsoft از این تابع چنین است : Represents the beginning of a scene .
بین توابع Begin و End (که به صورت Comment آمده است)می توان اشکال هندسی یا هر منظره و تصویری را قرار داد .
تابع Present() برای انتقال داده های رنگی موجود در Back Buffer به صفحه نمایشگر به کار می رود. این تابع همواره بعد از تابع EndSence اجرا می شود .
البته نباید فراموش کردکه برای اجرای صحیح تا بع Render قبلا باید به متغیر ها و Flag های Device مقادیر معتبری انتساب داده شود .
با اجرای تابع Render بالا صفحه نمایش با رنگ RGB(100, 100, 100) به صورت یکنواخت Render می شود.
مروری کوتاه بر OpenGL :
شركت سيليكون گرافيكس SGI ، OpenGL را با هدف ساخت يك API براي توسعه برنامههاي گرافيكي دوبعدي و سه بعدي عرضهكردهاست. پيش از ساخته شدن APIهاي گرافيكي مانند OpenGL و DirectX، بسياري از توليدكنندگان سختافزار، كتابخانههاي گرافيكي مختلف و متفاوتي داشتند.
به همين دليل پشتيباني از نسخههاي مختلف نرمافزارهايشان روي پلتفرمهاي سختافزاري مختلف هزينهبر و انتقال يك برنامه كاربردي از يك پلتفرم سختافزاري به پلتفرم سختافزاري ديگر بسيار وقتگير و سخت بود. اين برنامه به صورت Open Source ارائه شدهاست .
در اوايل پيدايش OpenGL، از اين API در كارهاي صنعتي، طراحي وسايل داخلي، مكانيكي و نيز در آناليزهاي علمي و آماري استفاده ميشد.
در سال 1996، نويسندگان و توسعهدهندگان بازيهاي كامپيوتري از نسخه ويندوزي OpenGL براي ساخت بازيهاي كامپيوتري استفاده كردند. OpenGL براي پشتيباني از گستره وسيعي از تكنيكهاي رندركردن گرافيكي پيشرفته طراحي شده است كه ميتوان پارهاي از آنها را به اينصورت نام برد :
نورپردازي: قابليت تحليل ميزان رنگ هنگام تابش مدلهاي متفاوت نور به يك سطح از يك يا چند منبع نور مختلف.
سايهسازي نرم: قابليت تحليل افكتهاي سايه هنگام تابش نور به يك زاويه و ايجاد اختلاف نور خفيف در مقابل آن سطح (مانند نور كمي كه هنگام تابش آفتاب به يك صخره يخي در اطراف آن ايجاد ميشود).
حركت محو ومدلسازي : توانايي تغيير مكان و اندازه پرسپكتيو يك شي در فضاي سه بعدي را حرکت محو گویند .
مجموعه امكانات OpenGL شبيه Direct3D است. ولي API سطح پايينتر آن (نزديكتر به سطح سختافزار) باعث ميشود كنترل خوبي روي عناصر اصلي ايجاد صحنههاي سه بعدي مانند اطلاعات سهضلعيها كه سلولهاي تشكيلدهنده يك مدل سه بعدي هستندداشته باشد.
OpenGL 1.4 و OpenGL 1.5 بهترتيب در تابستان 2002 و 2003 معرفي شدند كه هر يك امكانات و كاربردهاي بيشتري از نسخههاي پيش از خود داشتند.
بزرگترين آنها OpenGL Shading Language بود؛ زباني ويژه برنامهنويسي vertex-shader و pixel-shader كه در صورت نياز به OpenGL الصاق ميشد. OpenGL Shading Language زباني شد كه به سرعت در سطح گستردهاي مورد پشتيباني يونيكس، ويندوز، لينوكس و ديگر سيستمعاملها براي توسعهدهنده گرافيكهايتعامليوبرنام هايكاربرديترسيميقرار گرفت.
OpenGL 2.0 آخرين نسخه عرضه شده تا اوايل سال 2006 ميلادي است. OpenGL Shader Language همراه با اين نسخه عرضه شده و بر پايه استاندارد ANSYC طراحي شده است.
خلاصه :
بازی های کامپیوتری , برنامه های Multimedia و سایر برنامه های کاربردی گرافیکی برای اجرا شدن موفق و صحیح بر روی یک سیستم به طور مستقیم از واسط های DirectX و OpenGL استفاده می کنند .
از این رو برای آشنایی با نحوه عملکرد برنامه های گرافیکی به ویژه بازیهای کامپیوتری آشنایی با DirectX اجتناب ناپذیر است .
در کل می شود گفت :
DX مجموعه ای ازInterface های گرافیکی است که در قالب فایل های .dll و .lib در ویندوز قرار گرفته اند و توسط Microsoft ساخته شده اند و برای اینکه در برنامه نویسی بتوانیم از این Interface ها استفاده کنیم , Microsoft در DirectX API امکان دسترسی به توابع DirectX رو فراهم کرده است .
اجزای اصلی DirectX :
DirectX 10.1 جدیدترین ورژن از DX در حال حاضر می باشد و دارای 7 مولفه اصلی Direct3D , DirectDraw , DirectPlay , DirectShow , DirectMusic , DirectSound , DirectInput می باشد در زیر به بررسی کلی هر کدام می پردازیم :
اصلی ترین بخش DX , DX3D است .
شركت سيليكون گرافيكس SGI ، OpenGL را با هدف ساخت يك API براي توسعه برنامههاي گرافيكي دوبعدي و سه بعدي عرضهكردهاست. پيش از ساخته شدن APIهاي گرافيكي مانند OpenGL و DirectX، بسياري از توليدكنندگان سختافزار، كتابخانههاي گرافيكي مختلف و متفاوتي داشتند.
نتیجه گیری :
همانگونه كه بيان شد ارتباط بين برنامهها و سختافزاري كه آنرا اجرا ميكندبرعهدهAPIاست. سازندگان بزرگ نرمافزار و سختافزارAPIخاصي را براي برنامههايمالتيمديا آماده كردهاند كه مطرح ترين آنهاDirectXوOpenGLهستند.
برنامه نویسی مستقیم با DirectX و یا OpenGL با زبانهای مطرح مثل C\C++ کار بسیار سخت و نفس گیری است . دسترسی به تمام امکانات DirectX فقط از طریق C++.NET امکان پذیر است . این کار با زبان C#هم امکان پذیر است ولی قدرت و انعطافC++ را ندارد .
اما از جهتی که کار با پیچیدگی های برنامه های ویندوزی در C# کمتر به چشم می آید , و بیشتر می شود روی Framework تمرکز کرد می توان برای شروع به کار از C# استفاده کرد .
واژه نامه :
Vertex :
در گرافیک سه بعدی هر شئ از مولفه هایی تجزیه ناپذیری تشکیل می شود . این مولفه ها , نقاطی در فضای سه بعدی هستندکه دارای سه مولفه ی x, y, z می باشند و اصطلاحا به آنها گره یا Vertex گفته می شود .
VertexBuffer :
بافر گره قسمتی از حافظه کارت گرافیک است که در آن مختصات گره های سازنده اشیا و مدل های گرافیکی قرار دارد . توضیح اینکه این فایل ها قبلا توسط نرم افزار های گرافیکی در قالب فایل های خاصی ساخته شده اند .
Texture :
در لغت به معنی بافت می باشد در اینجا اصطلاحا به معنی بافت اطلاعات تصویری دو بعدی است . تصویری که بر روی اشیا سه بعدی قرار می گیرد را Texture گویند .
TextureMapping :
عملیات بافت زنی به فرایند نگاشت تصاویر بر روی اشیا و مدل های سه بعدی به منظور واقعی جلوه دادن و جنسیت دادن به اشیا.
Render :
در لغت به معنی پرداخت می باشد و اصطلاحا به فرآيند ساخت تصاوير دو بعدي از روي اجسام سه بعدي اطلاق ميشود که شامل عمليات تبديل هندسي ، نور پردازي و برش ميباشد .
Mesh :
توری و مشبکه که از مثلث های کوچکی تشکیل شده و می تواند شکل خاصی را نمایش دهد , مانند شکل .
Only the registered members can see the link
Z-Buffer :
بافر عمق که معمولا به Z-Buffer یا W-Buffer معروف است ( بستگی به محوری دارد که از آن استفاده می کند) بافری از حافظه شتاب دهنده گرافیکی, که برای نگهداری اطلاعات پیکسلهای مربوط به عمق یا محور Z تصویر سه بعدی , به کار می رود.
امروزه تقریبا تمامی شتاب دهنده های گرافیکی از تکنیکهای Z-Buffering پشتیبانی می کنند
Rasterization :
فرایند تبدیل عکس یا یک Bitmap که قبلا ذخیره یا ایجاد شده است به پیکسلهای قابل نمایش در مانیتور یا پرینتر یا هر وسیله نمایشگر دیگر . این فرایند به شدت متکی به محاسبات ریاضی است و نیازمند یک واحد پرداشگر اختصاصی است .
نمونه ای از این فرایند در شکل آمده است . تناطر هر مثلث کوچکتر به یک پیکسل .
این کار برای تمامی پیکسلها انجام می شود
Lighting :
برای افزایش دادن واقعی بودن صحنه ها یا فریم ها از تکنیک Lighting یا نور پردازی استفاده می شود . همچنین نورپردازی کمک می کند تا بتوانیم حجم و حالت ماده ( جامد یا مایع یا ...) بودن را نشان بدهیم . در اینجا از یک منبع نورانی استفاده می شود .
Lighting Engine :
زمانی که ما از نورپردازی استفاده می کنیم نیازی به تعریف رنگ برای تک تک Vertex ها توسط ما نیست , این کار را Direct3D به کمک LightingEngine موجود در خود و بر اساس منبع نورانی , Material و موقعیت سطح دو بعدی انجام می دهد . مانند شکل زیر که شئ در برابر تابش مستقیم نور قرار گرفته است .
Material :
رنگ یک شئ در دنیای واقعی در اثر انعکاس نور از خود شئ می باشد , مثلا یک توپ قرمز رنگ , قرمز است چون تمامی رنگ های نور را جذب می کند به جز قرمز . در نتیجه قرمز از توپ منعکس می شود و سبب می شود توپ به این رنگ دیده شود.
در Direct3D مکانیزم مشابهی برای جنسیت بخشیدن به اشیا به کار رفته و ما میتوانیم برای سطح شئ یک Material ماده تعریف کنیم . این Material کمک می کند که نحوه انعکاس نور از شئ برای LighingEngine تعریف شود .
Surface :
Surface یا رویه به ماتریسی از پیکسلها اطلاق می شود که Direct3D برای ذخیره صاویر دو بعدی استفاده می کند .
XFiles :
طراحی Object های سه بعدی ساده مثل مکعب یا رویه کروی , خط راست و ... به کمک توابع D3DCreats کار چندان پیچیده ای نیست اما شکی نیست که طراحی Object های واقعی با D3DCreats و تعریف و ایجاد تک تک رئوس کار بسیار دشوارو وقت گیری است .
اما راه حل ساده تر استفاده از نرم افزار های مدل ساز گرافیکی است که می توانند طراحی مش های پیچیده را در محیطی ویژوال برای گرافیست ممکن کنند .
Rendering :
دیدگاه نرم افزاری:
مجموعه ای ازمراحل قابل برنامه نویسی پردازشی در قالب توابع برنامه نویسی که به صورت موازی و همزمان قابلیت اجرا داشته باشند . هر مرحله به صورت تکرارهای متوالی و موازی با سایر مراحل انجام می شود .
ایده پردازش های موازی در برنامه های گرافیکی در Direct3D به کار گرفته شده است تا تصاویر و جلوه های سریعتر و با جزئیات بیشتر تولید شود.
دیدگاه سخت افزاری :
در سخت افزار گرافیکی هم واحد های پردازش جریانی یا StreamPipelines معادلی وجود دارند که هر کدام از این واحد ها توانایی اجرای یکی از مراحل پردازشی را دارد . هر چه تعداد واحد های پردازش جریانی بیشتر باشند قدرت پردازش و در نتیجه کیفیت و کمیت فریم ها افزایش می یابد.
فایل PDF این مقاله با حجم 550 KB ...
:11()::11()::11():
سلام :give_rose:
این پست پایان فعالیت من در PCNetwork عزیز هست .
حقیقتش اینه که دارم خودمو برای کنکور ارشد آماده می کنم . فکر کنم حداقل تا بهمن ماه درگیرش باشم .
ولی خب می خوام همه سعی و توانمو بذارم .
از همه مدیران و دوستان عزیز که توی این مدت همکاری چیزای زیادی ازشون یاد گرفتم , کمال تشکر رو دارم . :1. (21):
این مقاله رو برای درس گرافیک 1 به عنوان Document توصیفی پروژه آماده کردم به عنوان حسن ختام فعالیت در فروم تقدیم می شه به اعضای عزیز PCNetwork .:1. (40):
متن کامل مقاله به همراه فهرست و تصاویر و لیست منابع رو هم توی همین پست ضمیمه کردم . :great:
Ltema3 2a
موفق باشید
کسری:11():
---------------------------------------------------------------------------------------------------------------------------
آشنایی با اصول و مبانی برنامه نویسی DirectX
پيشگفتار
سپاس خدای را که ما را در راه علم و دانش توفيق داد. متنی که در اينجا تقديم می شود مقدمه ی کوتاهی است بر اصول و مبانی برنامه نویسیDirectX. نکته حائز اهمیت این است که پیچیده ترین بازیهای کامپیوتری با استفاده از همین اصول و مبانی توسعه پیدا کرده اند .
در حقیقت نباید کنسول های بازی رایانه ای و تجهیزات و سخت افزارهای پیچیده و پیشرفته ای که در دو دهه اخیر رواج داشته اند را با علمی که موجب پیدایش و ساخت و توسعه آنها شده است یکی بدانیم .
اما برای کسانی که آشناییشان با علم کامپیوتر بستگی خیلی نزدیک به چنین وسایل خاصی دارد , باید به وضوح و روشنی تفاوت میان وسایل و ابزار و علم پدید آورنده این تجهیزات بیان شود .
متن حاضر می کوشد تا بیانگر این تفاوتها باشد .
به نام خدا
DirectX
دیباچه :
بازی های کامپیوتری , برنامه های Multimedia و سایر برنامه های کاربردی گرافیکی برای اجرا شدن موفق و صحیح بر روی یک سیستم به طور مستقیم از واسط های DirectX و OpenGL استفاده می کنند . از این رو برای آشنایی با نحوه عملکرد برنامه های گرافیکی به ویژه بازیهای کامپیوتری آشنایی با DirectX اجتناب ناپذیر است .
در این جا به صورت کلی به معرفی ساختار و معماری DirectX و ارتباط آن با سایر اجزا نرم افزاری و سخت افزاری و همینطور با توسعه دهنده برنامه های گرافیکی و بازیهای کامپیوتری ( برنامه نویس) می پردازیم .
معرفی اجزا و Component های اصلی DirectX و شرح مختصر و در بعضی از موارد تفصیلی هر بخش را ارائه می دهیم .
مقایسه ای بین ورژن های مختلف DirectX که نشان دهنده پیشرفت بسیار سریع این تکنولوژی است و در آخرهم تا حدودی وارد بحث برنامه نویسی گرافیکی با توابع DirectX می شویم و امکاناتی که زبان های برنامه نویسی وIDE هادر اختیار توسه دهنده بازی می گذارند را بررسی می کنیم .
البته بحث برنامه نویسی با API های گرافیکی بسیار وسیع و متنوع می باشد که هدف ما فقط طرح مقدمه ای از این بحث و بیان نیازهایی است که برنامه نویسان در این بخش دارند .
برای بحث تفصیلی منابع معتبری در این مقاله معرفی می شوند که خواننده مشتاق از رجوع به آنها بی نیاز نخواهد بود .
همچنین مروری کوتاه بر اجزای اصلی OpenGL , تاریخچه , موارد کاربرد , ورژن های مختلف , نحوه عملکرد آن و در نهایت مقایسه ای بین OpenGL و DirectX خواهیم داشت .
تاریخچه :
سال 1995 همراه با ظهور ویندوز 95 شرکت Microsoft اولین نسخه از DirectX , DX 1.0را به بازار نرم افزار عرضه کرد . یک سال بعد یعنی 1996 نسخه جدیدتری از2.0DX معرفی شد .
در همان سال DX 3.0 به سرعت منتشر شد .
روند توسعه DX سیر صعودی خود را به سرعت طی کرد تا اینکه در سال 2002 نسخه 9.0 منتشر شد .
این نسخه برای اولین بار همراه با ویندوز xp از سوی Microsoft عرضه شد .
2 سال بعد 2004 با ورود کنسول XBOX 360 نسخه جدیدتری از DX 9.c تولید شد .
در سال 2006 نسخه فوق العاده قوی DX 10.0 همراه با ویندوز Vista انتشار یافت .
سرانجام در سال 2008 آخرین نسخه DX 10.1 از سوی Microsoft تولید و انتشار یافت .
در شکل زیر توسعه DX به خوبی نشان داده شده است .
Only the registered members can see the link
تعریف و بیان مفاهیم کلی :
تنوع زیاد سخت افزار و معماری های مختلف و همچنین سیستمهای عامل به عنوان بستری برای اجرای برنامه های کاربردی از یک سو و از سوی دیگر تلاش برای کسب رضایت کاربران باعث طرح و تدوین استاندارهایی از سوی سازمان های متولی استاندارد در صنعت کامپیوتر می شود .
گاهی اوقات هم بعضی محصولات موفق و همه گیر خود را به عنوان استاندارد جدیدی مطرح می کنند . و از این به بعد سازندگان دیگر باید محصولات خود را هماهنگ و سازگار با این استاندارد جدید تولید کنند .
نمونه ی بارز برای این نوع محصول , DirectX می باشد که از سوی Microsoft غول نرم افزاری دنیا ارائه شده است .
تعاریف جامعی از DirectX وجود دارد که هر کدام از دیدگاه خاصی DirectX را تعریف می کند .
دیدگاه Developer:
DX به عنوان مجموعه ای از Application Programing InterfaceAPI های گرافیکی است که شامل توابع و روال های از پیش تعریف شده است که می توان آنها را در برنامه نویسی به کار گرفت .
دیدگاه سیستم عاملی :
DX مجموعه ای است از توابع و روال های RunTime سیستم عامل در قالب فایل های .dll و .lib که در زمان اجرا در اختیار Application قرار می گیرد .
دیدگاه سخت افزاری :
DX مجموعه ای از توابع Low-level می باشد که برای اجرا شدن احتیاج به سخت افزار شتاب دهنده گرافیکی یا Graphics Accelerator مناسب با توان اجرای دستورات گرافیکی پایه , دارد .
در کل می شود گفت : DX مجموعه ای ازInterface های گرافیکی است که در قالب فایل های .dll و .lib در ویندوز قرار گرفته اند و توسط Microsoft ساخته شده اند و برای اینکه در برنامه نویسی بتوانیم از این Interface ها استفاده کنیم , Microsoft در DirectX API امکان دسترسی به توابع DirectX رو فراهم کرده است .
تعریفی که Microsoft از DirectX ارائه می کند :
DirectX
Microsoft DirectX is a collection of industry-leading graphics technologies designed to deliver the most advanced, stable, and visually impressive graphics experience on Microsoft platforms. DirectX is comprised of best-in-breed runtime technologies, developer tools, graphics programming interfaces and languages. The DirectX standard is supported by a wide variety of consumer and workstation-class graphics software and hardware solutions.
MS Directx مجموعه ای است از برترین تکنولوژیهای گرافیکی که با هدف ارتقا سطح کیفی , پایداری و تاثیر گذاری تصاویر و کار های گرافیکی در پلتفرم های مبنی بر محصولات Microsoft طراحی و ایجاد شده است .
DirectX شامل بهترین توابع و تکنولوژیهای زمان اجرا , ابزارهایی برای سازندگان و طراحان و همینطور API های گرافیکی برای برنامه نویسان گرافیکی می باشد .
در حال حاضراستانداردهای DirectX از سوی حجم وسیعی از کاربران و سازندگان نرم افزار و سخت افزار مورد حمایت قرار گرفته است . شركت مايكروسافت در سال 1995 DirectX را توسعه دادهاست.
اين نرمافزار شامل مجموعه يكپارچهاي از ابزارهاي برنامهنويسي است كه به توسعهدهندگان امكان ميدهد انواع مختلف نرمافزارهاي مالتيمديا را روي پلتفرم ويندوز توليد كنند.
اجزای اصلی DirectX :
DirectX 10.1 جدیدترین ورژن از DX در حال حاضر می باشد و دارای 7 مولفه اصلی Direct3D , DirectDraw , DirectPlay , DirectShow , DirectMusic , DirectSound , DirectInput می باشد در زیر به بررسی کلی هر کدام می پردازیم :
1 –Direct3D
اصلی ترین بخش DX , DX3D است . ابتدا تعریف مختصری از DirectX و در ادامه بررسی مفصل نقش این کامپوننت در بازی .
اين كامپوننت، دسترسي به توابع رندركننده گرافيك سهبعدي تعبيه شده در بيشتر كارتهاي گرافيك را فراهم ميكند. Direct3D يك API سطح پايين سهبعدي است كه به نرمافزار امكان ميدهد مستقل از سختافزار، با سختافزار شتابدهنده ارتباط برقرار كند.
لايهاي كه براي توسعهدهندگان بازي و گرافيك كامپيوتري امكان طراحي و ساخت بازيها را مستقل از سختافزار كامپيوترها فراهم ميكند، لايهاي به نام HAL یا Hardware Accelerator Layer است .
2 –DirectDraw
DirectDraw ، كامپوننتي ويژه طراحي دوبعدي است كه به برنامهنويس اجازه ميدهد مستقيماً به حافظه كارت گرافيك دسترسي يابد، صحنهها و فريمها را با هم تركيب نمايد يا bitmap ها را در آنجا ذخيره كند.
همچنين، براي برنامهها امكان دسترسي به سختافزارهاي ويژه نمايش را مستقل از نوع سختافزار فراهم ميكند.
هر برنامه كاربردي DirectDraw الگوي يكساني دارد كه عبارت است از:
- ايجاد يك شي
- شروع حلقه
- انتقال به مانتيور
- پايان حلقه
- پاك كردن آن شي
منظور از واژه يك شي ميتواند هر تصوير دوبعدياي باشد و منظور از حلقه، حلقهاي است كه در برنامهنويسي هنگام تكرار منظم دستهاي از دادهها يا دستورها به كار ميبريم. تصوير ايجادشده پس از مدتي پاك ميشود و جاي خود را به تصوير ديگري ميدهد.
3 –DirectPlay
اين كامپوننت امكان بازي چند نفر را در بازيهاي چندنفره فراهم ميآورد، دسترسي به سرويسهاي ارتباطي را آسان ميسازد و راهي را براي بازي فراهم ميكند تا مستقل از پروتكل يا نوع سرويس آنلاين با يكديگر در ارتباط باشند.
همچنين ازپروتكلهاي ارتباطي مطمئن پشتيبانيميكند تا مانع از گم شدن دادههاي مهم بازي روي شبكه شود. در واقع DirectPlay به صورت لايهاي است كه روي پروتكلهاي معمول شبكه مانند IPX ،TCP/IP و ... قرار دارد.
در واقع يك session يا جلسه در DirectPlay يك كانال ارتباطي بين چندين كامپيوتر است . يك برنامه كاربردي پيش از آنكه بتواند با سيستمهاي ديگر ارتباط برقرار كند، بايد در يك Session يا جلسه باشد .
هر جلسه تنها يك ميزبان دارد و آن برنامه كاربردياي است كه آن جلسه را ايجاد كردهاست. تنها ميزبان ميتواند ويژگيهاي يك Session را تغيير دهد.
4 –DirectShow
اين كامپوننت از بسياري از فرمتهاي صوتي و ويديويي مانند AVI ،MPEG ،ASF ،WMA/WMV ،DV و MP3 و DirectX پشتيباني ميكند و روي ويندوزهاي 98، 2000، xp vista , و نرمافزار اينترنت اكسپلورر عرضه شده است .DirectShow پروسه كارهاي مالتيمديا مانند نمايش فايل ويديويي را به مجموعهاي از مراحل كه با نامfilter شناخته ميشوند تقسيم ميكند.
فيلترها تعدادي pin ورودي و خروجي دارند كه آنها را به هم متصل ميكند. طراحي كلي سازوكار اتصال به اين صورت است كه فيلترها ميتوانند به روشهاي مختلف به هم متصل شوند كه هر نوع از اين اتصالها به معني انجام دادن يك كار است و توسعهدهندگان نرمافزار ميتوانند افكتهاي خود يا فيلترهاي ديگري را به بخشي از اين گراف براي انجام كار ويژهاي بيفزايند.
گراف فيلتر DirectShow به صورت گسترده در ضبط صدا و فيلم، و ويرايش آنها به كار ميرود.
5 –DirectMusic
تاكنون بازيهايي را تجربه كردهايد كه در تمام مدت يك مرحله، موسيقي يكنواخت و ثابتي دارند؟ بازياي را در نظر بگيريد كه برنامهنويسان آن ميخواهند يك آهنگ، در تمام مدت، در يك مرحله از آن به صدا دربيايد. با استفاده از برنامه DirectMusic Producer،آنهاميتواننددرآن مرحلرويآهنگ،يكدرجهدر نظربگيرند.
اين درجه ميتواند بسته به نوع عملكرد شخصيت بازي ، تغيير كند . اگر شخصيت بازي در حال راه رفتن است ، آهنگ آرام و هنگامي كه با دشمن خود مبارزه ميكند ، آهنگ تندتر ميشود و يا نوع آهنگ تغيير ميكند و هنگامي كه مبارزه تمام ميشود ، آهنگ دوباره آرام ميشود .
اين تغييرها بدون ايجاد وقفه، به صورت پويا و بدون دخالت كاربر انجام ميشود .
چون براساس DirecMusic، آهنگ به صورت شناور و بدون وقفه با نواختن وارياسيونهاي مختلف با قابليت واكنش به رويدادهاي بازي توليدميشود.
DirectMusic ، با دادههاي موسيقي براساس پيامهاي حاوي اطلاعات كار ميكند .
يك آهنگ ميتواند در داخل سختافزار و با نرمافزارهاي آهنگساز مانند Microsoft Synthesizerساخته شود . DirectMusic از استانداردهای MIDI , DLS پشتيباني ميكند.
6 –DirectSound
اين كامپوننت همزمان با ساخت ويندوز 95 ، زماني كه درايورهاي صوتي از نوع VXD بودند به DirectX افزوده شد . در اين كامپوننت APIهاي ويژهاي ايجاد شد كه نويسندگان درايورهاي صوتي ميبايست آنها را به محصولات خود ، كه فرمت VXD داشت، ميافزودند تا به درستي با DirectSound كار كند .
برنامههاي چندرسانهاي با اين كامپوننت به سختافزارهاي صوتي مانند كارت صوتي دسترسي پيداميكنند. از مهمترين ويژگيهاي اين API، تركيب صدا و كنترل سطح آن است. همچنين اجازه ميدهد چندين برنامه كاربردي، بدون پيش آوردن وقفه، همزمان به كارت صوتي دسترسي داشته باشند. ايجاد افكتهاي صوتي از ديگر تواناييهاي DirectSound است.
پس از سالها توسعه، اكنون DirectSound يك API پخته و كامل است و بسياري قابليتهاي ديگر را نيز فراهم ميكند؛ مانند قابليت پخش صداهاي چند كاناله با وضوح و دقت بالا.
7 –DirectInput
اين كامپوننت، سازوكار مشتركي را براي دسترسي به بسياري از كنترلكنندههاي بازي مانند دسته بازي، گيمپد، صفحه كليد و ماوس فراهم ميآورد. مهمترين تغييري كه هنگام عرضه DirectX8 در DirectInput ايجاد شد، آمدنaction map بود. action map از توابعي مانند راندن يك وسيله يا شليك يك گلوله (كه بهوسيله دستگاههاي ورودي ايجاد ميشود) استفاده ميكند.
زماني كه يك سختافزار ورودي مانند دسته بازي را ميخريد، معمولا ًaction mapنيز براي بسياري از انواع رايج بازيها مانند شبيهساز پرواز، تيراندازي اول شخص و بازيهاي مسابقهاي در آن پيادهسازي شده است.
بررسی کا مپوننت Direct3D :
D3D شامل توابع و روتین های Low-level برای رندر کردن اشیای دنیای مجازی با استفاده از سخت افزار شتاب دهنده گرافیکی است . D3D مانند پل رابطی بین App و HW عمل میکند .
برای مثال می توان با فراخوانی تابع Idirect3ddevice10::clear به کارت گرافیک فرمان پاک کردن صفحه نمایش صادر کرد.
Only the registered members can see the link
همانطور که در شکل بالا مشاهده می شود کامپوننت اصلی DX که مستقیما با HAL یا Hardware Accelerator Layer
( درایور کارت گرافیک ) در ارتباط است , Direct3D است . Direct3D نمی تواند به طور مستقیم با کارت گرافیک ارتباط برقرار کند به دلیل اینکه تنوع کارت های گرافیک بسیار زیاد است و هر کدام از روش ها و راهکار های خاصی برای اجرای دستور العمل های گرافیکی استفاده می کنند .
HAL مجموعه ای از کدهای مشخص است که توسط سازنده کارت گرافیک ارائه می شود و به کارت گرافیک نحوه اجرای یک عملیات را می آموزد . در نتیجه D3D نیازی به آگاهی از جزئیات کار کرد کارت گرافیک نخواهد داشت .
HAL دستورات D3D را به دستورات قابل فهم برای کارت گرافیک تبدیل می کند . این کار باعث می شود تا D3D کار خود را مستقل از سخت افزار خاص انجام دهد و در عوض HAL ارتباط بین Device و D3D را برقرار می کند .
سازنده کارت گرافیک تمام ویژگی ها و امکانات Device را در HAL پیاده سازی می کند . فراخوانی یک متد خاص از D3D که توسط کارت گرافیک HAL , پشتیبانی نمیشود موجب خطای زمان اجرا میشود که در این مورد به صورت یک نویز گرافیکی روی صفحه نمایش پدیدار می شود .
در برنامه نوع D3DDEVTYPE_HAL که یکی از اعضای نوع شمارشی D3DDEVTYPE است , نشان دهنده یک HAL Device است . این نوع بسیار مهم است چون برای شناسایی HAL کارت گرافیک به کار می رود .
قسمتی از پیاده سازی برنامه به زبان C++ :
در ادامه قسمت اصلی یک برنامه بسیار ساده DX که وظیفه آن نمایش طیف رنگی در صفحه نمایش است را بررسی می کنیم .
void Render()
{ Rendering_Device->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
if( SUCCEEDED( Rendering_Device->BeginScene() ) )
{ Rendering_Device>SetStreamSource(0,Vertex_Buffer,0,sizeof(CUSTOMVER T; Rendering_Device->SetFVF( D3DFVF_CUSTOMVERTEX );
Rendering_Device->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );
Rendering_Device->EndScene(); } Rendering_Device->Present( NULL, NULL, NULL, NULL );
} توضیح :
تابع Render کار اصلی را در برنامه انجام می دهد . برای شروع کار Render کردن بایستی پیشفرض های اولیه مانند پر کردن بافر Vertex انجام شده باشد .
کار Render کردن با پاک کردن صفحه پس زمینه به رنگ آبی انجام میشود . خط زیر اینکار را انجام میدهد .
Rendering_Device->Clear( 0, NULL, D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255), 1.0f, 0L );
Rendering_Device ->BeginScene();
سپس تابع BeginScene فراخوانی می شود . رندر کردن داده های Vertex از بافر Vertex در چند مرحله انجام می شود . ابتدا باید منبع جریان یا StreamSource مشخص شود .
Rendering_Device>SetStreamSource(0,Vertex_Buffer,0,sizeof(CUSTOMVER T((;
پارامتر اول نشان دهنده شماره منبع جریان و پارامتر دوم اشاره گری است به بافر Vertex , پارامتر سوم نشان دهندهازOffset شروع جریان و شروع داده های Vertex است و پارامتر چهارم تعداد بایتهای هر Vertex است .
مرحله بعد فراخوانی SetFVF( D3DFVF_CUSTOMVERTEX );است وظیفه Vertex Shading خیلی ساده و ابتدایی را بر عهده دارد .
در مرحله بعد کار Render در بافر Vertex شروع می شود .
مرحله آخر پایان یافتن Render و رساندن اطلاعات به Front Buffer است که در این مرحله کار تمام می شود و اطلاعات درون Front Buffer آماده نمایش هستند .
برنامه نویسی با توابع و روتین های DirectX کاری طاقت فرسا و در عین حال مهیج و جالب است و این به خاطر وجود خروجی های گرافیکی و 3 بعدی این برنامه هاست .
قسمتی از پیاده سازی برنامه به زبان C# :
به طور کلی وظیفه تابع Render ایجاد تصویر بر روی صفحه نمایش است . این تابع زمانی فراخوانی می شود که تمامی متغیرها و Flag ها به شکل صحیحی مقداردهی شده باشند . در زیر ساختار یک تابع Render دو بعدی ساده آمده است :
private void Render()
{
D3DDev.Clear( ClearFlags.Target | ClearFlags.ZBuffer,
Color.FromArgb(255, 100, 100, 100), 1.0f, 0 );
D3DDev.BeginScene();
// Here we can render costomize geometric shapes
D3DDev.EndScene();
D3DDev.Present();
}
این تابع هیچ پارامتر ورودی و خروجی ندارد .
متغیر D3DDev که به معنی Direct3D Device می باشد از نوع Device یکی از انواع از پیش تعریف شده در کتابخانه Direct3D است که فایل DLL. آن به صورت Refrence در برنامه موجود است .
این متغیر یک Device مجازی که یک انتزاع از Device سخت افزاری واقعی است را تعریف می کند . به این ترتیب برنامه نویس می تواند به سخت افزار واقعی از طریق متدها و خصوصیات Device::D3DDev دسترسی داشته باشد .
تابع clear یکی از متدهای Device:: است و چهار پارامتر می گیرد : به ترتیب ClearFlag, Color, Zdepth, Stencil . هر یک از این پارامتر ها خصوصیتی از Direct3D را مقدار دهی می کنند . این تابع برای Reset کردن Device به کار می رود .
در حقیقت Back Buffer را با یک مقدار (رنگ) مقدار دهی می کند .
تابع BeginSence آغاز مرحله Render می باشد . این تابع از متد های ::Direct3D است و همواره به همراه تابع EndSence می آید . تعریف Microsoft از این تابع چنین است : Represents the beginning of a scene .
بین توابع Begin و End (که به صورت Comment آمده است)می توان اشکال هندسی یا هر منظره و تصویری را قرار داد .
تابع Present() برای انتقال داده های رنگی موجود در Back Buffer به صفحه نمایشگر به کار می رود. این تابع همواره بعد از تابع EndSence اجرا می شود .
البته نباید فراموش کردکه برای اجرای صحیح تا بع Render قبلا باید به متغیر ها و Flag های Device مقادیر معتبری انتساب داده شود .
با اجرای تابع Render بالا صفحه نمایش با رنگ RGB(100, 100, 100) به صورت یکنواخت Render می شود.
مروری کوتاه بر OpenGL :
شركت سيليكون گرافيكس SGI ، OpenGL را با هدف ساخت يك API براي توسعه برنامههاي گرافيكي دوبعدي و سه بعدي عرضهكردهاست. پيش از ساخته شدن APIهاي گرافيكي مانند OpenGL و DirectX، بسياري از توليدكنندگان سختافزار، كتابخانههاي گرافيكي مختلف و متفاوتي داشتند.
به همين دليل پشتيباني از نسخههاي مختلف نرمافزارهايشان روي پلتفرمهاي سختافزاري مختلف هزينهبر و انتقال يك برنامه كاربردي از يك پلتفرم سختافزاري به پلتفرم سختافزاري ديگر بسيار وقتگير و سخت بود. اين برنامه به صورت Open Source ارائه شدهاست .
در اوايل پيدايش OpenGL، از اين API در كارهاي صنعتي، طراحي وسايل داخلي، مكانيكي و نيز در آناليزهاي علمي و آماري استفاده ميشد.
در سال 1996، نويسندگان و توسعهدهندگان بازيهاي كامپيوتري از نسخه ويندوزي OpenGL براي ساخت بازيهاي كامپيوتري استفاده كردند. OpenGL براي پشتيباني از گستره وسيعي از تكنيكهاي رندركردن گرافيكي پيشرفته طراحي شده است كه ميتوان پارهاي از آنها را به اينصورت نام برد :
نورپردازي: قابليت تحليل ميزان رنگ هنگام تابش مدلهاي متفاوت نور به يك سطح از يك يا چند منبع نور مختلف.
سايهسازي نرم: قابليت تحليل افكتهاي سايه هنگام تابش نور به يك زاويه و ايجاد اختلاف نور خفيف در مقابل آن سطح (مانند نور كمي كه هنگام تابش آفتاب به يك صخره يخي در اطراف آن ايجاد ميشود).
حركت محو ومدلسازي : توانايي تغيير مكان و اندازه پرسپكتيو يك شي در فضاي سه بعدي را حرکت محو گویند .
مجموعه امكانات OpenGL شبيه Direct3D است. ولي API سطح پايينتر آن (نزديكتر به سطح سختافزار) باعث ميشود كنترل خوبي روي عناصر اصلي ايجاد صحنههاي سه بعدي مانند اطلاعات سهضلعيها كه سلولهاي تشكيلدهنده يك مدل سه بعدي هستندداشته باشد.
OpenGL 1.4 و OpenGL 1.5 بهترتيب در تابستان 2002 و 2003 معرفي شدند كه هر يك امكانات و كاربردهاي بيشتري از نسخههاي پيش از خود داشتند.
بزرگترين آنها OpenGL Shading Language بود؛ زباني ويژه برنامهنويسي vertex-shader و pixel-shader كه در صورت نياز به OpenGL الصاق ميشد. OpenGL Shading Language زباني شد كه به سرعت در سطح گستردهاي مورد پشتيباني يونيكس، ويندوز، لينوكس و ديگر سيستمعاملها براي توسعهدهنده گرافيكهايتعامليوبرنام هايكاربرديترسيميقرار گرفت.
OpenGL 2.0 آخرين نسخه عرضه شده تا اوايل سال 2006 ميلادي است. OpenGL Shader Language همراه با اين نسخه عرضه شده و بر پايه استاندارد ANSYC طراحي شده است.
خلاصه :
بازی های کامپیوتری , برنامه های Multimedia و سایر برنامه های کاربردی گرافیکی برای اجرا شدن موفق و صحیح بر روی یک سیستم به طور مستقیم از واسط های DirectX و OpenGL استفاده می کنند .
از این رو برای آشنایی با نحوه عملکرد برنامه های گرافیکی به ویژه بازیهای کامپیوتری آشنایی با DirectX اجتناب ناپذیر است .
در کل می شود گفت :
DX مجموعه ای ازInterface های گرافیکی است که در قالب فایل های .dll و .lib در ویندوز قرار گرفته اند و توسط Microsoft ساخته شده اند و برای اینکه در برنامه نویسی بتوانیم از این Interface ها استفاده کنیم , Microsoft در DirectX API امکان دسترسی به توابع DirectX رو فراهم کرده است .
اجزای اصلی DirectX :
DirectX 10.1 جدیدترین ورژن از DX در حال حاضر می باشد و دارای 7 مولفه اصلی Direct3D , DirectDraw , DirectPlay , DirectShow , DirectMusic , DirectSound , DirectInput می باشد در زیر به بررسی کلی هر کدام می پردازیم :
اصلی ترین بخش DX , DX3D است .
شركت سيليكون گرافيكس SGI ، OpenGL را با هدف ساخت يك API براي توسعه برنامههاي گرافيكي دوبعدي و سه بعدي عرضهكردهاست. پيش از ساخته شدن APIهاي گرافيكي مانند OpenGL و DirectX، بسياري از توليدكنندگان سختافزار، كتابخانههاي گرافيكي مختلف و متفاوتي داشتند.
نتیجه گیری :
همانگونه كه بيان شد ارتباط بين برنامهها و سختافزاري كه آنرا اجرا ميكندبرعهدهAPIاست. سازندگان بزرگ نرمافزار و سختافزارAPIخاصي را براي برنامههايمالتيمديا آماده كردهاند كه مطرح ترين آنهاDirectXوOpenGLهستند.
برنامه نویسی مستقیم با DirectX و یا OpenGL با زبانهای مطرح مثل C\C++ کار بسیار سخت و نفس گیری است . دسترسی به تمام امکانات DirectX فقط از طریق C++.NET امکان پذیر است . این کار با زبان C#هم امکان پذیر است ولی قدرت و انعطافC++ را ندارد .
اما از جهتی که کار با پیچیدگی های برنامه های ویندوزی در C# کمتر به چشم می آید , و بیشتر می شود روی Framework تمرکز کرد می توان برای شروع به کار از C# استفاده کرد .
واژه نامه :
Vertex :
در گرافیک سه بعدی هر شئ از مولفه هایی تجزیه ناپذیری تشکیل می شود . این مولفه ها , نقاطی در فضای سه بعدی هستندکه دارای سه مولفه ی x, y, z می باشند و اصطلاحا به آنها گره یا Vertex گفته می شود .
VertexBuffer :
بافر گره قسمتی از حافظه کارت گرافیک است که در آن مختصات گره های سازنده اشیا و مدل های گرافیکی قرار دارد . توضیح اینکه این فایل ها قبلا توسط نرم افزار های گرافیکی در قالب فایل های خاصی ساخته شده اند .
Texture :
در لغت به معنی بافت می باشد در اینجا اصطلاحا به معنی بافت اطلاعات تصویری دو بعدی است . تصویری که بر روی اشیا سه بعدی قرار می گیرد را Texture گویند .
TextureMapping :
عملیات بافت زنی به فرایند نگاشت تصاویر بر روی اشیا و مدل های سه بعدی به منظور واقعی جلوه دادن و جنسیت دادن به اشیا.
Render :
در لغت به معنی پرداخت می باشد و اصطلاحا به فرآيند ساخت تصاوير دو بعدي از روي اجسام سه بعدي اطلاق ميشود که شامل عمليات تبديل هندسي ، نور پردازي و برش ميباشد .
Mesh :
توری و مشبکه که از مثلث های کوچکی تشکیل شده و می تواند شکل خاصی را نمایش دهد , مانند شکل .
Only the registered members can see the link
Z-Buffer :
بافر عمق که معمولا به Z-Buffer یا W-Buffer معروف است ( بستگی به محوری دارد که از آن استفاده می کند) بافری از حافظه شتاب دهنده گرافیکی, که برای نگهداری اطلاعات پیکسلهای مربوط به عمق یا محور Z تصویر سه بعدی , به کار می رود.
امروزه تقریبا تمامی شتاب دهنده های گرافیکی از تکنیکهای Z-Buffering پشتیبانی می کنند
Rasterization :
فرایند تبدیل عکس یا یک Bitmap که قبلا ذخیره یا ایجاد شده است به پیکسلهای قابل نمایش در مانیتور یا پرینتر یا هر وسیله نمایشگر دیگر . این فرایند به شدت متکی به محاسبات ریاضی است و نیازمند یک واحد پرداشگر اختصاصی است .
نمونه ای از این فرایند در شکل آمده است . تناطر هر مثلث کوچکتر به یک پیکسل .
این کار برای تمامی پیکسلها انجام می شود
Lighting :
برای افزایش دادن واقعی بودن صحنه ها یا فریم ها از تکنیک Lighting یا نور پردازی استفاده می شود . همچنین نورپردازی کمک می کند تا بتوانیم حجم و حالت ماده ( جامد یا مایع یا ...) بودن را نشان بدهیم . در اینجا از یک منبع نورانی استفاده می شود .
Lighting Engine :
زمانی که ما از نورپردازی استفاده می کنیم نیازی به تعریف رنگ برای تک تک Vertex ها توسط ما نیست , این کار را Direct3D به کمک LightingEngine موجود در خود و بر اساس منبع نورانی , Material و موقعیت سطح دو بعدی انجام می دهد . مانند شکل زیر که شئ در برابر تابش مستقیم نور قرار گرفته است .
Material :
رنگ یک شئ در دنیای واقعی در اثر انعکاس نور از خود شئ می باشد , مثلا یک توپ قرمز رنگ , قرمز است چون تمامی رنگ های نور را جذب می کند به جز قرمز . در نتیجه قرمز از توپ منعکس می شود و سبب می شود توپ به این رنگ دیده شود.
در Direct3D مکانیزم مشابهی برای جنسیت بخشیدن به اشیا به کار رفته و ما میتوانیم برای سطح شئ یک Material ماده تعریف کنیم . این Material کمک می کند که نحوه انعکاس نور از شئ برای LighingEngine تعریف شود .
Surface :
Surface یا رویه به ماتریسی از پیکسلها اطلاق می شود که Direct3D برای ذخیره صاویر دو بعدی استفاده می کند .
XFiles :
طراحی Object های سه بعدی ساده مثل مکعب یا رویه کروی , خط راست و ... به کمک توابع D3DCreats کار چندان پیچیده ای نیست اما شکی نیست که طراحی Object های واقعی با D3DCreats و تعریف و ایجاد تک تک رئوس کار بسیار دشوارو وقت گیری است .
اما راه حل ساده تر استفاده از نرم افزار های مدل ساز گرافیکی است که می توانند طراحی مش های پیچیده را در محیطی ویژوال برای گرافیست ممکن کنند .
Rendering :
دیدگاه نرم افزاری:
مجموعه ای ازمراحل قابل برنامه نویسی پردازشی در قالب توابع برنامه نویسی که به صورت موازی و همزمان قابلیت اجرا داشته باشند . هر مرحله به صورت تکرارهای متوالی و موازی با سایر مراحل انجام می شود .
ایده پردازش های موازی در برنامه های گرافیکی در Direct3D به کار گرفته شده است تا تصاویر و جلوه های سریعتر و با جزئیات بیشتر تولید شود.
دیدگاه سخت افزاری :
در سخت افزار گرافیکی هم واحد های پردازش جریانی یا StreamPipelines معادلی وجود دارند که هر کدام از این واحد ها توانایی اجرای یکی از مراحل پردازشی را دارد . هر چه تعداد واحد های پردازش جریانی بیشتر باشند قدرت پردازش و در نتیجه کیفیت و کمیت فریم ها افزایش می یابد.
فایل PDF این مقاله با حجم 550 KB ...
:11()::11()::11():