به
سختی میتوان نقطه آغازی را برای عصر گرافیك كامپیوتری مشخص كرد
بهگونهای كه همه ناظران و كارشناسان درباره آن اتفاق نظر داشتهباشند.
عدهای معتقدند، گرافیككامپیوتری از الگوهایی كه روی كارتهای پانچ ایجاد
شده بودند، آغاز میشود و حتی افرادی وجود دارند كه تعدادی از طرحهای
مشهور را با استفاده از این الگوها ایجاد كرده و همانند مجموعهداران
حرفهای نگهداری میكنند و پس از آن نوبت به چاپگرهای كامپیوتری میرسد كه
تنها قادر به چاپ كاراكترهای كامل بودند (نه نقاط جداگانه).
برنامهنویسان باهوش متوجه شدند، میتوانند با جدولهایی از كاراكترها
بازی كرده و از كاراكترهای مختلف برای تولید تصاویر گرافیكی ابتدایی
استفادهكنند. این قابلیت در زمان خود به حدی انقلابی به شمار میآمد كه
بسیاری از كارشناسان حتی تصور نمیكردند گام دیگری در این حوزه برداشته
شود. بسیاری از ما هنوز طرحهایی را كه با استفاده از كاراكترهای ASCII
ایجاد میشدند، به یاد داریم.
سپس
نوبت به سیستمهایی رسید كه از نمایشگرهای تكرنگ با یك آداپتور MDA
(سرنامMonochrome Display Adapter) استفاده میكردند. این كارتها فاقد هر
گونه حالت گرافیكی بوده و تنها یك حالت متنی تكرنگ را نمایش میدادند.
نخستین واحد پردازنده گرافیكی واقعی برای PC در سال 1981 تحت عنوان CGA
(سرنام
Color Graphics Adapter) معرفی شد. این محصول نخستین كارت گرافیكی رنگی
بود و در عین حال نخستین استاندارد نمایش رنگی كامپیوتری برای IBM PC به
شمار میآمد. كارتهای گرافیكی CGA شركت آیبیام به شانزده كیلوبایت
حافظه ویدیویی مجهز بودند و از چند حالت گرافیكی و متنی پشتیبانی
میكردند. بالاترین تفكیكپذیری در بین این حالتهای مختلف، 200×640
پیكسل و بالاترین عمق رنگ قابل دستیابی نیز چهار بیت (شانزده رنگ) بود.
این كارتهای گرافیكی بسیار ابتدایی بوده و در بیشتر موارد تنها یك RAMDAC
و حافظه را دربرمیگرفتند.
یك
سال پس از معرفی CGA توسط آیبیام شركت دیگری كارت گرافیكی HGC
(سرنامHercules Graphics Card) را معرفی كرد كه تنها قادر به پشتیبانی از
گرافیكهای تكرنگ (یك بیتی) بود، اما از حداكثر تفكیكپذیری 348×720 پیكسل
پشتیبانی میكرد.در سال 1984 با پیشرفت IBM AT كه جانشین IBM PC به شمار میآمد، یك آداپتور گرافیكی جدید با نام EGA (سرنام
Enhanced Graphics Adapter) معرفی شد كه امكان نمایش شانزده رنگ را بهطور
همزمان با تفكیكپذیری 350×640 پیكسل فراهم میكرد. این كارت به یك ROM
شانزده كیلوبایتی برای توسعه BIOS در زمینه توابع گرافیكی اضافی،
تولیدكننده آدرس ویدیویی Motorola MC6845 و همچنین 64 كیلوبایت حافظه
ویدیویی (قابل ارتقا به 256 كیلوبایت) مجهز بود. شركت آیبیام در سال 1987
آداپتور گرافیكی VGA را بهعنوان جانشین EGA معرفی كرد. VGA آخرین
استانداردی بود كه توسط آیبیام معرفی شد. این استاندارد تفاوتهای
چشمگیری با نسخههای پیش از خود داشت، زیرا نخستین نمونهای بود كه Scroll
روان، تقسیم صفحه نمایش و عملیات Raster را بهصورت سختافزاری پشتیبانی
میكرد. این كارت 256 كیلوبایت حافظه ویدیویی داشت و از حالتهای 16 یا
256 رنگی از یك پالت 262144 رنگی (RGB 6 بیتی) پشتیبانی میكرد. VGA در
عین حال نخستین كارت گرافیكی بود كه همه بخشهای مختلف را در یك تراشه
واحد تركیبكرد و به همین دلیل بهعنوان جد تمام GPUهای مدرن شناخته
میشود.
با
افول آیبیام از جایگاه حكمرانی و اعمال استاندارد در بازار كامپیوترهای
شخصی و در عین حال معرفی سیستم عاملهای پنجرهای مانند ویندوزهای 2,1، 3
و 3,11 مایكروسافت، IBM PS/2 و نسخههای بعدی، حوزه تراشهها و كارتهای
گرافیكی با یك شكوفایی ناگهانی مواجه شد و تعداد زیادی از فروشندگان و
تراشههای گرافیكی جدید، وارد این میدان شدند كه از نظر ویژگیها،
تفكیكپذیریهای نمایشگر و عملكرد تاحدود زیادی با یكدیگر تفاوت داشتند.
با اینحال، وضعیت پیشآمده برای برنامهنویسان نرمافزارهای كاربردیای كه
از این محصولات پشتیبانی میكردند، به یك كابوس واقعی تبدیل شد و به همین
دلیل، بیشتر برنامهنویسان مدتها بر استاندارد VGA تكیه داشتند كه تمام
كارتها (حتی تا امروز) هنوز با آن سازگار بودند. VESA (سرنام
Video Electronics Standard Association) برای حل این مشكل VBE (سرنام
VESA BIOS Extensions) را معرفی كرد كه یك اینترفیس عمومی برای دسترسی به
كارتهای ویدیویی منطبق را با عمق رنگ و تفكیكپذیریهای بالا تأمین
میكرد. VBE در عین حال امكان دسترسی به بافر فریم خطی كارت را بهوجود
میآورد.
بسیاری از كارتهای گرافیكی در این دوره زمانی، سطحی از عملكردهای دو بعدی پیشرفته را ارائه میكردند كه بیشتر شامل
bit Blitting و بافرگذاری دو یا سهگانه بودند و برای شتابدهی ترسیم
ویجتها و پنجرهها مورد استفاده قرار میگرفتند. نخستین تراشه گرافیكی كه
شتابدهی سهبعدی را روی كامپیوترهای رومیزی معرفی كرد، Matrox Impression
بود؛ یك كارت الحاقی برای كارت گرافیكی Matrox Millennium كه برای بازار
PC CAD در نظر گرفته شده بود.نخستین
پیشرفت واقعی در تراشههای گرافیكی سهبعدی مخصوص پیسی، معرفی تراشه
گرافیكی Voodoo توسط 3dfx Interactive بود، شركتی كه توسط یكی از كاركنان
سابق SGI در سال 1994 تأسیس شد. Voodoo نیز همانند Matrox Impression یك
كارت الحاقی PCI به شمار میآمد كه فاقد RAMDAC اختصاصی بود، اما به یك
كارت گرافیكی دو بعدی استاندارد متصل میشد.
Voodoo
آغازگر یك عصر جدید در حوزه گرافیكهای سهبعدی روی كامپیوترهای شخصی
بود و نقطه پایانی را برای انحصارطلبی ایستگاههای كاری گرافیكی گرانقیمت
رقم زد. 3dfx در عین حال API اختصاصی خودش را با نام Glide معرفی كرد كه
راهبرد متفاوتی را نسبت به تمام APIهای دیگر همزمان خود
(Direct3D، OpenGL، QuickDraw3D و Intel 3DR) به همراه داشت. در واقع این
API برخلاف سایرین جزئیات سطح پایین سختافزاری را در پشت یك لایه
انتزاعی پنهان نمیكرد و تنها بر قابلیتهای واقعی تراشه خود تكیه داشت.
این وضعیت یك مزیت عملكردی قابل توجه را برای Glide به همراه داشت، زیرا
سربار یك لایه انتزاعی میتواند هزینه بالایی را در زمینه پردازش CPU و
حافظه به همراه داشته باشد.
در سال 1998، شركت Nvidia چهارمین تراشه گرافیكی این شركت را تحت عنوان RIVA TNT (سرنام Real-time Interactive Video and Animation accelerator TwinTexel)
معرفی كرد. TwinTexel (همانطور كه از نام آن مشخص است) دو خط لوله
بافتگذاری را به همراه فیلترگذاری بافت Trilinear معرفی كرد. برخلاف تراشه
گرافیكی Voodoo و اسلاف آن، RIVA TNT كاملاً با OpenGL 1.1 سازگار بود و
در عین حال از یك ZBuffer 24 بیتی و یك بافر فریم رنگ 32 بیتی بهره
میگرفت.یكسال
بعد، Nvidia تراشه GeForce 256 خود را به عنوان نخستین GPU جهان معرفی
كرد و به این ترتیب عبارت واحد پردازنده گرافیكی متولد شد. این محصول،
نخستین پردازنده تكتراشهای با موتورهایTransform
،Lighting ،triangle setup/clipping ،Texture و رندر در داخل خود بود.
توجه داشته باشید كه تا این زمان عملیات T&L (سرنام Transform &
Lighting) كاملاً بر عهده پردازنده مركزی سیستم بود. یك نسخه حرفهای از
این كارت با نام Quadro، نقطه ورود Nvidia به بازار ایستگاههای كاری
سهبعدی حرفهای به شمار میآید. از سوی دیگر، GeForce 256 به سطحی از
عملكرد دست یافت كه با ایستگاههای كاری سه بعدی سطح بالا و حرفهای SGI در
آن زمان (كه از موتور Infinite Reality استفاده میكردند) رقابت میكرد.
GeForce 256 با OpenGL 1.2 و همچنین Direct3D 7 كه نورپردازی و بافتگذاری
سختافزاری را در API ارائه میكرد، سازگاری كامل داشت. مرحله بعدی در
سیر تكامل GPUها، عرضه GeForce 3 در سال 2001 بود. GeForce 3 نخستین
تراشهای به شمار میآمد كه ویژگیهای قابل برنامهریزی سفارشی را در
خطلوله گرافیكی متداول (كه تا آن زمان ثابت بود) معرفی كرد.
مفهوم
سایهزنهای پیكسلی (یا Pixel Shader و Vertex Shader) و رأسی در همین
زمان متولد شدند. Direct3D 8 نخستین API گرافیكی بود كه بخشهای قابل
سفارشیسازی اجباری را در یك خطلوله پیادهسازی میكرد. حتی با وجود این
واقعیت كه مجموعه ویژگیهای سایهزنهای پیكسلی و رأسی در آن زمان بسیار
محدود بود، هنوز میتوانست مبنایی برای یك الگوی عمومی باشد كه تا امروز
ادامه داشته است. هر
دو گروه ورودیهای پیكسلی و رأسی را میتوان بهعنوان یك جریان واحد در
نظر گرفت كه در آن، تعداد پیكسلها یا رئوس ورودی به واحد پردازنده با
تعداد پیكسلها یا رئوس خروجی از آن مساوی است. امكان كپی، تكرار و افزایش
تعداد پیكسلها یا رئوس در طول فرآیند پردازش وجود ندارد، اما آنها
میتوانند تحت شرایط و هزینههای معینی حذف شوند. هر یك از این پیكسلها و
رئوس در تئوری میتوانند بهطور مستقل از یكدیگر پردازش شوند، اما همه
آنها یك كد برنامهریزی اجرایی یكسان را پشت سر میگذارند كه به رفتار یك
پردازنده سنتی شباهت دارد.
ATI
Radeon 8500، ضمائم بیشتری را به این دو واحد قابل برنامهریزی جدید
اضافه كرد كه در Direct3D 8.1 معرفی شده بودند. این پردازنده گرافیكی،
نسخههای 1,1، 1,2، 1,3 و 1,4 از Pixel Shader و نسخه 1,1 از Vertex
Shader را به API اضافه كرد كه به طور اساسی با تغییر زبان اسمبلی
مورداستفاده و اضافهشدن دستورالعملهای جدیدی كه امكان توسعه برنامههای
طولانیتر و عملیات بافت بیشتر را فراهم میكردند، همراه بود.انتشار
Direct3D 9 و سپس Direct3D 9C، نقطه عطف دیگری در زمینه قابلیت
برنامهریزی GPUها به شمار میآید. این نسخه، برنامههای پیكسلی و رأسی را
بیش از پیش ارتقا داده و به نسخههای 2، +2 و 3 برای هر یك از Shaderهای
مذكور رساند. همچنین، این API یك زبان سطح بالای شبیه C-Style/Rendermen
را به طبیعت اسمبلی برنامههای پیكسلی و رأسی قبلی اضافه كرد كه HLSL
نامیده میشد و امكان نوشتن برنامههای پیكسلی و رأسی را در یك قالب
انتزاعیتر، قابل خواندن و قابل استفاده دوباره فراهم میكرد.
برای
دستیابی به این هدف، مفهوم كامپایل كد به دنیای GPU معرفی شد، درست
همانطور كه CPUها چند دهه پیش با این مفهوم آشنا شده بودند (كه متأسفانه
تا امروز هیچ بلوغ واقعی در این زمینه روی CPUها به چشم نمیخورد). در طول
همین زمان، OpenGL با افول و سپس خروج SGI بهعنوان نیروی محركه اصلی خود،
كم و بیش با تغییرات سریع و چشمگیر صنعتی دست و پنجه نرم میكرد و برای
مدت زیادی در ارائه راهحلهای جدید ناتوان ماند. این وضعیت با معرفی
OpenGL 1.5 و سپس OpenGL 2.0 كه با یك زبان Shading سطح بالا برای برنامههای پیكسلی و رأسی موسوم به GLSL همراه بودند، تغییر كرد.
در
سال 2006، مایكروسافت با انتشار Direct3D 10، یكبار دیگر رهبری جریانی
را برای ایجاد تغییرات بنیادیتر در دنیای APIهای گرافیكی بر عهدهگرفت.
این API تنها از طریق سیستمعامل جدید ویندوز ویستای مایكروسافت قابل
دسترسی بود. مایكروسافت تلاش كرد، مجموعه گستردهای از نسخههای متفاوت
سایهزن و قابلیتهای GPU را در یك ماهیت واحد تركیب كند و این كار را با
وادار كردن فروشندگان سختافزاری به پیادهسازی یك هسته سایهزنی متحد
انجام داد. این ساختار جدید به معنای آن بود كه امكان اداره هر دو گروه
پردازشهای رأسی و پیكسلی توسط یك واحد قابل برنامهریزی واحد وجود داشت،
در حالی كه تا آن زمان واحدهای قابل برنامهریزی جداگانهای برای
خطلولههای رأسی و پیكسلی مورد استفاده قرار میگرفتند (مانند شرایطی كه
در Direct3D 9). مزیت یك واحد سایهزنی متحد این بود كه بر حسب نوع
سنگینترین بار كاری در برنامه گرافیكی شما، مقدار بیشتری از قدرت كلی
پردازش میتوانست بهطور خودكار به آن اختصاص پیدا كند. به
این ترتیب، بهصورت تئوری هرگونه گلوگاه پردازشی از بین میرفت. البته،
این متحدسازی تنها روی كاغذ تعریف شده بود و پیادهسازی آن بهطور مناسب
بر عهده خود فروشندگان پردازندههای گرافیكی گذاشته شد.
علاوه
بر مدل Shading متحد، Direct3D 10 یك مرحله قابل برنامهریزی دیگر با نام
Geometry Shader را نیز به خطلوله رندر اضافه كرد و در عین حال یك مدل
حافظه مجازی جدید را به همراه داشت.در
همین مدت، دو فروشنده اصلی بازار سختافزارهایگرافیكی، یعنی Nvidia و
AMD/ATI نیز APIهای خود را برای شكستن جعبه سیاه و حذف مدل لایه انتزاعی
GPU كه API گرافیكی آن را ایجاد میكرد تا دسترسی برنامهنویسان به توابع
سختافزاری داخلی این تراشهها را محدود سازد، معرفی كردند. با تمركز روی
مفهوم و بازار در حال رشد GPGPU و HPC، این APIها به برنامهنویسان امكان
میدادند تا بیشتر از قدرت محاسباتی GPUهای مدرن بهرهگیری كرده و در عین
حال هزینه این مزیت را با كاهش قابلیت انتقال كدهای خود و افزایش پیچیدگی
آنها بپردازند. Direct3D 11 گام بزرگ دیگری را به سمت پشتیبانی از مفهوم
GPGPU برداشت. این API كه بهعنوان بخشی از سیستم عامل ویندوز 7 منتشر شد،
چند ویژگی جدید را به همراه داشت:
Tessellation: برای افزایش تعداد چندضلعیهای قابل مشاهده در یك مدل چندضلعی با جزئیات پایین در زمان اجرا
رندر Multithreaded: برای رندر یك آبجكت ابزار Direct3D واحد، استفاده از رشتههای پردازشی متفاوت در پردازندههای چند هستهای
Compute Shader: امكان بهرهگیری از خطلوله Shader را برای انجام وظایف غیرگرافیكی مانند پردازش جریان و شتابدهی توابع فیزیكی فراهم میكند.