ادامهٔ ۱.۴.۲ سامانهٔ بینایی انسان
میزان روشناییای که از یک جسم ادراک میکنیم فقط به انرژی تابشی آن وابسته نیست. سامانهٔ بینایی انسان به نور قرمز تکرنگ ــ یعنی نور با یک بسامد ــ همان پاسخی را نمیدهد که به نور سبز تکرنگ میدهد. اگر این دو نور انرژی یکسانی گسیل کنند، بهسبب پاسخ نابرابر سلولهای مخروطی چشم به نور قرمز و سبز، روشنایی آنها برای ما متفاوت به نظر میرسد. حساسیت انسان به نور سبز بیشترین و به نور قرمز و آبی کمترین است.
روشنایی (Brightness) معیاری کلی از واکنش ما به شدت نور است. توانایی دید رنگی انسان از حساسیتهای متفاوت سه نوع سلول مخروطی ناشی میشود. پیامد مهم وجود سه نوع مخروط این است که بهجای کار جداگانه با همهٔ طول موجهای مرئی، میتوان سه رنگ اصلی استاندارد را به کار گرفت و با آنها تقریب مناسبی از هر رنگ قابل ادراک ساخت. ازاینرو بیشتر سامانههای تولید تصویر، از جمله فیلم و ویدئو، تنها با سه رنگ پایه یا اصلی کار میکنند. رنگ در فصل ۲ با جزئیات بررسی میشود.
پردازش اولیهٔ نور در سامانهٔ بینایی انسان بر همان اصولی استوار است که بیشتر سامانههای نوری به کار میبرند؛ بااینحال بخشهای پسین سامانهٔ بینایی انسان بسیار پیچیدهتر از دوربین یا تلسکوپاند. عصبهای بینایی در آرایشی بسیار پیچیده به سلولهای میلهای و مخروطی متصلاند و این آرایش بسیاری از ویژگیهای یک پردازندهٔ سیگنال پیشرفته را دارد. پردازش نهایی در بخشی از مغز به نام قشر بینایی (Visual Cortex) انجام میشود؛ جایی که کارکردهای سطحبالایی مانند تشخیص اشیا صورت میگیرد. در این کتاب وارد بحث پردازش سطحبالا نمیشویم و میتوانیم بهطور ساده تصور کنیم تصویری از سلولهای میلهای و مخروطی به مغز منتقل میشود.
۱.۵ مدل دوربین مصنوعی
مدلهای سامانههای تصویربرداری نوری مستقیماً به پایهٔ مفهومی گرافیک رایانهای سهبعدی نوین منتهی میشوند. تولید تصویر رایانهای را مشابه تشکیل تصویر در یک سامانهٔ نوری در نظر میگیریم. این الگو «مدل دوربین مصنوعی» (Synthetic-Camera Model) نام گرفته است. سامانهٔ تصویربرداری شکل ۱.۲۳ را در نظر بگیرید. باز هم اشیا و یک مشاهدهگر داریم؛ در اینجا مشاهدهگر یک دوربین آکاردئونی است. تصویر روی صفحهٔ فیلم در پشت دوربین تشکیل میشود. برای تقلید این فرایند و ساخت تصویر مصنوعی باید چند اصل پایه را مشخص کنیم.
نخست، تعریف اشیا مستقل از تعریف مشاهدهگر است. بنابراین در یک کتابخانهٔ گرافیکی انتظار داریم برای مشخصکردن اشیا و برای مشخصکردن مشاهدهگر توابع جداگانهای وجود داشته باشد.
دوم، همانند دوربین روزنهای میتوان تصویر را با محاسبات هندسی ساده به دست آورد. نمای جانبی دوربین و یک جسم ساده در شکل ۱.۲۴ را در نظر بگیرید. نمای بخش (الف) شکل مشابه دوربین روزنهای است.
یادداشت ۵: در دوربین آکاردئونی، صفحهٔ جلویی دوربین که عدسی روی آن قرار دارد و پشت دوربین که صفحهٔ فیلم است با دیوارههای انعطافپذیر به هم متصلاند. بنابراین میتوان پشت دوربین را مستقل از جلوی آن جابهجا کرد و انعطاف بیشتری به فرایند تشکیل تصویر داد. این قابلیت در فصل ۴ به کار گرفته میشود.
شکل ۱.۲۳ — سامانهٔ تصویربرداری.
شکل ۱.۲۴ — دو نمای معادل از تشکیل تصویر: (الف) تصویر روی پشت دوربین تشکیل میشود؛ (ب) صفحهٔ تصویر به جلوی دوربین منتقل شده است.
توجه کنید تصویر جسم نسبت به خود جسم وارونه است. در دوربین واقعی میتوان فیلم را برگرداند تا جهت اصلی جسم دوباره به دست آید، اما در دوربین مصنوعی با ترفندی ساده از وارونگی جلوگیری میکنیم. صفحهٔ دیگری در جلوی عدسی رسم میکنیم، مطابق شکل ۱.۲۴(ب)، و در سه بعد کار میکنیم؛ همانگونه که در شکل ۱.۲۵ نشان داده شده است.
برای یافتن تصویر یک نقطه از جسم روی صفحهٔ تصویر مجازی، خطی از آن نقطه به مرکز عدسی رسم میکنیم. این خط «پرتو تصویرساز» یا Projector و مرکز عدسی «مرکز تصویرسازی» (Center of Projection یا COP) نام دارد. همهٔ پرتوهای تصویرساز، نیمخطهاییاند که از مرکز تصویرسازی خارج میشوند. در دوربین مصنوعی، صفحهٔ تصویر مجازی که به جلوی عدسی منتقل کردهایم «صفحهٔ تصویرسازی» (Projection Plane) نامیده میشود. تصویر نقطه در جایی قرار میگیرد که پرتو تصویرساز صفحهٔ تصویرسازی را قطع میکند. این فرایند و رابطههای ریاضی مربوط به آن در فصل ۴ بهتفصیل بررسی میشوند.
همچنین باید اندازهٔ محدود تصویر را در نظر بگیریم. همانطور که دیدیم، همهٔ اشیا را نمیتوان روی صفحهٔ فیلم دوربین روزنهای تصویر کرد. زاویهٔ دید بیانگر این محدودیت است. در دوربین مصنوعی میتوان این محدودیت را به جلوی سامانه منتقل کرد و یک مستطیل برش یا «پنجرهٔ برش» (Clipping Window) در صفحهٔ تصویرسازی قرار داد، مطابق شکل ۱.۲۶. این مستطیل مانند پنجرهای عمل میکند که مشاهدهگرِ واقع در مرکز تصویرسازی جهان را از طریق آن میبیند.
شکل ۱.۲۵ — تصویربرداری با دوربین مصنوعی.
شکل ۱.۲۶ — برش: (الف) پنجره در مکان اولیه؛ (ب) پنجره پس از جابهجایی.
با دانستن مکان مرکز تصویرسازی، مکان و جهت صفحهٔ تصویرسازی و اندازهٔ مستطیل برش، میتوان تعیین کرد چه اشیایی در تصویر ظاهر خواهند شد.
۱.۶ رابط برنامهنویس
راههای فراوانی برای تعامل کاربر با یک سامانهٔ گرافیکی وجود دارد. در بستههای کاملاً خودبسنده، مانند نرمافزارهای رایج در حوزهٔ CAD، کاربر از طریق تعامل با نمایشگر و ابزارهای ورودی مانند ماوس و صفحهکلید تصویر را ایجاد میکند. در یک برنامهٔ کاربردی معمولی، مانند برنامهٔ نقاشی شکل ۱.۲۷، کاربر منوها و آیکونهایی میبیند که کنشهای ممکن را نمایش میدهند. با کلیک روی این موارد، کاربر نرمافزار را هدایت میکند و بدون نیاز به نوشتن برنامه تصویر میسازد.
شکل ۱.۲۷ — رابط یک برنامهٔ نقاشی.
شکل ۱.۲۸ — مدل سامانهٔ گرافیکی از دید برنامهنویس کاربردی: برنامهٔ کاربردی با کتابخانهٔ گرافیکی و API ارتباط دارد؛ درایورها رابط میان کتابخانه و سختافزارهای ورودی/خروجی مانند صفحهکلید، ماوس و نمایشگر هستند.
البته کسی باید کد این برنامههای کاربردی را توسعه دهد و بسیاری از ما، با وجود پیشرفت محصولات تجاری، هنوز ناچاریم برنامههای گرافیکی کاربردی خود را بنویسیم ــ و حتی از این کار لذت میبریم.
رابط میان برنامهٔ کاربردی و سامانهٔ گرافیکی را میتوان با مجموعهای از توابع مقیم در یک کتابخانهٔ گرافیکی تعریف کرد. این مشخصات «رابط برنامهنویسی کاربردی» (Application Programming Interface یا API) نام دارند. مدل سامانه از دید برنامهنویس کاربردی در شکل ۱.۲۸ نشان داده شده است. برنامهنویس فقط API را میبیند و از جزئیات سختافزار و نیز جزئیات پیادهسازی نرمافزاری کتابخانهٔ گرافیکی جدا نگه داشته میشود. درایورهای نرمافزاری مسئول تفسیر خروجی API و تبدیل دادهها به قالبی هستند که سختافزار مشخص آن را بفهمد. از دید نویسندهٔ برنامهٔ کاربردی، توابع قابل دسترس از طریق API باید با مدل مفهومیای سازگار باشند که کاربر میخواهد برای تعریف تصاویر به کار ببرد.
۱.۶.۱ مدل پلاتر قلمی
از نظر تاریخی، بیشتر سامانههای گرافیکی اولیه دوبعدی بودند. مدل مفهومی آنها امروزه «مدل پلاتر قلمی» (Pen-Plotter Model) نامیده میشود؛ نامی برگرفته از دستگاه خروجی موجود در آن سامانهها. یک پلاتر قلمی، مطابق شکل ۱.۲۹، با حرکت قلمی که روی یک سازهٔ متحرک نگه داشته شده است تصویر تولید میکند. این سازه میتواند قلم را در دو راستای عمود بر هم روی کاغذ حرکت دهد. پلاتر در صورت نیاز قلم را بالا میبرد یا پایین میآورد تا تصویر موردنظر ایجاد شود. پلاترهای قلمی هنوز نیز استفاده میشوند و برای رسم نمودارهای بزرگ، مانند نقشههای فنی، مناسباند.
شکل ۱.۲۹ — پلاتر قلمی.
چند API، از جمله LOGO و PostScript، ریشه در این مدل دارند. با وجود تفاوتهایشان، همگی فرایند ساخت تصویر را شبیه رسمکردن روی صفحهٔ کاغذ میدانند. کاربر روی یک سطح دوبعدی با اندازهٔ مشخص کار میکند، قلم را روی آن حرکت میدهد و رد قلم تصویر را روی کاغذ ایجاد میکند.
چنین سامانهٔ گرافیکی را میتوان فقط با دو تابع رسم توصیف کرد:
moveto(x,y);
lineto(x,y);
اجرای moveto قلم را بدون ایجاد اثر به مکان (x, y) روی کاغذ منتقل میکند. تابع lineto قلم را به (x, y) میبرد و همزمان از مکان قبلی قلم تا مکان جدید خط میکشد. با افزودن چند رویهٔ مقداردهی اولیه و خاتمه و همچنین قابلیت تعویض قلم برای تغییر رنگ یا ضخامت خط، یک سامانهٔ گرافیکی ساده اما کامل خواهیم داشت. قطعهبرنامهٔ زیر نمونهای در چنین سامانهای است:
moveto(0, 0);
lineto(1, 0);
lineto(1, 1);
lineto(0, 1);
lineto(0, 0);
این قطعهکد خروجی شکل ۱.۳۰(الف) را تولید میکند. اگر کد زیر را اضافه کنیم:
moveto(0, 1);
lineto(0.5, 1.866);
lineto(1.5, 1.866);
lineto(1.5, 0.866);
lineto(1, 0);
moveto(1, 1);
lineto(1.5, 1.866);
تصویر یک مکعب با تصویرسازی مایل به دست میآید؛ همانگونه که در شکل ۱.۳۰(ب) نشان داده شده است.
شکل ۱.۳۰ — خروجی برنامهٔ پلاتر قلمی برای (الف) یک مربع و (ب) تصویرسازی یک مکعب.
برای برخی کاربردها، مانند صفحهآرایی در صنعت چاپ، سامانههای مبتنی بر این مدل بهخوبی کار میکنند. برای مثال، زبان توصیف صفحهٔ PostScript توسعهای پیشرفته از همین ایدههاست و به استانداردی برای کنترل دستگاههای حروفچینی و چاپگرها تبدیل شده است.
یک مدل دوبعدی دیگر که آن هم بر رستر متکی و همچنان محدود است، بر نوشتن مستقیم پیکسلها در بافر فریم استوار میشود. چنین سامانهای میتواند تنها تابعی مانند زیر داشته باشد:
write_pixel(x, y, color);
در این تابع، x,y مکان پیکسل در بافر فریم و color رنگی است که باید در آن مکان نوشته شود. چنین مدلهایی برای پیادهسازی الگوریتمهای رسترسازی و پردازش تصاویر دیجیتال مناسباند.
بااینحال، موضوع اصلی مورد توجه ما جهان سهبعدی است. مدل پلاتر قلمی بهخوبی به سامانههای گرافیکی سهبعدی تعمیم پیدا نمیکند. برای مثال، اگر بخواهیم با مدل پلاتر قلمی تصویر یک جسم سهبعدی را روی صفحهٔ دوبعدی خود، چه با دست و چه با رایانه، تولید کنیم باید تعیین کنیم نقاط دوبعدی متناظر با نقاط جسم سهبعدی در کجای صفحه قرار گیرند. همانطور که در بخش ۱.۵ دیدیم، این نقاط دوبعدی تصویرِ نقاط فضای سهبعدیاند. فرایند ریاضی تعیین این تصاویر کاربردی از مثلثات است. ریاضیات تصویرسازی در فصل ۴ توسعه داده میشود و فهم آن برای درک گرافیک سهبعدی ضروری است.
بااینحال ترجیح میدهیم از APIای استفاده کنیم که اجازه دهد کاربران مستقیماً در دامنهٔ مسئلهٔ خود کار کنند و رایانه جزئیات فرایند تصویرسازی را بهطور خودکار انجام دهد، بیآنکه کاربر مجبور شود در برنامهٔ کاربردی محاسبات مثلثاتی انجام دهد. این رویکرد برای کسانی که رسم انواع تصویرسازی روی میز نقشهکشی یا ترسیم اشیا در پرسپکتیو را دشوار مییابند مزیت بزرگی است. مهمتر از آن، کاربران میتوانند به پیادهسازی سختافزاری و نرمافزاری تصویرسازی درون API تکیه کنند که بسیار کارآمدتر از پیادهسازیای است که احتمالاً در برنامهٔ خود مینوشتند.
۱.۶.۲ APIهای سهبعدی
مدل دوربین مصنوعی پایهٔ تعدادی از APIهای پرکاربرد، از جمله OpenGL و Direct3D، است. اگر بخواهیم از این مدل پیروی کنیم، در API به توابعی برای مشخصکردن موارد زیر نیاز داریم:
- اشیا؛
- مشاهدهگر؛
- منابع نور؛
- ویژگیهای ماده.
اشیا معمولاً با مجموعهای از رأسها تعریف میشوند. برای اشیای هندسی ساده مانند پارهخط، مستطیل و چندضلعی، رابطهای مستقیم میان فهرست رأسها یا مکانهای فضایی و خود جسم وجود دارد. برای اشیای پیچیدهتر ممکن است چند روش برای تعریف جسم از یک مجموعه رأس وجود داشته باشد. مثلاً یک دایره را میتوان با سه نقطه روی محیط آن یا با مرکز و یک نقطه روی محیط تعریف کرد.
بیشتر APIها مجموعههای مشابهی از بدویهای گرافیکی (Graphics Primitives) را در اختیار کاربر میگذارند. این بدویها معمولاً همان موجودیتهایی هستند که سختافزار میتواند با سرعت بالا نمایش دهد. مجموعههای رایج شامل نقطه، پارهخط، چندضلعی و گاهی متناند. برنامههای OpenGL بدویها را با فهرستی از رأسها تعریف میکنند. قطعهکد زیر سه رأس را مشخص میکند:
float vertices[3][3];
vertices[0][0] = 0.0; /* vertex A */
vertices[1][0] = 0.0;
vertices[2][0] = 0.0;
vertices[0][1] = 0.0; /* vertex B */
vertices[1][1] = 1.0;
vertices[2][1] = 0.0;
vertices[0][2] = 0.0; /* vertex C */
vertices[1][2] = 0.0;
vertices[2][2] = 1.0;
در OpenGL میتوان این آرایه را هر بار که میخواهیم نمایش داده شود به GPU فرستاد، یا آن را برای نمایشهای بعدی روی GPU ذخیره کرد. توجه کنید این سه رأس فقط سه مکان در فضای سهبعدی را تعیین میکنند و موجودیت هندسیای را که میسازند مشخص نمیکنند. این مکانها میتوانند یک مثلث، مانند شکل ۱.۳۱، را توصیف کنند؛ یا با استفاده از مکان اول و دوم برای پارهخط نخست و مکان دوم و سوم برای پارهخط دوم، دو پارهخط را مشخص کنند. همچنین میتوان سه نقطه را برای نمایش سه پیکسل در مکانهای متناظر با رأسها در بافر فریم به کار برد.
شکل ۱.۳۱ — یک مثلث.
این انتخاب در برنامهٔ کاربردی با تنظیم پارامتری انجام میشود که موجودیت هندسی موردنظر را مشخص میکند. برای مثال در OpenGL برای سه حالت یادشده بهترتیب میتوان از GL_TRIANGLES، GL_LINE_STRIP یا GL_POINTS استفاده کرد. اگرچه هنوز آمادهٔ بیان همهٔ جزئیات این کار نیستیم، نکتهٔ مهم این است که مستقل از موجودیت هندسی انتخابشده، ما هندسه را مشخص میکنیم و تعیین اینکه کدام پیکسلهای بافر فریم باید رنگ شوند را به سامانهٔ گرافیکی میسپاریم.
برخی APIها با ارائهٔ توابع خواندن و نوشتن پیکسل اجازه میدهند کاربر مستقیماً با بافر فریم کار کند. افزون بر این، بعضی APIها منحنیها و سطوح را نیز بهعنوان بدوی ارائه میکنند؛ هرچند این نوع اشیا اغلب در برنامهٔ کاربردی با مجموعهای از بدویهای سادهتر تقریب زده میشوند. OpenGL امکان دسترسی به بافر فریم را نیز فراهم میکند.
مشاهدهگر یا دوربین را میتوان به روشهای مختلف تعریف کرد. APIهای موجود هم از نظر میزان انعطاف در انتخاب دوربین و هم از نظر تعداد روشهای تعریف آن متفاوتاند. اگر دوربین شکل ۱.۳۲ را بررسی کنیم، چهار نوع مشخصهٔ لازم را میتوان تشخیص داد:
- مکان: مکان دوربین معمولاً با موقعیت مرکز عدسی مشخص میشود که همان مرکز تصویرسازی (COP) است.
شکل ۱.۳۲ — مشخصات دوربین.
- جهتگیری: پس از تعیین مکان دوربین میتوان یک دستگاه مختصات دوربین با مبدأ در مرکز تصویرسازی قرار داد. سپس دوربین را میتوان بهطور مستقل حول هر یک از سه محور این دستگاه چرخاند.
- فاصلهٔ کانونی: فاصلهٔ کانونی عدسی اندازهٔ تصویر روی صفحهٔ فیلم یا، بهطور معادل، مقدار بخشی از جهان را که دوربین میبیند تعیین میکند.
- صفحهٔ فیلم: پشت دوربین دارای ارتفاع و عرض است. در دوربین آکاردئونی و در برخی APIها، جهت پشت دوربین را میتوان مستقل از جهت عدسی تنظیم کرد.
این مشخصهها را میتوان به روشهای گوناگون تعیین کرد. یکی از روشهای ساخت مشخصات مکان و جهت دوربین از زنجیرهای از تبدیلهای دستگاه مختصات استفاده میکند. این تبدیلها موقعیت اشیا را از دستگاه مختصاتی که رأسهای جسم در آن تعریف شدهاند به دستگاه مختصاتی با مرکز در COP تبدیل میکنند. این روش هم برای پیادهسازی و هم برای دستیابی به مجموعهٔ کامل نماهایی که یک دوربین انعطافپذیر میتواند فراهم کند مفید است. از فصل ۴ به بعد بهطور گسترده از این رویکرد استفاده خواهیم کرد.
بااینحال، داشتن پارامترهای زیاد برای تنظیم میتواند دستیابی به تصویر مطلوب را دشوار کند. بخشی از مشکل به مدل دوربین مصنوعی بازمیگردد. روشهای کلاسیک مشاهده، مانند روشهای معماری، بر رابطهٔ میان جسم و مشاهدهگر تأکید دارند، نه استقلالی که مدل دوربین مصنوعی بر آن تأکید میکند. بنابراین پرسپکتیو کلاسیک دونقطهای مکعب در شکل ۱.۳۳ به این دلیل «دونقطهای» است که رابطهٔ مشخصی میان مشاهدهگر و صفحههای مکعب وجود دارد؛ تمرین ۱.۷ را ببینید.
شکل ۱.۳۳ — پرسپکتیو دونقطهای یک مکعب.
گرچه API در OpenGL اجازه میدهد تبدیلها را با آزادی کامل تنظیم کنیم، توابع کمکی سودمندی نیز فراهم میکند. برای نمونه دو فراخوانی زیر را در نظر بگیرید:
LookAt(cop, at, up);
Perspective(field_of_view, aspect_ratio, near, far);
فراخوانی نخست دوربین را از مرکز تصویرسازی بهسوی نقطهٔ موردنظر، یعنی نقطهٔ at، و با جهت بالای مشخصشده برای دوربین نشانه میرود. فراخوانی دوم عدسی لازم برای نمای پرسپکتیو، یعنی میدان دید، و مقدار جهانی را که دوربین باید تصویر کند، یعنی نسبت ابعاد و فاصلههای نزدیک و دور، تعیین میکند. بااینهمه هیچیک از APIهای مبتنی بر مدل دوربین مصنوعی تابعی برای تعریف مستقیم رابطهٔ مطلوب میان دوربین و یک جسم ارائه نمیکنند.
منابع نور با مکان، شدت، رنگ و جهتمندی تعریف میشوند. APIها برای مشخصکردن این پارامترها برای هر منبع مجموعهای از توابع در اختیار میگذارند. ویژگیهای ماده خصوصیات یا صفتهای اشیا هستند و هنگام تعریف هر جسم از طریق رشتهای از فراخوانیهای تابع مشخص میشوند.
هم منابع نور و هم ویژگیهای ماده به مدلهای برهمکنش نور و مادهای وابستهاند که API پشتیبانی میکند. این مدلها در فصل ۵ بررسی میشوند.
۱.۶.۳ دنبالهای از تصاویر
در فصل ۲ بحث تفصیلی API مربوط به OpenGL را که در سراسر کتاب استفاده میکنیم آغاز خواهیم کرد. تصاویر تعریفشده در برنامههای OpenGL بهطور خودکار توسط پیادهسازی سختافزاری و نرمافزاری فرایند تشکیل تصویر ساخته میشوند.
در اینجا دنبالهای از تصاویر را بررسی میکنیم که نشان میدهد با API در OpenGL چه چیزهایی میتوان ساخت. این تصاویر نمایشهای رندرشدهٔ یک مجموعه جسم یکساناند که بهتدریج پیچیدهتر میشوند. این دنباله نهتنها تقریباً با ترتیب ارائهٔ مباحث مرتبط در کتاب همراستاست، بلکه روند توسعهٔ سامانههای گرافیکی در حدود سی سال گذشته را نیز بازتاب میدهد.
صفحهٔ رنگی ۱ تصویری از اثر یک هنرمند با جسمی شبیه خورشید را نشان میدهد. در صفحهٔ رنگی ۲ همین جسم فقط با پارهخطها رندر شده است. هرچند جسم از بخشهای زیادی ساخته شده و برنامهنویس ممکن است برای مدلکردن هر بخش و رابطهٔ میان بخشها از ساختارهای دادهٔ پیشرفته استفاده کرده باشد، تصویر رندرشده فقط مرز بخشها را نشان میدهد. این نوع تصویر «قاب سیمی» (Wireframe) نام دارد، زیرا فقط لبههای سطوح دیده میشوند؛ درست مانند اینکه جسم از سیمهای سختی ساخته شده باشد که یک چارچوب بدون مادهٔ جامد میان لبهها ایجاد کردهاند. پیش از در دسترس قرارگرفتن سامانههای گرافیکی رستری، تصاویر قاب سیمی تنها نوع تصویر رایانهای قابل تولید بودند.
در صفحهٔ رنگی ۳ همان جسم با چندضلعیهای تخت رندر شده است. بعضی سطوح دیده نمیشوند، زیرا سطحی جامد میان آنها و مشاهدهگر قرار دارد؛ این سطوح بهوسیلهٔ الگوریتم حذف سطح پنهان (Hidden-Surface Removal یا HSR) حذف شدهاند. بیشتر سامانههای رستری میتوانند داخل چندضلعیها را تقریباً در همان زمانی با یک رنگ یکنواخت پر کنند که برای تولید تصویر قاب سیمی لازم است. با وجود سهبعدی بودن اشیا، هر سطح با یک رنگ نمایش داده میشود و تصویر شکل سهبعدی اشیا را بهخوبی القا نمیکند. سامانههای رستری اولیه قادر به تولید چنین تصاویری بودند.
در فصلهای ۲ و ۳ روش تولید تصاویر متشکل از اشیای هندسی ساده ــ نقطه، پارهخط و چندضلعی ــ توضیح داده میشود. در فصلهای ۳ و ۴ نیز خواهید آموخت چگونه اشیا را در سه بعد تبدیل کنید و نمای سهبعدی موردنظر را از یک مدل، با حذف سطوح پنهان، به دست آورید.
صفحهٔ رنگی ۴ سایهزنی نرم چندضلعیهای تقریبزنندهٔ جسم را نشان میدهد؛ این شیوه سهبعدی بودن جسم را آشکار میکند و ظاهر سطحی هموار به آن میدهد. مدلهای سایهزنی پشتیبانیشده در OpenGL در فصل ۵ توسعه داده میشوند. این مدلها در سختافزار بیشتر Workstationهای جدید نیز پشتیبانی میشوند و تولید تصویر سایهزده در چنین سامانههایی تقریباً همانقدر زمان میبرد که تولید تصویر قاب سیمی.
صفحهٔ رنگی ۵ مدل قاب سیمی پیشرفتهتری را نشان میدهد که با سطوح NURBS ساخته شده است؛ این سطوح در فصل ۱۰ معرفی میشوند. چنین سطوحی انعطاف زیادی در فرایند طراحی به برنامهنویس کاربردی میدهند، اما در نهایت با پارهخطها و چندضلعیها رندر میشوند.
در صفحات رنگی ۶ و ۷ بافت سطحی به جسم افزوده شده است؛ بافت یکی از جلوههایی است که در فصل ۶ بررسی میشود. همهٔ پردازندههای گرافیکی جدید نگاشت بافت را در سختافزار پشتیبانی میکنند، بنابراین رندر تصویر بافتگذاریشده زمان افزودهٔ اندکی نیاز دارد. در صفحهٔ رنگی ۶ از روشی به نام «نگاشت برجستگی» (Bump Mapping) استفاده شده که بدون تغییر چندضلعیهای تخت مورد استفاده در نمونههای دیگر، ظاهر سطحی ناهموار را ایجاد میکند. صفحهٔ رنگی ۷ «نگاشت محیطی» (Environment Map) را روی سطح جسم نشان میدهد که ظاهر آینهای به سطح میدهد. این روشها در فصل ۷ با جزئیات بررسی میشوند.
صفحهٔ رنگی ۸ بخش کوچکی از رندر جسم با نگاشت محیطی را نشان میدهد. تصویر سمت چپ مصنوعات دندانهداری موسوم به خطاهای همپوشانی نمونهای یا Aliasing را نشان میدهد که از ماهیت گسستهٔ بافر فریم ناشی میشوند. تصویر سمت راست با روشی برای هموارسازی یا «ضدهمپوشانی» (Antialiasing) رندر شده است که در فصلهای ۵ و ۶ مطالعه میکنیم.
این تصاویر علاوه بر نمایش توان سختافزار موجود و یک API مناسب، نشان میدهند ساخت چنین خروجیهایی ساده است؛ همانطور که در فصلهای بعد خواهیم دید. افزون بر این، همانگونه که تصاویر در رندر بهصورت گامبهگام تغییر میکنند، برنامههای تولیدکنندهٔ آنها نیز فقط بهصورت تدریجی با یکدیگر تفاوت دارند.
۱.۶.۴ الگوی مدلسازی–رندرینگ
در بسیاری از موقعیتها ــ بهویژه در کاربردهای CAD و توسعهٔ تصاویر پیچیده مانند فیلم ــ میتوان مدلسازی صحنه را از تولید تصویر یا رندر صحنه جدا کرد. بنابراین تشکیل تصویر را میتوان فرایندی دومرحلهای دانست، مطابق شکل ۱.۳۴. هرچند وظایف همانهاییاند که تاکنون بررسی کردهایم، این نمودار بلوکی نشان میدهد میتوان مدلساز و رندرکننده را با نرمافزار و سختافزار متفاوت پیادهسازی کرد.
برای مثال، تولید یک فریم منفرد از یک پویانمایی را در نظر بگیرید. ابتدا باید اشیا را طراحی و جایگذاری کنیم. این مرحله بسیار تعاملی است و در آن به تصاویر بسیار پرجزئیات از اشیا نیاز نداریم؛ بنابراین بهتر است این مرحله روی یک Workstation تعاملی با سختافزار گرافیکی مناسب انجام شود. پس از طراحی صحنه، میخواهیم آن را رندر کنیم و با افزودن منابع نور، ویژگیهای ماده و انواع جلوههای جزئی، تصویری با کیفیت تولید نهایی بسازیم. این مرحله به محاسبات بسیار زیادی نیاز دارد و میتوان آن را روی سختافزار مناسبتری انجام داد.
شکل ۱.۳۴ — خط لولهٔ مدلسازی–رندرینگ: مدلساز از طریق یک فایل رابط، دادهٔ صحنه را به رندرکننده منتقل میکند.
برای مرحلهٔ رندر میتوان از یک «مزرعهٔ رندر» (Render Farm)، یعنی خوشهای از رایانههای پیکربندیشده برای محاسبات عددی، استفاده کرد. نهتنها سختافزار بهینه برای مرحلههای مدلسازی و رندرینگ میتواند متفاوت باشد، بلکه نرمافزار مورد استفاده نیز ممکن است متفاوت باشد.
رابط میان مدلساز و رندرکننده میتواند به سادگی یک فایل تولیدشده توسط مدلساز باشد که اشیا را توصیف میکند و اطلاعات اضافی موردنیاز رندرکننده، مانند منابع نور، مکان مشاهدهگر و ویژگیهای ماده، را در خود دارد. رابط RenderMan شرکت Pixar از همین رویکرد پیروی میکند و قالب فایلی فراهم میآورد که مدلسازها بتوانند مدلها را بهشکل متنی به رندرکننده تحویل دهند. یکی از مزیتهای دیگر این روش آن است که میتوان مدلسازهایی ویژهٔ کاربردهای خاص ساخت که همگی از یک رندرکننده استفاده کنند. به همین ترتیب، رندرکنندههای گوناگون میتوانند همان فایل رابط را بهعنوان ورودی بپذیرند.
حتی از نظر نظری میتوان مدلساز را کاملاً کنار گذاشت و فایل رابط را با یک ویرایشگر متن استاندارد تولید کرد. اما برای هر صحنهای جز سادهترین نمونهها، کاربران نمیتوانند فهرستهای طولانی اطلاعات موردنیاز رندرکننده را مستقیماً ویرایش کنند؛ در عمل از نرمافزار تعاملی مدلسازی استفاده میشود. چون برای تعامل با مدلساز دستکم به تصویری ساده از اشیا نیاز داریم، بیشتر مدلسازها برای تولید بلادرنگ این تصاویر از مدل دوربین مصنوعی بهره میبرند.
این الگو به روشی پرکاربرد برای تولید بازیهای رایانهای و تصاویر قابل انتقال در اینترنت تبدیل شده است. مدلها ــ شامل اشیای هندسی، نورها، دوربینها و ویژگیهای ماده ــ در ساختار دادهای به نام «گراف صحنه» (Scene Graph) قرار میگیرند و به رندرکننده یا موتور بازی تحویل داده میشوند. گراف صحنه در فصل ۸ بررسی خواهد شد.
۱.۷ معماریهای گرافیکی
در یک سوی API برنامهٔ کاربردی قرار دارد و در سوی دیگر ترکیبی از سختافزار و نرمافزار که قابلیتهای API را پیادهسازی میکند. پژوهشگران برای توسعهٔ معماریهای پشتیبان APIهای گرافیکی رویکردهای مختلفی آزمودهاند.
سامانههای گرافیکی اولیه از رایانههای همهمنظوره با معماری استاندارد فوننویمان استفاده میکردند. ویژگی چنین رایانههایی وجود یک واحد پردازشی منفرد است که در هر لحظه یک دستور را پردازش میکند. مدل سادهای از این سامانههای اولیه در شکل ۱.۳۵ آمده است. نمایشگر آن سامانهها بر CRT خطنگار استوار بود و مدار لازم برای تولید یک پارهخط میان دو نقطه را در خود داشت. وظیفهٔ رایانهٔ میزبان اجرای برنامهٔ کاربردی و محاسبهٔ دو سر پارهخطهای تصویر، برحسب واحدهای نمایشگر، بود. این اطلاعات باید با نرخی به نمایشگر فرستاده میشد که از سوسوزدن تصویر جلوگیری کند.
شکل ۱.۳۵ — سامانهٔ گرافیکی اولیه: میزبان از مسیر تبدیل دیجیتال به آنالوگ نمایشگر را کنترل میکند.
در سالهای نخست گرافیک رایانهای، رایانهها آنقدر کند بودند که حتی بازآوری یک تصویر ساده با چند صد پارهخط بار زیادی بر یک رایانهٔ گرانقیمت وارد میکرد.
۱.۷.۱ پردازندههای نمایش
نخستین تلاشها برای ساخت سامانههای گرافیکی ویژه عمدتاً با هدف رهاکردن رایانهٔ همهمنظوره از وظیفهٔ بازآوری پیوستهٔ نمایشگر انجام شد. این «پردازندههای نمایش» معماری متعارفی داشتند، مطابق شکل ۱.۳۶، اما دستورهایی ویژه برای نمایش بدویها روی CRT نیز در آنها وجود داشت.
شکل ۱.۳۶ — معماری پردازندهٔ نمایش: میزبان داده را به پردازندهٔ نمایش میفرستد و پردازنده با استفاده از «فهرست نمایش» مستقل از میزبان تصویر را بازآوری میکند.
مزیت اصلی پردازندهٔ نمایش این بود که دستورهای تولید تصویر فقط یکبار در میزبان ساخته و به پردازنده فرستاده میشدند و سپس در حافظهٔ خود پردازنده بهصورت «فهرست نمایش» (Display List) یا فایل نمایش ذخیره میشدند. پردازندهٔ نمایش برنامهٔ موجود در این فهرست را مستقل از میزبان و با نرخ کافی برای جلوگیری از سوسوزدن، بهطور تکراری اجرا میکرد و میزبان را برای کارهای دیگر آزاد میگذاشت. این معماری بعدها ارتباط نزدیکی با معماریهای سرویسگیرنده–سرویسدهنده پیدا کرد که در بیشتر سامانهها به کار میروند.
۱.۷.۲ معماریهای خط لوله
پیشرفتهای عمده در معماری گرافیکی تقریباً همزمان با پیشرفت Workstationها رخ داد. در هر دو مورد، امکان ساخت تراشههای VLSI ویژه فناوری کلیدی بود. افزون بر آن، در دسترس قرارگرفتن حافظهٔ حالتجامد ارزان باعث فراگیرشدن نمایشگرهای رستری شد. مهمترین کاربرد مدارهای VLSI سفارشی در گرافیک رایانهای، ساخت معماریهای خط لولهای بوده است.
مفهوم خط لوله در شکل ۱.۳۷ برای یک محاسبهٔ حسابی ساده نشان داده شده است. خط لولهٔ نمونه یک جمعکننده و یک ضربکننده دارد. اگر بخواهیم با این پیکربندی عبارت a + (b * c) را محاسبه کنیم، کار لازم شامل یک ضرب و یک جمع است؛ یعنی همان میزان کاری که یک پردازندهٔ منفرد برای انجام هر دو عملیات نیاز دارد. اما اگر همین محاسبه را برای مقادیر بسیار زیادی از a، b و c انجام دهیم، وضعیت تغییر میکند. ضربکننده میتواند نتیجهٔ محاسبهٔ خود را به جمعکننده تحویل دهد و بلافاصله ضرب بعدی را آغاز کند، درحالیکه جمعکننده مرحلهٔ دوم را روی مجموعهدادهٔ نخست انجام میدهد.
شکل ۱.۳۷ — خط لولهٔ حسابی شامل ضربکننده و جمعکننده.
بنابراین اگرچه زمان محاسبهٔ یک مجموعهداده بهتنهایی تغییر نکرده است، وقتی همزمان روی دو مجموعهداده کار میکنیم زمان کل بهطور محسوسی کاهش مییابد. در این حالت نرخ جریان داده در سامانه، یعنی «توان عملیاتی» (Throughput)، دو برابر شده است. توجه کنید هرچه بلوکهای بیشتری به خط لوله اضافه کنیم، عبور یک دادهٔ منفرد از کل سامانه زمان بیشتری میبرد. این زمان «تأخیر» (Latency) سامانه نام دارد و هنگام ارزیابی عملکرد خط لوله باید میان افزایش توان عملیاتی و افزایش تأخیر تعادل برقرار کرد.
میتوان برای محاسبات حسابی پیچیدهتر خط لولههایی ساخت که افزایش بسیار بیشتری در توان عملیاتی ایجاد کنند. البته ساخت خط لوله تنها زمانی معنا دارد که یک عمل یکسان را روی مجموعهدادههای فراوان انجام دهیم؛ و این دقیقاً همان چیزی است که در گرافیک رایانهای رخ میدهد، زیرا مجموعههای بزرگی از رأسها و پیکسلها باید به شیوهای مشابه پردازش شوند.
۱.۷.۳ خط لولهٔ گرافیکی
از مجموعهای از اشیا آغاز میکنیم. هر جسم شامل مجموعهای از بدویهای گرافیکی و هر بدوی شامل مجموعهای از رأسهاست. مجموعهٔ نوع بدویها و رأسها را میتوان تعریف هندسهٔ صحنه دانست. در یک صحنهٔ پیچیده ممکن است هزاران یا حتی میلیونها رأس اشیا را تعریف کنند. برای تشکیل تصویر در بافر فریم باید همهٔ این رأسها به روشی مشابه پردازش شوند.
اگر تشکیل تصویر را پردازش هندسهٔ اشیا در نظر بگیریم، نمودار بلوکی شکل ۱.۳۸ چهار مرحلهٔ اصلی فرایند تصویربرداری را نشان میدهد:
- پردازش رأس؛
- برش و مونتاژ بدوی؛
- رسترسازی؛
- پردازش قطعه.
شکل ۱.۳۸ — خط لولهٔ هندسی: رأسها → پردازندهٔ رأس → برشدهنده و مونتاژکنندهٔ بدوی → رسترساز → پردازندهٔ قطعه → پیکسلها.
جزئیات این مراحل در فصلهای بعد بررسی میشود. در اینجا هدف فقط ارائهٔ نمای کلی و نشاندادن امکان اجرای خط لولهای آنهاست.
۱.۷.۴ پردازش رأس
در نخستین بلوک خط لوله، هر رأس مستقل از رأسهای دیگر پردازش میشود. دو وظیفهٔ اصلی این بلوک انجام تبدیلهای مختصاتی و محاسبهٔ رنگ برای هر رأس است.
بسیاری از مراحل فرایند تصویربرداری را میتوان تبدیل میان نمایشهای یک جسم در دستگاههای مختصات مختلف دانست. برای مثال، در بحث دوربین مصنوعی دیدیم بخش مهمی از مشاهده تبدیل نمایش اشیا از دستگاهی است که در آن تعریف شدهاند به دستگاه مختصات دوربین. نمونهٔ دیگر زمانی رخ میدهد که تصویر نهایی را روی دستگاه خروجی قرار میدهیم. نمایش داخلی اشیا ــ چه در دستگاه مختصات دوربین و چه در دستگاهی که نرمافزار گرافیکی استفاده میکند ــ سرانجام باید برحسب دستگاه مختصات نمایشگر بیان شود.
هر تغییر دستگاه مختصات را میتوان با یک ماتریس نمایش داد. تغییرهای پیاپی دستگاه مختصات را نیز میتوان با ضرب یا الحاق ماتریسهای منفرد در یک ماتریس واحد ترکیب کرد. این عملیات در فصل ۳ با جزئیات بررسی میشوند. چون ضرب دو ماتریس ماتریس سومی تولید میکند، دنبالهٔ تبدیلها نامزدی طبیعی برای معماری خط لوله است. افزون بر این، چون ماتریسهای مورد استفاده در گرافیک رایانهای همواره کوچکاند ــ معمولاً 4 × 4 ــ میتوان درون بلوکهای تبدیل نیز از پردازش موازی بهره برد.
پس از چند مرحلهٔ تبدیل، هندسه با یک «تبدیل تصویرسازی» (Projection Transformation) تبدیل میشود. در فصل ۴ خواهیم دید این مرحله نیز با ماتریسهای 4 × 4 قابل پیادهسازی است و بنابراین بهخوبی در خط لوله قرار میگیرد. بهطور کلی میخواهیم هنگام عبور اشیا از خط لوله اطلاعات سهبعدی را تا حد ممکن حفظ کنیم؛ ازاینرو تبدیل تصویرسازی کمی عمومیتر از تصویرسازیهای بخش ۱.۵ است. علاوه بر حفظ اطلاعات سهبعدی، انواع مختلفی از تصویرسازیها را نیز میتوان پیادهسازی کرد که در فصل ۴ بررسی میشوند.
اختصاص رنگ به رأس میتواند به سادگی تعیین یک رنگ توسط برنامه باشد یا به پیچیدگی محاسبهٔ رنگ از یک مدل نورپردازی واقعگرایانهٔ فیزیکی برسد که ویژگیهای سطح جسم و مشخصات منابع نور صحنه را لحاظ میکند. مدلهای نورپردازی در فصل ۵ بررسی میشوند.
۱.۷.۵ برش و مونتاژ بدوی
دومین بلوک بنیادی در پیادهسازی خط لولهٔ استاندارد گرافیکی، برش و مونتاژ بدوی است. برش لازم است زیرا هیچ سامانهٔ تصویربرداری نمیتواند کل جهان را یکجا ببیند. شبکیهٔ انسان اندازهای محدود دارد که تقریباً با میدان دید ۹۰ درجه متناظر است. دوربینها نیز فیلمی با اندازهٔ محدود دارند و میتوان میدان دیدشان را با انتخاب عدسیهای مختلف تنظیم کرد.
معادل این ویژگی در دوربین مصنوعی با «حجم برش» (Clipping Volume)، مانند هرم جلوی عدسی در شکل ۱.۲۵، به دست میآید. تصویر اشیایی که داخل این حجماند در خروجی ظاهر میشود؛ اشیای بیرون آن دیده نمیشوند و گفته میشود برش خوردهاند.
اشیایی که مرزهای حجم برش را قطع میکنند فقط تا حدی در تصویر دیده میشوند. الگوریتمهای کارآمد برش در فصل ۶ توسعه داده خواهند شد.
برش باید بهصورت بدویبهبدوی انجام شود، نه رأسبهرأس. ازاینرو در این مرحلهٔ خط لوله، مجموعههای رأس باید پیش از برش به بدویهایی مانند پارهخط و چندضلعی مونتاژ شوند. خروجی این مرحله مجموعهای از بدویهاست که تصویر آنها میتواند در خروجی دیده شود.
۱.۷.۶ رسترسازی
بدویهایی که از برشدهنده خارج میشوند هنوز برحسب رأسهایشان نمایش داده شدهاند و باید به پیکسلهای بافر فریم تبدیل شوند. برای نمونه، اگر سه رأس یک مثلث با رنگ یکنواخت را تعریف کنند، رسترساز باید تعیین کند کدام پیکسلهای بافر فریم درون این چندضلعی قرار دارند. فرایند رسترسازی، که «تبدیل پویشی» (Scan Conversion) نیز نامیده میشود، برای پارهخطها و چندضلعیها در فصل ۶ بررسی خواهد شد.
خروجی رسترساز برای هر بدوی مجموعهای از «قطعهها» (Fragments) است. قطعه را میتوان یک پیکسل بالقوه دانست که اطلاعاتی مانند رنگ و مکان همراه خود دارد و این اطلاعات برای بهروزرسانی پیکسل متناظر در بافر فریم استفاده میشوند. قطعه میتواند اطلاعات عمق نیز حمل کند تا مراحل بعدی تعیین کنند آیا قطعهٔ خاصی برای یک پیکسل پشت قطعههای رسترسازیشدهٔ پیشین قرار گرفته است یا نه.
۱.۷.۷ پردازش قطعه
بلوک نهایی خط لوله قطعههای تولیدشده توسط رسترساز را دریافت میکند و پیکسلهای بافر فریم را بهروزرسانی میکند. اگر برنامه دادهٔ سهبعدی تولید کرده باشد، ممکن است بعضی قطعهها دیده نشوند، زیرا سطحی که تعریف میکنند پشت سطحهای دیگر قرار دارد. رنگ یک قطعه ممکن است با نگاشت بافت یا نگاشت برجستگی، مانند صفحات رنگی ۶ و ۷، تغییر کند. همچنین میتوان رنگ پیکسل متناظر با قطعه را از بافر فریم خواند و با رنگ قطعه ترکیب کرد تا جلوههای نیمهشفاف ایجاد شود. این جلوهها در فصل ۷ بررسی میشوند.
۱.۸ خط لولههای برنامهپذیر
معماریهای گرافیکی چندین چرخهٔ طراحی را پشت سر گذاشتهاند که در آنها اهمیت سختافزارهای ویژه در مقایسه با CPUهای استاندارد بارها افزایش یا کاهش یافته است. بااینحال اهمیت معماری خط لوله مستقل از این چرخهها باقی مانده است. رویکردهای دیگری مانند رهگیری پرتو (Ray Tracing)، رادیوسیتی و نگاشت فوتون در شکل سنتی خود نمیتوانستند به رفتار بلادرنگ برسند؛ یعنی صحنههای پویای پیچیده را با نرخی رندر کنند که مشاهدهگر نمایش را بدون نقص حرکتی ببیند. با بهترشدن سختافزار گرافیکی، البته تعریف «بلادرنگ» نیز دشوارتر شده است. برخی رویکردها مانند رهگیری پرتو میتوانند به بلادرنگ نزدیک شوند، اما در چارچوب تاریخی مورد بحث کتاب، هیچیک با برنامههای سادهٔ کاربردی و برنامههای سادهٔ GPU به عملکرد معماریهای خط لولهای نمیرسیدند. در نتیجه بازار عمومی گرافیک عمدتاً تحت سلطهٔ معماریهای خط لولهای قرار گرفت.
کارتهای گرافیکی عمومی نیز خط لوله را در واحد پردازش گرافیکی خود جای دادهاند. همهٔ این کارتها خط لولهای را که توصیف کردیم، با گزینههای بیشتر، پیادهسازی میکنند؛ بسیاری از این گزینهها در فصلهای بعد بررسی خواهند شد.
برای سالهای طولانی، این معماریهای خط لولهای عملکردی ثابت داشتند. برنامهٔ کاربردی میتوانست پارامترهای زیادی را تنظیم کند، اما عملیات بنیادی درون خط لوله ثابت بودند. سپس پیشرفتی مهم رخ داد: هم پردازندهٔ رأس و هم پردازندهٔ قطعه بهوسیلهٔ برنامهٔ کاربردی برنامهپذیر شدند. یکی از جذابترین پیامدهای این تغییر آن بود که بسیاری از روشهایی که پیشتر بهدلیل نبودن در خط لولهٔ ثابت نمیتوانستند بهصورت بلادرنگ اجرا شوند، اکنون امکان اجرای بلادرنگ پیدا کردند. نگاشت برجستگی، که در صفحهٔ رنگی ۶ دیدیم، تنها یک نمونه از الگوریتمهایی است که امروز قابل برنامهریزی است اما پیشتر فقط بهصورت آفلاین اجرا میشد.
برنامههای رأس میتوانند هنگام عبور هر رأس از خط لوله، مکان یا رنگ آن را تغییر دهند. بنابراین میتوان انواع مدلهای نور–ماده را پیادهسازی کرد یا گونههای تازهای از تصویرسازی ساخت. برنامههای قطعه نیز اجازه میدهند بافتها را به روشهای جدید به کار ببریم و بخشهای دیگری از خط لوله، مانند نورپردازی، را بهجای سطح رأس در سطح هر قطعه پیادهسازی کنیم.
برنامهپذیری اکنون در همهٔ سطوح، حتی دستگاههای دستی مانند تلفن همراه، در دسترس است. WebGL در مرورگرهای وب تعبیه شده است. در ردهٔ سامانههای قدرتمند، سرعت و موازیسازی GPUهای برنامهپذیر آنها را برای محاسبات پرفورمنس بالا که الزاماً گرافیکی نیستند نیز مناسب میکند. نسخههای جدیدتر OpenGL در واکنش به این پیشرفتها، ابتدا برنامهپذیری را بهعنوان گزینهای جایگزین خط لولهٔ ثابت به استاندارد افزودند و سپس به نسخههایی رسیدند که برنامهٔ کاربردی باید هم Vertex Shader و هم Fragment Shader را فراهم کند. در سراسر کتاب از همین استانداردهای جدید پیروی میشود. هرچند برنامههای نخست ما بهدلیل استفادهنکردن از خط لولهٔ ثابت کمی کد بیشتری خواهند داشت، پاداش آن قابل توجه است: کد کارآمد و بهآسانی قابل گسترش خواهد بود.
۱.۹ ویژگیهای عملکردی
در معماری ما دو نوع پردازش بنیادی و متفاوت وجود دارد. در بخش جلویی، پردازش هندسی انجام میشود: رأسها از تبدیلهای گوناگون، سایهزنی رأس، برش و مونتاژ بدوی عبور میکنند. این پردازش برای خط لوله بسیار مناسب است و معمولاً شامل محاسبات ممیز شناور میشود. «موتور هندسه» توسعهیافته توسط Silicon Graphics, Inc. یا SGI، بسیاری از این عملیات را در یک تراشهٔ VLSI ویژه پیادهسازی میکرد و پایهٔ مجموعهای از Workstationهای گرافیکی سریع شد. بعدها تراشههای شتابدهندهٔ ممیز شناور، واحدهای تبدیل ماتریسی 4 × 4 را روی تراشه قرار دادند و ضرب ماتریسی را به یک دستور کاهش دادند. امروزه Workstationهای گرافیکی و کارتهای گرافیکی عمومی از GPUهایی استفاده میکنند که بیشتر عملیات گرافیکی را در سطح تراشه انجام میدهند. معماری خط لوله نوع غالب سامانههای با کارایی بالا است.
از مرحلهٔ رسترسازی به بعد، و در بسیاری از قابلیتهایی که بعداً بررسی خواهیم کرد، پردازش شامل دستکاری مستقیم بیتهای موجود در بافر فریم است. این پردازش بخش پشتی از نظر بنیادی با پردازش بخش جلویی تفاوت دارد و بهطور مؤثر با معماریهایی پیادهسازی میشود که توان جابهجایی سریع بلوکهای بیت را دارند.
عملکرد کلی سامانه را میتوان با دو معیار توصیف کرد: سرعت عبور موجودیتهای هندسی از خط لوله و تعداد پیکسلهایی که در هر ثانیه میتوان در بافر فریم تغییر داد. بنابراین سریعترین Workstationهای گرافیکی در بخش جلویی دارای خط لولههای هندسی و در بخش پشتی دارای پردازندههای بیتی موازیاند. تا حدود یک دهه پیش از زمان نگارش کتاب، تمایز روشنی میان پردازش جلو و پشت وجود داشت و برای هر بخش اجزا و بردهای جداگانهای اختصاص داده میشد. اما کارتهای گرافیکی عمومی جدید از GPUهایی استفاده میکنند که کل خط لوله را درون یک تراشه جای میدهند. کارتهای تازهتر تمام خط لوله را با حساب ممیز شناور پیادهسازی میکنند و حتی بافر فریم ممیز شناور دارند. این GPUها آنقدر قدرتمندند که سامانههای ردهبالا، حتی سامانههای دارای چند خط لوله، نیز از همین پردازندهها استفاده میکنند.
معماری خط لوله در گرافیک، بهویژه جایی که عملکرد بلادرنگ اهمیت دارد، غالب است. تا اینجا استدلال کردیم که چنین معماریای مبنای مناسبی برای پیادهسازی سختافزار سامانه است و کارتهای گرافیکی عمومی نیز خط لوله را در GPU خود جای دادهاند. حتی کارتهای ارزان میتوانند در هر ثانیه میلیونها چندضلعی سایهزده و بافتگذاریشده را رندر کنند. اما میتوان استدلالی به همان اندازه قوی برای استفاده از خط لوله بهعنوان مبنای یک پیادهسازی کاملاً نرمافزاری از API ارائه کرد. قدرت الگوی دوربین مصنوعی در این است که در هر دو حالت بهخوبی کار میکند.
بااینحال، هرجا واقعگرایی اولویت بالاتری داشته باشد، انواع دیگر رندرکنندهها میتوانند با صرف زمان محاسباتی بیشتر نتیجهٔ بهتری تولید کنند. رابط RenderMan شرکت Pixar برای اتصال به رندرکنندهٔ آفلاین آن شرکت ساخته شد. روشهای مبتنی بر فیزیک مانند رهگیری پرتو و رادیوسیتی میتوانند تصاویر فوتورئالیستی بسیار دقیق بسازند، اما معمولاً نه در زمان واقعی.
جمعبندی و یادداشتها
در این فصل زمینهٔ لازم برای توسعهٔ بالا به پایین گرافیک رایانهای فراهم شد. تصویر کلی ارائه شد تا در فصل بعد بتوانید بدون احساس جدایی از مفاهیم پایه، نوشتن برنامههای کاربردی گرافیکی را آغاز کنید.
تأکید کردیم که گرافیک رایانهای روشی برای تشکیل تصویر است و باید آن را با روشهای کلاسیک تشکیل تصویر، بهویژه سامانههای نوری مانند دوربین، مرتبط دانست. افزون بر توضیح دوربین روزنهای، سامانهٔ بینایی انسان نیز معرفی شد؛ هر دو نمونههایی از سامانههای تصویربرداریاند.
چند الگوی تشکیل تصویر توصیف شد که هر یک در گرافیک رایانهای کاربرد دارند. مدل دوربین مصنوعی دو پیامد مهم دارد. نخست، بر استقلال اشیا و مشاهدهگر تأکید میکند؛ تمایزی که روش مناسبی برای سازماندهی توابع یک کتابخانهٔ گرافیکی فراهم میکند.
دوم، این مدل به مفهوم معماری خط لوله منتهی میشود؛ معماریای که در آن هر مرحلهٔ خط لوله عملیات مشخصی روی موجودیتهای هندسی انجام میدهد و سپس اشیای تبدیلشده را به مرحلهٔ بعد میفرستد.
همچنین ایدهٔ دنبالکردن پرتوهای نور برای بهدستآوردن تصویر معرفی شد. این الگو برای فهم برهمکنش نور و ماده، که برای تشکیل فیزیکی تصویر ضروری است، اهمیت ویژهای دارد. چون رهگیری پرتو و راهبردهای مبتنی بر فیزیک دیگر در چارچوب مورد بحث کتاب توان رندر بلادرنگ صحنهها را ندارند، بحث بیشتر دربارهٔ آنها تا فصل ۱۱ به تعویق انداخته میشود.
الگوی مدلسازی–رندرینگ نیز اهمیت روزافزونی یافته است. یک Workstation گرافیکی استاندارد میتواند در هر ثانیه میلیونها پارهخط یا چندضلعی را با وضوحی بیش از 2048 × 1546 پیکسل تولید کند. چنین سامانهای میتواند چندضلعیها را با مدل سایهزنی ساده سایه بزند و تنها سطوح مرئی را با همین نرخ نمایش دهد. بااینحال تصاویر واقعگرایانه ممکن است برای همترازی با وضوح فیلم به وضوحی تا 4000 × 6000 پیکسل نیاز داشته باشند و از جلوههای نور و مادهای استفاده کنند که در زمان واقعی قابل پیادهسازی نیستند. حتی با ادامهٔ افزایش توان سختافزار و نرمافزار، هدفهای مدلسازی و رندرینگ چنان متفاوتاند که انتظار میرود تمایز میان آنها باقی بماند.
گام بعدی بررسی سوی کاربردی برنامهنویسی گرافیکی است. از API مربوط به OpenGL استفاده خواهیم کرد؛ APIای قدرتمند که روی بیشتر سکوها پشتیبانی میشود و معماری مشخص آن اجازه میدهد بفهمیم گرافیک رایانهای از برنامهٔ کاربردی تا تصویر نهایی روی نمایشگر چگونه عمل میکند.
منابع پیشنهادی
کتابهای درسی بسیار خوبی دربارهٔ گرافیک وجود دارد. کتاب Newman و Sproull [New73] نخستین اثری بود که دیدگاه نوین مبتنی بر مدل دوربین مصنوعی را اتخاذ کرد. نسخههای مختلف کتاب Foley و همکاران [Fol90, Fol94] بیش از یک دهه از منابع استاندارد این حوزه بودهاند. متنهای مناسب دیگر شامل Hearn و Baker [Hea11]، Hill [Hil07] و Shirley [Shi02] هستند.
منابع عمومی خوب شامل نشریهٔ فصلی Computer Graphics متعلق به SIGGRAPH ــ گروه تخصصی گرافیک در Association for Computing Machinery ــ و نیز IEEE Computer Graphics and Applications و Visual Computer هستند. مجموعهمقالات کنفرانس سالانهٔ SIGGRAPH تازهترین روشها را شامل میشود. این مجموعهها در گذشته بهصورت شمارهٔ تابستانی Computer Graphics منتشر میشدند، اما بعدها بهعنوان شمارهای از ACM Transactions on Graphics و روی DVD منتشر شدند. برای تازهواردان این حوزه، پویانماییهای روز و یادداشتهای دورههای آموزشی SIGGRAPH اهمیت ویژه دارند و آنها نیز روی DVD یا در کتابخانهٔ دیجیتال ACM در دسترس بودهاند.
رسالهٔ دکتری Sutherland که با عنوان Sketchpad: A Man–Machine Graphical Communication System [Sut63] منتشر شد، احتمالاً اثر بنیادین توسعهٔ گرافیک رایانهای تعاملی است. Sutherland نخستین کسی بود که قدرت الگوی جدید تعامل انسان با تصاویر روی نمایشگر CRT را بهروشنی درک کرد. نسخههای ویدئویی از فیلم کار اصلی او همچنان وجود دارند.
کتابهای Tufte [Tuf83, Tuf90, Tuf97] اهمیت طراحی دیداری مناسب را نشان میدهند و اطلاعات تاریخی قابل توجهی دربارهٔ توسعهٔ گرافیک دارند. مقالهٔ Carlbom و Paciorek [Car78] نیز رابطهٔ میان مشاهدهٔ کلاسیک ــ مانند آنچه در معماری استفاده میشود ــ و مشاهدهٔ رایانهای را بهخوبی بررسی میکند.
کتابهای فراوانی سامانهٔ بینایی انسان را شرح دادهاند. Pratt [Pra78] بحث کوتاه و مناسبی برای کار با نمایشگرهای رستری ارائه میکند. همچنین میتوان به Glassner [Gla95]، Wyszecki و Stiles [Wys82] و Hall [Hal89] مراجعه کرد.
تمرینها
۱.۱ رویکرد خط لولهای در تولید تصویر یک رویکرد غیر فیزیکی است. مزایا و معایب اصلی چنین رویکردی چیست؟
۱.۲ در گرافیک رایانهای، اشیایی مانند کره معمولاً با اشیای سادهتر ساختهشده از چندضلعیهای تخت، یعنی چندوجهیها، تقریب زده میشوند. با استفاده از خطوط طول و عرض جغرافیایی، مجموعهای از چندضلعیهای ساده تعریف کنید که کرهای با مرکز مبدأ را تقریب بزنند. آیا میتوان فقط از چهارضلعیها یا فقط از مثلثها استفاده کرد؟
۱.۳ روش دیگری برای تقریب کره از یک چهاروجهی منتظم ساختهشده از چهار مثلث آغاز میکند. با فرض اینکه مرکز آن در مبدأ و یکی از رأسها روی محور y باشد، رأسهایش را بیابید. سپس الگوریتمی بر پایهٔ تقسیم وجوه چهاروجهی برای تولید تقریبهای پیاپی و دقیقتر از کرهٔ واحد به دست آورید.
۱.۴ برش یک پارهخط دوبعدی در برابر یک پنجرهٔ برش مستطیلی را در نظر بگیرید. نشان دهید برای تعیین اینکه پارهخط اصلاً برش نمیخورد، بخشی از آن دیده میشود یا کاملاً حذف میشود، فقط به دو نقطهٔ انتهایی آن نیاز دارید.
۱.۵ برای یک پارهخط نشان دهید برش نسبت به ضلع بالایی مستطیل برش میتواند مستقل از برش نسبت به ضلعهای دیگر انجام شود. از این نتیجه استفاده کنید تا نشان دهید برشدهنده را میتوان بهصورت خط لولهای از چهار برشدهندهٔ سادهتر پیادهسازی کرد.
۱.۶ تمرینهای ۱.۴ و ۱.۵ را به برش در برابر یک متوازیالسطوح قائم سهبعدی گسترش دهید.
۱.۷ نماهای پرسپکتیو مکعب در شکل ۱.۳۹ را در نظر بگیرید. تصویر سمت چپ «پرسپکتیو یکنقطهای» نام دارد، زیرا خطهای موازی در یکی از جهتهای مکعب ــ در امتداد کنارههای سطح بالا ــ در تصویر به یک نقطهٔ گریز همگرا میشوند. در مقابل، تصویر سمت راست پرسپکتیو دونقطهای است. رابطهٔ مشخص میان مشاهدهگر یا دوربین ساده و مکعب را که سبب میشود یکی دونقطهای و دیگری یکنقطهای باشد، توصیف کنید.
۱.۸ حافظهٔ بافر فریم باید آنقدر سریع باشد که نمایشگر با نرخی کافی برای جلوگیری از سوسوزدن بازآوری شود. یک نمایشگر معمول Workstation میتواند وضوح 1280 × 1024 پیکسل داشته باشد. اگر نمایشگر در هر ثانیه ۷۲ بار بازآوری شود، حافظه باید چه سرعتی داشته باشد؟ به بیان دیگر، برای خواندن یک پیکسل از حافظه چه مقدار زمان در اختیار داریم؟ همین مقدار را برای نمایشگر 480 × 640 که با ۶۰ هرتز و بهصورت درهمبافته کار میکند محاسبه کنید.
شکل ۱.۳۹ — نماهای پرسپکتیو یک مکعب.
۱.۹ فیلمهای سینمایی معمولاً روی فیلم ۳۵ میلیمتری با وضوح تقریبی 2000 × 3000 پیکسل تولید میشوند. این وضوح چه پیامدی برای تولید تصاویر پویانمایی تلویزیونی در مقایسه با فیلم سینمایی دارد؟
۱.۱۰ طراحی یک API گرافیکی دوبعدی برای کاربردی مشخص، مانند طراحی VLSI، را در نظر بگیرید. همهٔ بدویها و ویژگیهایی را که در سامانهٔ خود قرار میدهید فهرست کنید.
۱.۱۱ میتوان CRT رنگیای طراحی کرد که فقط یک تفنگ الکترونی داشته باشد و از ماسک سایه استفاده نکند. پرتو منفرد در زمانهای مناسب روشن و خاموش میشود تا فسفرهای موردنظر را تحریک کند. چرا طراحی چنین CRTای ممکن است از CRT دارای ماسک سایه دشوارتر باشد؟
۱.۱۲ در یک CRT معمولی دارای ماسک سایه، برای دستیابی به نمایش هموار باید پهنای یک پیکسل تقریباً سه برابر پهنای یک سهتایی فسفری باشد. فرض کنید نمایشگر 1280 × 1024 پیکسل دارد، قطر CRT برابر ۵۰ سانتیمتر و عمق آن ۲۵ سانتیمتر است. فاصلهٔ تقریبی میان سوراخهای ماسک سایه را برآورد کنید.
۱.۱۳ برای درک سرعت رشد کارایی گرافیک، به مشخصات نسلهای مختلف GPU از سازندگانی مانند NVIDIA، ATI و Intel مراجعه و آنها را مقایسه کنید. عملکرد هندسی با چه سرعتی افزایش یافته است؟ پردازش پیکسل چه روندی داشته است؟ هزینه بهازای هر مثلث رندرشده چگونه کاهش یافته است؟