اشاره :
زمانی
که کارتهای گرافیکی دوبعدی در PCها مورداستفاده بودند، یک کاربر برای
دستیابی به شتاب گرافیکی سهبعدی (3D Acceleration) باید از یک کارت ویژه
در کنار کارتهای رایج دوبعدی استفادهمیکرد. با رایج شدن قابلیتهای
گرافیک سهبعدی، کارتهای گرافیک، با دو قابلیت همزمان دوبعدی/ سهبعدی،
جایگزین کارتهای گرافیکی سهبعدی شدند. این کارتهای ترکیبی 2D/3D،
تابعهای استاندارد 2D را با قابلیتهای شتاب 3D در یک کارت تلفیق
مینمایند و راهبرد موثرتری را برای دستیابی دوستداران بازیهای کامپیوتری
به بازیهای بهتر فراهم میکنند. تقریبا همه کارتهای گرافیکی امروزی
دارای نوعی شتابدهنده سهبعدی ویژه هستند. ولی کارایی آنها بسته به
نوعشان بسیار متفاوت است. GPU یا پردازنده گرافیکی تراشهای است که
تقریباً همه کار شتابدهندگی گرافیکی سهبعدی را در کارتهای مدرن امروزی
انجام میدهد. علت اینکه به بخشی از پردازشهای گرافیکی "شتاب
نرمافزاری"یا "شتاب سختافزاری" گفته میشود، این است که این دستورها،
فیلترها و افکتهای خاص که به برخی از آنها در این مقاله اشاره خواهد شد،
کار ترسیم، ایجاد بافت و افزودن جلوههای ویژه را با سرعت بسیار بیشتری
نسبت به روشهای گذشته انجام میدهند.
nVidia و پیدایش GPU
nVidia
در روزسی و یکم آگوست سال 1999،GPU را به صنعت کامپیوترهای شخصی معرفی
نمود. GPU، پردازندهای است با مجموعهای از موتورهای رندرکننده، تبدیل و
نوردهی (T&L)، تنظیمکننده و برشدهنده چندضلعی که قادر است در هر
ثانیه دستکم ده میلیون چند ضلعی را مورد پردازش قرار دهد.
با
انجام دادن کار Transform &Lighting) T&L) بخش بزرگی از کار
CPU به GPU واگذار میشود و از بار پردازشیCPU کم میشود و CPU میتواند
دادههای دیگری را مورد پردازش قرار دهد. از اینرو سیستمهایی که از
GPU در بوردهای گرافیکی خود استفاده میکنند، نسبت به سیستمهای دیگر از
کارایی بسیار بیشتری برخوردارند. یکی از عللی که باعث میشود GPU سریعتر
از CPU پردازشهای گرافیکی را انجام دهد، تک منظوره بودن است.
CPU
برای اجرای یک بازی، باید همه دادهها و امکانات بازی را مورد پردازش قرار
دهد؛ مانند هوش مصنوعی، اجرای فایلهای گرافیکی و صوتی و انجام دادن هر
آنچه که موردنیاز است تا بازی بارگذاری، اجرا و انجام شود. درضمن، پردازش
گرافیکی یکی از سنگینترین کارهایی است که یک پردازنده باید انجام دهد. با
واگذاری این کار به واحد پردازش گرافیکی، این پردازنده ویژه، درگیر دیگر
پردازشهای سیستم نمیشود و از اینرو سریعتر از پردازنده اصلی این کار
را انجام میدهد. با این کار، طراحان بازی میتوانند با دستی فراختر به
ساخت بازیهایی با گرافیک پیچیدهتر و جزئیات بیشتر اقدام کنند.
T&L،
دو موتور جدا از هم در پردازنده گرافیکی برای ترسیم تعداد بسیار زیادی
چندضلعی در برنامههای گرافیکی پیچیده است. انتقال (Transform)
تعیینکننده پیچیدگی و تعداد اشیا، بدون ایجاد وقفه درمیزان نمایش فریمها
برای نشان دادن روی صفحه نمایشگر است. Lighting (نوردهی) هم با تغییر
نوردهی اشیا براساس منابع نور به صحنه افزوده میشود.
شکل1- با پردازش پردازههای گرافیکی توسط پردازنده گرافیکی شتابدهنده، CPU میتواند دستورات دیگری را انجام دهد. |
شکل 1، تفاوت پردازش در
سیستمهایی که از یک پردازنده گرافیکی معمولی در کارت گرافیک و یک
CPU استفاده میکنند را با سیستمهایی که از یک پردازنده گرافیکی
شتابدهنده (GPU) بهره میبرند نشان میدهد.
در این شکل،
نمودار اول، سه پردازه رندرینگ، T&L و پردازههای فیزیکی، هوش مصنوعی
و اجرای بازی را نشان میدهد. در سیستمهای معمولی، T&L، هوش مصنوعی،
پردازش فیزیکی مدلها و پردازههای انجام بازی همگی توسط CPU انجام
میشود.
انجام همه این دستورها توسط CPU، باعث میشود که
طراحان بازی، از هوش مصنوعی و جزئیات فیزیکی کمتری استفاده کنند. در
نمودار دوم، پردازههای رندرینگ و تبدیل و نوردهی توسط GPU انجام میشود.
از اینرو طراحان بازی میتوانند از هوش مصنوعی و جزئیات فیزیکی بیشتری در
بازیهایشان استفاده کنند. چرا که CPU میتواند آسانتر از پیش آنها را
پردازش کند.
شکل 2 |
nVidia با شکل 2، تاثیر
یک GPU در بالا بردن کارایی یک سیستم و اینکه طراحان بازی با وجود این
سختافزار تا چه اندازه میتوانند جزئیات بیشتر و پیچیدهتری را در
بازیهایشان قرار دهند نشان میدهد.
اتومبیل سمت چپ با جزئیات
کمتر نشاندهنده سادهتر بودن طرحها در صورت عدم استفاده از GPU و
اتومبیل سمت راست با پیچیدگی و جزئیات بیشتر، نشاندهنده گرافیکی با
جزئیات بیشتر در صورت استفاده از GPU و شتاب سختافزاری است.
شکل 3 - کارت گرافیکی nVidia Geforce 7800 GTX با پردازندههای گرافیکی پیشرفته و 512 مگابایت حافظه رم. |
در ساخت GPUهای موجود
روی بوردهای گرافیکی Geforce از حدود بیست و سه میلیون ترانزیستور (بیش از
دو برابر پیچیدهتر از پردازندههای پنتیوم 3) استفاده شده است که توانایی
پردازش پانزده میلیون چندضلعی و 480 میلیون پیکسل در ثانیه را دارد و از
128 مگابایت حافظه فریم بافر پشتیبانی میکند.
یکی از تازهترین
محصولات nVidia تا سال 2006، GPUهای Geforce 7800 GTX است که در پردازشگر
گرافیکی آن از سیصد و دو میلیون ترانزیستور استفاده شده است و میتواند
13.2 میلیارد پیکسل را در هر ثانیه پر کند. بزرگترین تفاوتهای این کارت
گرافیک با نوع پیشین خود، عبارتند از:
- موتورهای بافت و پیکسل جدید
- استفاده از بیست و چهار مسیر در ساختار آن در مقایسه با شانزده مسیر در مدل قبلی
- بهینهترشدن مسیرها وافزایش کارایی و قابلیت برنامهریزی shader
- افزایش سرعت کلاک
nVidia
برای افزایش شگفتانگیز سرعت GPUهای نسل چهارم خود از فناوری nVidia
CineFX 4.0 استفاده میکند. با استفاده از این فناروی، توسعهدهندگان
میتوانند افکتهای گرافیکی پیشرفتهتر و با کیفیت بیشتری را برای
بازیهای کامپیوتری و نرمافزارهای گرافیکی دیگر ایجاد کنند. CineFX 4.0
از DirectX 9.0 پشتیبانی میکند.
nVidia SLI نیز فناوریای است که
این شرکت با استفاده از آن از دو GPU به صورت موازی برای افزایش کارایی
سیستم گرافیکی استفاده میکند.
شکل4- GPU کارت گرافیک nVidia Geforce 7800 GTX |
nVidia، از فناوری UltraShadow II نیز در شتاب گرافیکی برای ایجاد سایههای پیچیده استفاده میکند. (شکلهای 3 و 4)
اما شرکت nVidia در ساخت این تراشهها تنها نیست و ATi نام مهم دیگری در این حوزه است.
در
سال 2003، شرکت مایکروسافت و ATI Technologies قراردادی بستند که برطبق
آن، ATI باید فناوریهای گرافیکی سفارشی و پیشرفتهای را برای نسل بعدی
کنسولهای اکسباکس فراهم میکرد.
Bob Feldstein، سرپرست بخش
مهندسی شرکت ATI Technologies میگوید: <هدف این شرکت ساخت یک پردازنده
گرافیکی بود که تا پنج سال نیازی به ارتقا نداشته باشد.>
C1
نام رمزی بود که در ATI، پیش از بسته شدن قرارداد با مایکروسافت برای این
پردازنده به کار میرفت و پس از قرارداد از نام Xenos برای آن استفاده شد.
175 مهندس روی ساخت این GPU کار کردهاند و در آن از 337 میلیون
ترانزیستور استفاده شده است.
این قرارداد با ATI، به همکاریهای پیشین مایکروسافت و nVidia پایان داد.
شتاب سختافزاری و نرمافزاری شکل5 - فراخوانیهای OpenGl API شکل6 - فراخوانی Direct 3D API
منظور
از شتاب سختافزاری (hardware 3D acceleration)، رندر نمودن و ترسیم
گرافیک سه بعدی با استفاده از پردازندههای گرافیکی کارتهای گرافیک
(GPU) به جای استفاده از پردازنده اصلی (CPU) است. چنانچه این کار به
وسیله CPU انجام شود، به آن شتاب نرمافزاری (software acceleration) گفته
میشود. چرا که CPU برای هرگونه ترسیم گرافیکی، از کتابخانههای گرافیکی
پلتفرم نرمافزاری سیستم خود مانند Mesa در سیستمهای لینوکس و
کامپوننتهای DirectX در سیستم ویندوز استفاده میکند. اگر اینکار را
GPU انجام دهد، به آن شتاب سختافزاری گفته میشود.
اما فناوری شتابدهندههای سهبعدی در بازیهای کامپیوتری تاریخچهای چندساله دارد.
در
سال 1974، Ed Catmull (کسی که بعدها سرپرست بخش گرافیک شرکت لوکاس فیلم
شد) پیشنهاد استفاده ازtexturing mapping ،zbuffering، و modeling را با
سطوح خمیده داد.این روشها هنوز هم در همه کارتهای شتابدهنده استفاده
میشوند.
Texture mapping، روشی برای ترسیم بافت روی یک شی و
محاسبه رنگ بافت برای هر پیکسل است و Zbuffer بخشی از حافظه گرافیکی است
که برای ذخیره بعد سوم (Z) یا اطلاعات عمق درباره اشیای رندر شده به کار
میرود. مقدار Zbuffer یک پیکسل، مشخص میکند که آن پیکسل در پشت پیکسل
دیگر قرار دارد یا جلوی آن. اینکار از جایگزینی (overwriting) اشیای
پسزمینه با اشیای پیشزمینه جلوگیری میکند.
دو سال بعد، Jim
Blinn، روشهای reflection mapping و bump mapping را توسعه داد که بدون
افزودن چندضلعیهای اضافی، جزئیاتی را به مدل سهبعدی میافزود.
Bump
mapping، یک روش سایهپردازی با استفاده از بافتهای چندگانه و افکتهای
نورپردازی است که برای شبیهسازی چروک، فرورفتگی و برآمدگی سطوح بهکار
میرود و بسیار پرکاربرد است. چون به یک سطح سهبعدی، بدون اینکه به
پیچیدگی هندسی آن بیفزاید، جلوههایی مانند سختی و جزئیاتی مانند فرورفتگی
میبخشد.
Reflection mapping، قابلیت سختافزار در استخراج سریع
اطلاعات از صحنه است که این اطلاعات میتواند در ایجاد بافتهای شفاف
مورد استفاده قرار گیرد.
به
علت وجود تنوع گسترده در کارتهای گرافیک، و سخت شدن برنامهنویسی برای
آنها توسط توسعهدهندگان، APIهای گرافیکی به عرصه آمدند که بازیگران اصلی
آن، امروز DirectX و OpenGL هستند. OpenGL کتابخانه مدلسازی و
سهبعدیسازی است که بسیار سریع و قابل حمل است.
برای مطمئن بودن
از سازگاری یک سختافزار خاص با OPenGL، آن قطعه باید تست کارکرد OpenGL
را پشت سر بگذارد که مجموعهای از تستهای طراحی شده برای ایجاد اطمینان
از طراحی و تولید سیستمی مناسب برای رندرهای سهبعدی است. شکل 5، مراحل
این تست را نشان میدهد.
زمانی که OpenGL API فراخوانی میشود،
دستورها در بافر دستور، و دادههای برآمدگی و بافت در بافر یکسانی قرار
میگیرند. وقتی بافر خالی میشود، محتوای آن به مرحله بعدی در
pipeline میرود. مرحله انتقال و نوردهی با برآمدگیها برای آمادهسازی و
قرارگیری در مکان خود، محاسبه میشوند و محاسبات نوردهی برای رندرکردن رنگ
و سایهزنی در هر برآمدگی بهکار میرود. پس از مرحله T&L، داده وارد
مرحله rasterization میشود.
Rastirizer در واقع با استفاده از
مشخصات هندسی و بافتها تصویری دوبعدی ایجاد میکند. این تصویر سرانجام
وارد فریم بافر میشود که در حافظه کارتگرافیک قرار دارد. (تصویر در این
مرحله میتواند روی نمایشگر نشان داده شود).
DirectX نیز کتابخانه
توسعه چندرسانهای است که توسط مایکروسافت ساخته شده است. یکی از
کامپوننتهای آن Direct 3D است که در اصل توسط شرکتی انگلیسی به نام
RenderMorphics ساخته شده است و سپس توسط مایکروسافت توسعه داده شد و
کامپوننتی از کتابخانه DirectX گردید.
D3D)
Direct 3D)، مستقل از نوع سختافزار میتواند به شتابدهندههای گرافیکی و
توابع رندرکننده گرافیک سهبعدی دسترسی پیدا کند. در شکل6، نحوه فراخوانی
Direct 3D نشان داده شده است.
بافر اجرا (Execure
Buffer) درDirect 3D کمی شبیه بافر دستور (Command Buffer) در OpenGL
است. بافر اجرا شامل اطلاعات هندسی و دستورهایی برای اجرا است. برخلاف
بافر دستور در OPenGL، بافرهای اجرا در D3D کمی کند هستند.
آخرین
بخش در فراخوانی D3D ،DirectDraw است که در واقع دسترسی به فریم بافر را
برعهده دارد. محدودیت دیگرDirect 3D نسبت به OpenGL آن است که تنها از سه
ضلعیها پشتیبانی میکند. ولی OpenGL از چندضلعیها پشتیبانی مینماید.
روشهای پیشرفته در رندر گرافیکی
در
ادامه، افکتهایی که در گرافیکهای پیشرفته کامپیوتری مورد استفاده قرار
میگیرند معرفی میشوند که مقدار زیادی از کار پردازندههای گرافیکی،
پردازش آنهاست. بخش بزرگی از این افکتها برای رفع خطای دید و نمایش درست
صحنهها به کار میروند که به برخی از آنها اشاره میشود.
Anti-aliasing بیشتر
کاربران دوست دارند تصویرها را در کامپیوتر، با وضوحی بسیار بالا ببینند.
تنها وضوح بالای نمایشگر نمیتواند به این خواسته آنان پاسخ دهد. چون این
چشم انسان است که وضوح تصویرها را تشخص میدهد. به همین علت یک فیلم MPEG1
با وضوح 320 در 240 پیکسل با کیفیت بهتری از یک تصویر سهبعدی رندر شده با
وضوح 1024 در 768 پیکسل دیده میشود. به همین علت anti-aliasing نقشی
تعیینکننده در ایجاد تصویری نزدیک به واقعیت دارد. شکل 7 - صفحه چپ بدون استفاده از فیلتر Bilinear و نقشه MIP و صفحه سمت راست با استفاده از آن ساختهشدهاست. شکل 8- ساخت تصویرهای کوچک تر برای اصلاح زاویهها
یک
مانع بر سر راه نمایش گرافیک با وضوح بسیار خوب افکت under-sampling است.
این افکت باعث میشود که اشیای دارای بافت، با کوچکترشدن تصویر وضوح
بیشتری پیدا کنند.
برای نمونه بازسازی مجازی یک صفحه شطرنجی روی
مانیتور که در فضای سهبعدی تا دوردست ادامه مییابد؛ مانند آنچه که در
شکل 7 دیده میشود.
بدون استفاده از فیلتر درخشندگی جزئی
(shimmering)، چشم شما صفحه را در دوردست با خانههای درهم رفته میبیند.
ولی با افزودن این فیلتر، آن بخشهای صفحه، با رنگ درخشنده خاکستری دیده
میشود که در آنجا رنگ پیکسلها یکی سیاه و یکی سفید است.
این
خطای دید که در شکل 7 نشان داده شده است میتواند توسط فیلتر bilinear و
نقشههای MIP کاهش داده شود. ایده اصلی نقشه MIP براساس پیش پردازش
بافتها در مراحل گوناگون است که پس از بافتهای کوچکتر برای چند
ضلعیهای دورتر از محدوده دید استفاده میشود.
فیلتر bilinear نیز برای بافتهایی که بزرگنمایی شدهاند تا سطوح ناصاف آنها صافتر دیده شود به کار میرود. (شکل 8)
یک
روش دیگر برای رفع خطای دید که با استفاده از شتابدهنده سختافزاری
پیادهسازی میشود، supersamplingاست. supersampling صحنه گرافیکی را در
بافری با گنجایش بیشتر از وضوح نمایشگر ترسیم میکند و اندازه آن را تا
جایی که قابل نمایش روی مانیتور باشد، کاهش میدهد.
این فیلتر،
گروهی از پیکسلها را از تصویر اصلی برمیگزیند و تاثیر آنها بر یکدیگر
را محاسبه میکند. نتیجه این جمعبندی، در یک تصویر بیت مپ فیلتر شده قرار
میگیرد و سپس به فریم بافر منتقل میشود تا تصویری بدون خطای دید نشان
داده شود؛ هر چند این کار به اندازه قابل توجهی حافظه ویدیویی و پهنای
باند نیاز دارد. (پهنایباند هنوز هم محدودیت اصلی بسیاری از
شتابدهندههای سختافزاری است. بیشتر شتابدهندهها مانند محفظهای بزرگ
با گذرگاهی تنگ هستند).
روش دیگر که در کارتهای Geforce 3 از آن
استفاده شده، multisampling است. nVidia سازنده این کارتها، این روش را
به صورت انحصاری به کار برده و آن را High Resolution Antialiasing) HRAA)
یا Quincunx antialiasin نامیده است. این روش از فیلتر بازسازیکننده یا
reconstruction filter استفاده میکند که از دادههای پیکسلهای اطراف یک
پیکسل در یک نقطه خاص استفاده کرده و رنگ آن نقطه را محاسبه میکند.
در
روش Quincunx ،nVidia، برای رفع خطای دید، دیگر ناچار نیست وضوح هشتصد در
ششصد را به 1600 در 1200 افزایش و سپس هنگام انتقال به سختافزار آن را
کاهش دهد. Quincunx مجموعهای از پنج شی است که چهار عدد از آنها در
چهاروجه یک مکعب و پنجمی در وسط آن قرار میگیرد. این کار، اطلاعات را از
پیکسلهای اطراف یک پیکسل خاص استخراج میکند تا خطهایی را که کاملاً
افقی یا عمودی نیستند صاف نشان دهد. این کار به معنی کاهش قابل توجه در
اشغال حافظه و پهنایباند است.
Motion Blur
چشم
انسان تنها قادر به پردازش صحیح 25 تا سی فریم در هر ثانیه است و در
صحنههای تاریک این تعداد، کاهش مییابد. به همین خاطر هم انیمیشنهای
سهبعدی بلادرنگ با وجود اینکه میزان نمایش آنها، 24 فریم در ثانیه
است، با دقت کمتری نسبت به فیلمهای سینمایی که با همان سرعت نمایش داده
میشوند به نظر میآیند.
نوعی از aliasing زمانی (temporal aliasing) را میتوان در فیلمهای سینمایی یا حتی در دنیای واقعی نیز دید.
در
یک فیلم کابویی هنگامی که چرخهای گاری به حرکت درمیآیند، پس از چند
ثانیه که سرعت چرخش آنها افزایش مییابد، ناگهان به نظر میرسد که چرخها
شروع به چرخش در جهت مخالف میکنند. این امر زمانی اتفاق میافتد که سرعت
حرکت چرخها از سرعت ثبت فریمها توسط دوربین بیشتر میشود. در دنیای
واقعی نیز زمانی که سرعت چرخش چرخهای یک اتومبیل از سرعت پردازش تصویر
توسط چشم شما (25 تا سی فریم در ثانیه) بیشتر میشود، به نظر میرسد که
چرخها در جهت مخالف میچرخند.
در گرافیکهای سهبعدی، بدون
استفاده از تار کردن حرکت (motion blurring)، حاصل کار حتی بدتر از
فیلمهای سینمایی خواهد شد. motion blurring با افزودن ویژگی (blur تار
کردن)، حرکتهای تند را به نرمی و در جهت درست آن بازسازی میکند تا دیگر
جهت چرخش چرخها یا هر حرکتی نظیر این، وارونه به نظر نرسد.
Depth of Field
شکل 9- چگونگی پردازش Accumulative Buffer در ایجاد Focus.
چشم
انسان میتواند روی یک شی خاص، متمرکز یا فوکوس شود و جاهای دیگر تصویر در
حالت disfocus یا معمولی قرار گیرد. این افکت میتواند با استفاده از
بافری به نام accumulative buffer ساخته شود. ایده این کار، رندر کردن
چندگانه با منبع نقطه دید با اختلاف جزئی در اطراف موقعیت اصلی است.
هدف
نقطه دید در محدوده فوکوس قرار میگیرد. در شکل7، چگونگی کار accumulative
buffer نشان داده شده است. در شکل 9، محدوده فوکوس، پر رنگتر از محدوده
دید معمولی است.
تفاوت در شتابدهندهها
در
پایان، یکی از تفاوتهای شتاب سختافزاری و شتاب نرمافزاری را میتوان با
یکی از screen saverهای ویندوز دید. معمولاً در بیشتر ویندوزهای امروزی و
نیز ویندوز اکسپی، یک محافظ صفحهنمایش به نام 3D Text وجود دارد که به
وسیله آن میتوانید کارایی دو روش شتاب نرمافزاری و سختافزاری را در
نمایش گرافیک سهبعدی ببینید.
برای این کار، نخست وضوح صفحه
نمایشتان را تا آنجا که مانیتورتان از آن پشتیبانی میکند افزایش دهید،
مانند 1024*1280 با کیفیت رنگ 32 بیتی. معمولاً اگر کارت گرافیک شما به
درستی نصب شده باشد باید گزینهDisable hardware 3D rendering غیرفعال
باشد. آن گزینه را علامت بزنید تا انتخاب شود. با این کار، شما میخواهید
رندر این متن گرافیکی سهبعدی را بدون استفاده از پردازنده کارت گرافیک
انجام دهید. سپس به منویProperties که بازگردید و سپس روی Preview کلیک
کنید تا screen saver، نمایش داده شود.
خواهید دید که این مدل سه
بعدی چندان نرم و سریع به نمایش در نمیآید؛ زیرا این مدل با شتاب
نرمافزاری رندر میشود. برای فعال نمودن شتاب سختافزاری، دوباره آنچه را
که در بالا گفته شد انجام دهید. ولی در آخرین منو، علامت گزینه Disable
hardware rendering را بردارید. با این کار، رندر با استفاده از شتاب
سختافزاری و پردازنده کارت گرافیک شما انجام میشود. این بار با کلیک روی
Preview، نرمتر و سریعتر به نمایش در آید.
برای دسترسی به کنترل
میزان شتاب سختافزاری نیز میتوانید در دسکتاپ کلیک راست کنید و به
ترتیبproperties ،setting ،advanced و troubleshoot را برگزینید. در بخش
Hardware acceleration میتوانید مقدار آن را کم یا زیاد کنید. معمولاً
برای بازیهای کامپیوتری پیشنهاد میشود شتاب سختافزاری روی Full باشد.
منابع
A Review Of 3-D Accelerator Technology
For Games
Nathan Chia ، Richard Cant ، David Al-Dabasswww.nVidia.com
www.PCTechGuide.com
www.pcper.com
www.megalong.com
www.gentoo.com