بخش دوم

مدلها و صحنه‌ها در رندرمن

 

رندرمن به دو بخش مجزا و مكمل يكديگر تقسيم مي‌شود: مدلسازي صحنه و مدلسازي رونما(ظاهر). مكان و ويژگيهاي اشياء، نورها و دوربينهاي يك صحنه و به همين صورت پارامترهاي تصوير حاصل براي يك رندرگر مبتني بر رندرمن به وسيلة رابط رندرمن[1] توصيف مي‌شود. جزئيات ظاهري اشياء و نورها براي يك رندرگر مبتني بر رندرمن به وسيلة زبان سايه‌زني رندرمن[2] توصيف مي‌شود.

 

1-     اي.پي.آي توصيف صحنه

 

رابط رندرمن يك اي. پي. آي توصيف صحنه است. اي.پي.آي مخفف رابط برنامه‌نويسي كاربرد[3] مي‌باشد ولي مفهوم واقعي آن در عبارت است از يك مجموعه از انواع داده‌ها و فراخوانيهاي تابع كه براي انتقال داده‌ها از يك بخش سيستم به بخش ديگر سيستم (در نمونة مورد بحث ما از يك مدلساز به يك رندرگر) استفاده مي‌شود.

كاربران رندرمن اغلب به دو دستة مجزا تقسيم مي‌شوند:

·         كاربران برنامه‌هاي پيچيدة مدلسازي صحنه كه اين برنامه‌ها توصيف صحنه را مستقيماُ به رندر كننده مي‌دهند و كاربران آنها هيچ‌وقت داده‌اي را نمي‌بينند.

·         دستة ديگر از كاربران رندرمن شامل دسته‌اي است كه توصيف صحنه را يا مستقيماُ خودشان مي‌نويسند و يا از برنامه‌هاي همه‌كارة مدلسازي نوشته شده توسط خودشان استفاده مي‌كنند. دستة اخير لازم است كه به طور كامل در جريان اي.پي.آي مربوط به واسط رندرمن باشند.

در طول زمان اين دو گروه تمايل به انجام كار به شيوة مختلط پيدا كرده‌اند.  به عنوان مثال كاربر برنامه‌هاي مدلساز آموخته است كه روي توصيف صحنة ايجاد شده توسط برنامة مدلساز كار كند و آن را تغيير دهد و به اين ترتيب اين دسته به اين ترتيب تبديل به برنامه‌نويسان واسط رندرمن شده‌اند.

 در بخشهاي بعدي رابط رندرمن (يا اي. پي. آي مربوط به آن) را شرح مي‌دهيم و سعي مي‌كنيم اين موضوع را نشان دهيم  كه اين اي.پي.آي چگونه توسط كاربران هر دو گروه مورد استفاده قرار مي‌گيرد تا توانايي ايجاد توصيف صحنه‌هاي دلخواه و توانا را به آنها اعطا كند. اين بخشها به صورت خلاصه به اين بحث مي‌پردازند و بسياري از جزئيات را از نظر دور خواهند داشت. اين جزئيات مي‌توانند در RenderMan Interface Specification كه معمولاُ به صورت وسيع در مجموعه‌هاي اسناد رندرمن قرار داده شده است يافت شوند.

 

1-1-         مقيدسازيهاي زباني

 

در زبان علم كامپيوتر يك اي.پي.آي مي‌تواند چندين مقيدسازي زباني داشته باشد به اين معني كه نگارشهاي مختلف يك اي.پي.آي همه اساساً يك كار را انجام مي‌دهند ولي براي برنامه‌نويسان كاربردي يك زبان يا سيستم برنامه‌نويسي مي‌توانند بدلخواه تنظيم شوند.

رابط رندرمن دو مقيدسازي رسمي دارد. يكي براي برنامه‌نويسان C و ديگري يك فرمت متافايل است كه RIB [4]ناميده مي‌شود. جزئيات اين دو پياده‌سازي مي‌توانند در ضميمة C اسناد RenderMan Interface Specification يافت شوند. پياده‌سازيهايي براي ساير زبانهاي برنامه‌نويسي مثل C++ ، LISP ، tcl و اخيراً Java پيشنهاد شده است ولي هيچكدام توسط پيكسار[5] به صورت رسمي پذيرفته نشده‌اند. توصيفات اخير رابط رندرمن روي پياده‌سازي C متمركز شده بود چرا كه تصور مي‌شد بيشتر استفاده‌كنندگان اين اي.پي.آي، برنامه‌نويسان سيستمهاي مدلسازي خواهند بود: كاربراني كه به طور معمول هرگز داده‌هاي واسط رندرمن را نخواهند ديد. پياده‌سازي RIB قبل از انتشار كتاب RenderMan Companion هنوز منتشر نشده بود و بنابراين اين كتاب متاُسفانه هيچگونه ارجاعي به RIB ندارد. ما RIB را به خاطر طبيعت خاصش يك فرمت متافايل مي‌ناميم. متافايلها فايلهاي داده‌اي هستند كه يك سري فراخوانيهاي رويه‌اي اي.پي.آي را كدگذاري مي‌كنند. RIB يك زبان برنامه‌نويسي نيست و ساختارهاي برنامه‌نويسي را مانند متغيرها و حلقه‌ها  ندارد و فقط شامل يك سري فراخواني به پياده‌سازي اي. پي. آي زبان C به شكل متني است. در واقع نحو RIB به گونه‌اي طراحي شده كه به شدت به مقيدسازي زبان C نزديك باشد بدون اين كه با آن يكي باشد. به عنوان مثال فراخوانيهاي يك روية رندرمن تحت مقيدسازي C مي‌تواند به صورت زير باشد:

RiAttributeBegin ( );

RiTranslate ( 0.0, 14.0, -8.3 );

RiSurface ( "plastic" ,RI_NULL );

RiSphere ( 1.0, -1.0, 1.0, 360.0, RI_NULL );

RiAttributeEnd ( );

در حالي كه نگارش RIB File دنبالة مذكور به صورت زير خواهد بود:

AttributeBegin

Translate 0.0 14.0 -8.3

Surface "plastic"

Sphere 1.0 -1.0 1.0 360.0

AttributeEnd

هر دستور RIB همان نام را خواهد داشت بدون پيشوند Ri و پارامترهايي همنوع با فراخواني تابع را دارد و ترتيب پارامترهاي آن نيز مشابه فراخواني تابع است در بغضي موارد تفاوتهاي كوچكي وجود دارد كه دليل آن وجود برخي شرايط خاص مي‌باشد مانند اين كه فراخوانيهاي C زنده[6]  هستند به عنوان مثال مدل برنامه‌سازي اين زبان مي‌تواند بعضي پارامترها را به نقطة فراخواني تابع به صورت ارجاعي بازگرداند در حالي كه فراخوانيهاي RIB به اين صورت نيستند به همين لحاظ مثالهاي فراخواني واسط رندرمن در C و در RIB معادلند و مانند يكديگر توصيف مي‌شوند، در كتاب مرجع ما[7]  ما تمامي مثالها را به صورت  RIB نشان داده شده‌ و دليل آن خلاصه‌تر بودن آن به نسبت C عنوان شده است. RIB روشي براي فشرده كردن دنبالة دادة متني با به وجود آوردن عبارات دودويي براي هر كلمه دارد. بعضي از رندرگرها هم مي‌توانند RIB را به صورت فشرده شده به وسيلة gzip بگيرند تا در فضاي استفاده شده صرفه‌جويي شود. ما در مورد اين نوع جزئيات در اين بخش بحث نخواهيم كرد چرا كه حاصل اين فشرده‌سازيها با فايلهاي اصلي كاملاٌ معادلند ولي كمي پيچيده‌ترند. مانند قبل RenderMan Interface Specification در ضميمة C توضيحات مربوط به جزئيات مذكور را خواهد داشت.

 

1-2-         رويكرد مدلسازي

 

رندرمن يك زبان توانمند ولي ساده براي توصيف اشياء در صحنه است. مانند ساير اي. پي. آي هاي گرافيك كامپيوتري (به عنوان نمونه PHIGS+، OpenGL و Java3D ) دستوراتي براي كشيدن اوليه‌هاي گرافيكي در مكانهاي خاص و با ويژگيهاي ديداري معين دارد ولي در طراحي متفاوت آن با آن اي.پي.آي ها قصد بر اين بوده است كه رندرمن ارائه‌گر يك توصيف سطح بالا باشد چنانكه در اين زبان تنها كافي است توضيح داده شود كه چه چيزي بايد رندر شود و نيازي به توضيح چگونگي انجام اين عمل نمي‌باشد. به همين لحاظ اين اي. پي. آي دستوراتي براي ايجاد اوليه‌هاي گرافيكي سطح بالا مانند cubic patches، NURBS و توصيفات انتزاعي از ويژگيهاي ديداري مانند سايه‌زنهاي زبان سايه‌زني را در خود دارد. همچنين اين اي.پي.آي به گونه‌اي طراحي شده است كه داراي توصيف صحنه‌هاي به اندازة كافي توانمند باشد كه رندرگرهاي تصوير واقعي مانند ray tracerها با استفاده از شتاب‌دهنده‌هاي گرافيكي سخت‌افزاري امروزي اقدام به رندر آنها كنند. در هر حال طراحان اين نكته را در نظر داشتند كه در طول زمان سخت‌افزار گرافيكي ممكن است هم از لحاظ سرعت و هم از لحاظ قابليت رشد كند و احتمالاُ شامل قابليتهايي باشد كه زماني در دامنة عملكرد رندرگرهاي بسيار قدرتمند مانند نقشگذارهاي متني و سايه‌زنها بود و زماني فرا مي‌رسد كه اين قابليتها را به صورت سخت‌افزاري بتوان پياده‌سازي كرد. رندرمن به گونه‌اي طراحي شده است كه فاصلة بين رندرينگ سريع و رندرينگ تصوير واقعي را با در نظر داشتن قيودي كه ممكن است با حذف بعضي قابليتها در ايجاد امكان انجام هر دو سري عمليات به صورت مؤثر ايجاد شود پر كند.

رندرمن از چند قانون اساسي پيروي مي‌كند كه مشخص‌كنندة خط مشي كلي است كه بر اساس آن صحنه‌ها را توصيف مي‌كند. درك اين قوانين شكل‌دهندة گام آغازين براي درك جزئيات هر دستور اي.پي.آي و علت محدوديتها و قدرتهايي است كه هر كدام از آنها دارند. در ادامه به بعضي از اين قوانين اشاره مي‌شود:

 

رندرمن اجازة هيچ نوع ارجاع به جلو را نمي‌دهد:

 

در يك توصيف صحنة رندرمن ، هر چيزي كه براي پردازش يك دستور لازم است قبل از آن دستور تعريف مي‌شود. براي مثال، رنگ و ساير ويژگيهاي ديداري يك شيء اوليه مانند يك كره قبل از جايي كه كره تعريف مي‌شود تعريف مي‌شوند. علاوه بر اين اگر قرار است چند نور بر روي كره بتابد آن نورها نيز بايد قبل از كره تعريف شوند. اين موضوع براي هر جزء شيء نيز مصداق دارد.

در اين راه رندرمن خود را با روش رندرينگ گرافيك مد فوري  سخت‌افزاري[8] ( كه از لحاظ ساختار دروني نيز بسيار شبيه به آن است ) وفق مي‌دهد. از آنجا كه هر اوليه دقيقاً در همان زماني كشيده مي‌شود كه دستور اجرا مي‌شود امكاني براي اين كه نورها بعداً در توصيف صحنه گنجانده شوند وجود ندارد و به همين دليل كسي نمي‌تواند انتظار داشته باشد كه بتواند با استفاده از اين اي.پي.آي مثلاً بر روي كره‌اي كه چند ثانيه قبل ايجاد شده نور بتاباند. اين كره قبلاً كشيده شده است و رنگ آن نمي‌تواند تغيير كند. به همين دليل ساختار يك توصيف صحنة رندرمن خيلي قابل پيش‌بيني است: در ابتدا پارامترهاي تصوير تعريف مي‌شوند سپس پارامترهاي دوربين مدل تعريف مي‌شوند كه شامل مكان دوربين در فضاي سه‌بعدي است و سپس نورها و ساير خصوصيات عمومي صحنه تعريف مي‌شوند و در نهايت ويژگيهاي خصوصي اوليه‌ها و سپس تعريفهاي مربوط به خود اوليه‌ها پديدار مي‌گردند.

 

رندرمن از يك وضعيت گرافيكي سلسله‌مراتبي محدود براي انتقالها و ويژگيهاي شيء استفاده مي‌كند:

 

ويژگيهاي اوليه‌[9]ها در يك پايگاه‌داده‌ها كه وضعيت گرافيكي ناميده مي‌شود ذخيره مي‌شود و با آن به عنوان يك پشته برخورد مي‌شود. مجموعة ويژگيهاي واقع در بالاي پشته در هنگام ايجاد يك اوليه در واقع مجموعه ويژگيهايي هستند كه در فرايند رندر شدن آن اوليه و هر چيزي كه به آن وابسته است دخالت دارند. ويژگيهايي كه مي‌توانند تغيير كنند و اوليه‌هايي جديدي كه با وضعيت جديد ايجاد مي‌شود يا كلية وضعيت گرافيكي مي‌تواند در داخل پشته قرار داده[10] شوند كه بعدها با برداشته شدن[11] از پشته به آن مي‌تواند مراجعه شود. در اين روش ساختن مدلهاي سلسله‌مراتبي مانند رباتها يا شخصيتهاي داراي مفصل با پوش كردن هر اتصال در داخل پشته بسيار ساده است. به اين نكته توجه شود كه توصيف صحنه يك گراف جهت‌دار بدون حلقه[12] -چنانكه بسياري از برنامه‌هاي مدلسازي از اين مدل استفاده مي‌كنند- نيست بلكه يك درخت ساده است.

ماشين قرار دهنده در و بردارنده از پشتة وضعيت گرافيكي در بردارندة يك عمليات معمول و بسيار كم‌هزينه است. علاوه بر اين توصيف صحنه‌هاي رندرمن از چند ’مد‘  پركاربرد استفاده مي‌كند. هر كدام از اين مدها نيز به گونه‌اي در سلسله‌مراتب جايگذاري شده است كه ورود وخروج به آنها معادل قرار دادن در و برداشتن  از پشتة ماشين حالت ‌باشد.

 

اي.پي.آي رندرمن هم براي طراحان رندرگرها و هم براي كاربران آنها قابل گسترش است:

 

طراحان رابط رندرمن به اين نكته واقف بودند كه فن‌آوري به سرعت پيشرفت مي‌كند و يك اي.پي.آي گرافيكي كه به يك مجموعة خاص از اوليه‌ها، ويژگيهاي ديداري و الگوريتمها محدود باشد به زودي يا از رده خارج خواهد شد يا اين كه به بروزآوريهاي متوالي و نامتناهي نيازمند خواهد گرديد. بنابراين اين اي.پي.آي به گونه‌اي طراحي شد كه سازوكار توسعة آن در خود آن قرار داده شود تا طراحان توانايي دستكاري حتي كوچكترين جزئيات آن را داشته باشند و براي هر فريم از صحنه بتوان اي.پي.آي را منتاسب با كاربرد آن تغيير داد.

مهم‌ترين نكته در اين سازوكار قابل توسعه مفهوم ليست پارامترها مي‌باشد. به خاطر اين كه براي هر فراخواني ممكن توابعِ اين اي.پي.آي هر پارامتر ممكن قبلاً داراي مقدار پيش‌فرض مي‌باشد هر فراخواني اين توابع تنها در بردارندة ليست پارامترهاي لازم است و در ادامه در بردارندة يك ليست با طول متغير از پارامترهاي انتخابي مي‌باشد. اين پارامترهاي اضافي ليست پارامترها ناميده مي‌شوند و به وسيلة زوجهاي فيلد و مقدار –آن سان كه در پارامترهاي كليدي زبانهاي تفسيري همچون ليسپ مشاهده مي‌شود- مشخص مي‌گردند. هر نام(فيلد) يك رشتة كاراكتري است كه در حالت ايده‌آل مفهوم پارامتر مورد نظر را مي‌رساند - همچون width يا compression - و مقدار يك آرايه از داده‌هاست. آنچه رندرمن را از ساير اي.پي.آيهاي داراي اين خصوصيت متمايز مي‌سازد اين ويژگي است كه به كاربر اجازه مي‌دهد ليست پارامترهاي بدلخواه و داراي مقادير از پيش‌تعريف شدة خود را به فراخوانيها بيفزايد و به اين ترتيب قابليتهاي توصيف صحنه را توسعه دهد. اين ويژگي باعث مي‌شود كه انواع دادة از پيش تعريف شده، انواع دادة مختص رندرگر وانواع دادة مختص كاربر بدون هيچگونه تداخل نحوي بتوانند به طور هم‌زمان در يك توصيف صحنه حضور داشته باشند.

علاوه بر اين رندرمن چند روش ديگر منحصر به خود را براي ارائة قابليت توسعه به كاربران آن و طراحان رندرگرهاي مبتني بر اين اي.پي.آي فراهم آورده است.

 

1-3-         سازگاري

 

ويرايش 3.1  ’خصوصيات رابط رندرمن‘[13]  - انتشار 1989- در بخشي كه به توصيف آنچه كه سازگار با رابط رندرمن مي‌باشد پرداخته، قابليتهاي يك رندرگر مبتني بر اين رابط را به ’قابليتهاي لازم‘ و ’قابليتهاي انتخابي‘ تقسيم مي‌نمايد و مشخص مي‌كند كه اگر قابليتهاي انتخابي در رندرگر پياده‌سازي نشده باشد چگونه بايد عمل شود. كتاب RenderMan Companion رابط رندرمن را به صورت كلي و بدون اشاره به قابليتهاي پياده‌سازي شده در رندرگرهاي  خاص توضيح مي‌دهد. تمامي اين نگاه‌ها مربوط به زماني بود كه رندرمن يك استاندارد بي‌رقيب براي گرافيك كامپيوتري پيشرفته بود.

به هر حال امروزه رندرمن يك استاندارد صنعتي نيست و تنها تعريف يك رابط پركاربرد ولي متعلق به سازماني خاص مي‌باشد. بنابراين با هر تغيير اعمال شده در رابط آن، شاهد بروز شدن اسناد مربوط به آن نيستيم چرا كه امروزه سازگاري با رندرمن هم‌معناي سازگاري با PRMan [14] مي‌باشد. BMRT به صورت قابل ملاحظه‌اي با نسخة پيكسار سازگار است كه علت آن هم چك شدن آن با انبوه مدلهاي به وجود آمده قبل از اين رندرگر براي اثبات كارايي آن در استفاده از رابط رندرمن مي‌باشد. همچنانكه رندرگرهاي جديد مبتني بر رابط رندرمن به ظهور مي‌رسند لزومي براي حفظ سازگاري با استانداردهاي قبلي براي آنها در نظر گرفته نمي‌شود و تمامي تصميمهاي مربوط به حفظ سازگاري به طراحان و كاربران آن رندرگرها واگذار مي‌شود.

به همين دلايل كتاب مرجع ما[15] به ذكر خصوصيات دقيق مربوط به سازگاري كدها نمي‌پردازد و به ارائة اين اي.پي.آي به همان صورت كه امروزه وجود دارد و مورد استفاده قرار مي‌گيرد مي‌پردازد.

 

2-     ساختار يك توصيف صحنه

 

توصيف صحنه‌هاي رندرمن ساختار خاصي دارد كه در درخت حالت گرافيكي سلسله‌مراتبي تجسم مي‌يابد. در واقع چندين فراخواني وجود دارد كه پشتة حالت گرافيكي سلسله‌مراتبي را دستكاري مي‌كنند. برخي وضعيت حالت گرافيكي را تغيير مي‌دهند، برخي ديگر يك زيرمجموعه از ويژگيها را در داخل پشته قرار مي‌دهند. زيردرخت سلسله‌مراتب واقع در زوج متوازن اين دستورات را كه بلوك خوانده مي‌شود توصيف مي‌كنيم. واقع بودن در يك بلوك خاص به معناي آن است كه يكي از اجداد آن سطح از سلسله‌مراتب با استفاده از آن فراخواني خاص اي.پي.آي ايجاد شده است.

 

2-1            رئوس مطالب

 

توصيف صحنه به دو فاز تقسيم مي‌شود: يكي كه مشاهده‌گر[16] را توصيف مي‌كند و ديگري كه جهان[17] را. توصيف مشاهده‌گر رندرمن شامل پارامترهاي گوناگون دوربين به همراه پارامترهاي فايل تصويري است كه توليد مي‌شود. اين پارامترها انتخاب[18] خوانده مي‌شوند و در كل تصوير توليد شده عمومي هستند. توصيف جهان در رندرمن شامل تمامي حجم صحنه است كه شامل توصيف ماده و پارامترهاي ديگر كه مي‌توانند مختص شيء خاص در صحنه باشند مي‌باشد.

اين پارامترها ويژگي[19] ناميده مي‌شوند. نمايز بين توصيف مشاهده‌گر و توصيف صحنه‌ها با ظهور كلمة WorldBegin كه با استفاده از آن يك بلوك جهان[20] آغاز مي‌شود مشخص مي‌گردد. رندركردن يك نقاشي متحرك ممكن است شامل رندر كردن تعداد زيادي فريم باشد و هر يك فريم ممكن است نياز به رندر كردن تعداد معيني تصوير براي استفاده به عنوان نقش متن[21] يا ساير اهداف باشد. اي.پي.آي توصيف صحنه اجازة چنين تقسيم منطقي كاري را نيز مي‌دهد. بنابراين يك توصيف صحنة رندرمن به صورت يك مجموعه از بلوكهاي تودرتو[22] مطابق ترتيب زير به وجود مي‌آيد.

اين بلوكها توسط اين فراخوانيهاي اي.پي.آي رندرمن از هم جدا مي‌شوند:

WorldBegin

توصيف صحنة يك تصوير منفرد را آغاز مي‌كند. ماتريس انتقال فعلي به عنوان ماتريس دوربين به جهان[23] ذخيره مي‌شود و ماتريس جديد شيء به جهان[24] با ماتريس مشخصه[25] مقدار اوليه مي‌گيرد. به عنوان يك اثر جانبي حالت ويژگي عمومي نيز در داهل پشته قرار مي‌شود. بلوك جهان نمي‌تواند تو در تو باشد.

WorldEnd

توصيف صحنة يك تصوير منفرد را به اتمام مي‌رساند و باعث مي‌شود كه تصوير رندر شود.

FrameBegin frameno

توصيف يك فريم منفرد را كه بايد رندر شود آغاز مي‌كند. يك فريم مي‌تواند به هر تعداد بلوك جهان داشته باشد كه هر كدام نقش متنها، نقش سايه‌ها، عناصر زمينه‌اي يا هر عنصر لازم براي ايجاد يك تصوير واقعي را مي‌توانند ايجاد كند. شمارة فريم يعني پارامتر frameno فقط براي توصيف است.

FrameBegin هم وضعيت ويژگيها و هم وضعيت انتخابها را در داخل پشته قرار مي‌دهد. (يك بلوك فريم منحصر به فرد وجود دارد.)

FrameEnd

توصيف يك فريم را خاتمه مي‌دهد و وضعيت انتخابها و ويژگيها را از داخل پشته بيرون مي‌آورد.

يك بلوك ويژگي تمام توصيف صحنه‌اي است كه بين دو AtttributeBegin و AttributeEnd متناظر قرار دارند. وضعيت ويژگي تمام ويژگيهاي ديداري[26] يك اولية هندسي مانند رنگ و سايه‌زنهايي كه به شيء الحاق شده‌اند را در بردارد. پشتة ماتريس انتقال نيز مي‌تواند به صورت مستقل از باقي وضعيت ويژگيها با استفاده از TransformBegin و TransformEnd (كه يك بلوك انتقال را ايجاد مي‌كنند) در پشته قرار  داده شود ويا از آن برداشته شود. ولي آن فراخوانيهاي پشته بايد به گونه‌اي كه كاملاً به صورت تو در تو در يك بلوك ويژگي قرار گيرند انجام شود.

AttributeBegin

كل وضعيتهاي گرافيكي شامل پشتة انتقال را در داخل پشته قرار مي‌دهد اگر چه بلوكهاي ويژگي به طور معمول در داخل بلوك جهان استفاده مي‌شوند ولي استفاده از آنها در خارج از اين بلوك نيز كاملاً درست است.

AttributeEnd

از پشتة ويژگي عناصر آن را برمي‌دارد.

TransformBegin

عناصر پشتة انتقال را در داخل آن قرار مي‌دهد ولي به ساير ويژگيها كاري ندارد. بلوكهاي انتقال مي‌توانند تو در تو و در داخل بلوكهاي ويژگي و بر عكس باشد ولي كار با پشته بايد متوازن باشد. به عنوان نمونه ترتيب زير درست نيست:

AttributeBegin

TransformBegin

AttributeEnd

TransformEnd

فراخواني TransformEndعناصر پشتة انتقال را در داخل آن قرار مي‌دهد.

 

2-2            اعلان پارمتر

 

در بخش 2-1 به ليست پارامترها توجه نموديم كه در بردارندة اكثريت داده‌هاي جالبي است كه مدلساز به رندرگر ارسال مي‌كند. يك عنصر در ليست پارامترها دو بخش دارد: نام پارمتر و آراية مقادير دادة پارامتر. نام به صورت بديهي يك رشته است در حالي كه مقادير داده مي‌توانند از انواع مختلف باشند.

البته رندرگر نياز دارد كه بداند كه ماهيت داده چيست و چه تعداد عنصر انتظار مي‌رود كه در داخل آرايه قرار داشته باشند. به همين دليل رندرگر يك جدول نشانه‌ها[27] يا يك فرهنگ داده‌ها[28] را نگهداري مي‌كند كه در آن انواع داده‌ها و كلاس ذخيرة[29] هر پارامتري كه مدلساز براي توصيف صحنه استفاده خواهد كرد را در آن نگهداري مي‌كند. انتخابهاي نوع دادة پارمترها شامل تمام انواع  دادة موجود براي متغيرها در زبان سايه‌زني[30] مي‌باشد. كلاسهاي ذخيره براي تعريف روشهاي گوناگون متغيرهاي اوليه كه در بخش 1-2 توصيف خواهند شد استفاده مي‌شوند. به طور منطقي تعداد زيادي پارامتر از پيش تعريف شده (پارامترهايي كه رندرگر از آنها به صورت دروني آگاهي دارد) وجود دارند. به هر حال همانگونه كه در بخشهاي آينده خواهيم ديد بيشتر پارامترهاي مربوط به سايه‌زنها و اوليه‌هاي  هندسي داده‌هايي هستند كه كاربر مدلساز آنها  را خلق نموده است. اين پارامترهاي جديد بايد پيش از آن كه از آنها استفاده شود تعريف شود به طوري كه پارسر RIB بداند كه از چه نوع و به چه مقدار داده مورد نياز است به گونه‌اي كه رندرگر آن را بتواند به درستي مورد پردازش قرار دهد.

Declare name declaration

اين دستور يك نام پارامتر جديد را به فرهنگ واژه‌ها اضافه مي‌كند. نام پارامتر به عنوان شناسه در ليست پارامترهاي بعدي استفاده خواهد شد. اعلان پارامتر كلاس ذخيره و نوع داده را تعيين مي‌كند. نحو اعلان همانند – ولي نه دقيقاً شبيه به – اعلان متغير به صورت «class type› در زبان سايه‌زني است كه در آن class مي‌تواند هر يك از چهار ثابت كلاس ذخيره كه عبارتند از constant، uniform، varying يا vertex باشد. كلمة class اختياري است چرا كه فقط در ارتباط با متغيرهاي اوليه مطرح مي‌شود و اگر كلاس اعلان نشود به طور پيش‌فرض uniform در نظر گرفته مي‌شود. Type هر يك از انواع زبان سايه‌زني كه عبارتند از float، point، vector، normal،  color، string يا matrix است مي‌باشد و مي‌تواند يك آرايه به طول ثابت از انواع بر شمرده شده ( با اعلان طول آرايه در داخل دو كروشه ) نيز باشد.

علاوه بر آن دو نوع داده در اي.پي.آي رندرمن وجود دارد كه در زبان سايه‌زني ديده نمي‌شود كه مي‌تواند نوع داده در اعلان از آن دو نوع داده نيز باشد.

براي نمونه چند اعلان پارامتر در پي مي‌آيد:

Declare “Kd” “uniform float”

Declare “ml” “matrix”

Declare “N” “varying normal”

Declare “supercolor” “color”

Declare “st” “varying float[2]”

Declare “texturenames” “uniform string[2]”

فرهنگ واژه‌هاي پارامترها براي كل صحنه عمومي است. به اين معني كه به عنوان بخشي از وضعيت ويژگي سلسله‌مراتبي در داخل پشته نگهداري نمي‌شود. اگر نام پارامتري دوباره تعريف شود براي باقي ماندة جريان RIB مقدار جديد جايگزين مقدار قبلي خواهد شد و مقدار قبلي به طور كلي از بين خواهد رفت. بنابراين بهتر است كه نام هر پارامتر يكتا باشد. در صورتي كه چنين امكاني وجود نداشته باشد مدلساز سعي مي‌كند در نظر داشته باشد كه هر استفادة نام پارامتر با اعلان فعلي آن نام همخواني دارد و اگر ندارد آن را هر زمان به هر روش ديگر كه مورد استفاده قرار گرفته از نو تعريف مي‌كند.

ويرايشهاي جديدتر PRMan و BMRT اين روند را با استفاده از روش اعلان در خط[31] انجام مي‌دهند. در اين روش يك نام پارامتر مي‌تواند در هنگام استفاده از يك دستور خاص رابط رندرمن تعريف شود و در اين حال نه به تعريف آن در فرهنگ واژه‌ها مراجعه شود و نه چيزي به آن اضافه شود. اعلان پارامترهاي در خط به خاطر شكلشان بسيار شبيه به اعلانهاي زبان سايه‌زني هستند (class type name). براي مثال در اينجا نمونه‌اي آورده مي‌شود كه در آن بدون از بين بردن تعريف اصلي يك پارامتر (Kd) آن را به صورت موقتي از نوع جديد تعريف كرده‌ايم:

Declare “Kd” “uniform float” #تعريف استاندارد

Surface “plastic” “Kd” [.2] #استفادة استاندارد

Surface “carpetfloss” “Ka” [.05]

        “uniform color Kd” [.3 .2 .4] #عادي ولي استفاده به صورت ويژه

Surface “plastic” “Kd” [.5] #دوباره استفادة استاندارد

 

2-3            انتقالها

 

رندرمن به صورت داخلي تمام انتقالها را به صورت ماتريس انتقال و به صورت ويژه ماتريس 4×4 كه قبلاً در بردارهاي رديف ضرب شده‌اند نشان مي‌دهد به عبارت ديگر نقاط به صورت P.M انتقال مي‌يابند و جزء مفسر[32] در پايين در عناصر 12 تا 14 قرار مي‌گيرد.

يك نكته در مورد اصطلاح گيج‌كننده: ماتريس انتقال كه در بالاي پشتة انتقال ظاهر مي‌شود ماتريس انتقال جاري[33] ناميده مي‌شود. دستگاه مختصاتي كه اين ماتريس نشان مي‌دهد به صورت گيج‌كننده‌اي دستگاه مختصات محلي، دستگاه مختصات شيء يا دستگاه مختصات جاري با توجه به شرايط موجود ناميده مي‌شود. آخري از همه بدتر است چرا كه با دستگاه مختصات جاري در زبان سايه‌زني كه به طور كلي چيز ديگري است اشتباه مي‌شود.

براي برنامه‌هاي مدلسازي غالباً آسان‌تر است كه تغييرات دستگاه مختصات محلي را در قالب انتقالهاي ساده بيان كنيم تا آن كه آن را در قالب يك ماتريس انتقال كلي توصيف كنيم. به همين دليل رندرمن يك مجموعة بزرگ از فراخوانيهاي اي.پي.آي دارد كه انتقالها را به دستگاه مختصات محلي اعمال مي‌كند:

Translate dx dy dz

اين فراخواني دستگاه مختصات محلي را در راستاي بردار (dx, dy, dz ) انتقال مي‌دهد.

Rotate angle vx vy vz

دستگاه مختصات محلي را به اندازة angle درجه حول محور برداري كه به صورت سه‌تايي (vx, vy, vz) داده مي‌شود مي‌چرخاند.

Scale sx sy sz

دستگاه مختصات محلي را به اندازة sx در راستاي محور x، sy در راستاي محور y، sz در راستاي محور z تغيير اندازه مي‌دهد.

Skew angle vx vy vz ax ay az

اين فراخواني همه چيز را به صورت يك صفحه قرار مي‌دهد. همه چيز در راستاي يك بردار موازي با محور بردار A=(ax, ay, az) حركت مي‌كند. مقدار انتقال با فاصله از صفحه‌اي كه با A و A.V تعريف مي‌شود متناسب است. مقدار دقيق بر اساس ميزان تمايل بردار V=(vx, vy ,vz) براي چرخش به اندازة angle درجه حول محور مبدأ روي A محاسبه مي‌شود.

ConcatTransfom matrix

اين فراخواني پارامتر داده شدة matrix را در ماتريس انتقال پيش‌ضرب مي‌كند. البته matrix شامل اعداد مميز شناور 16 مميزي است و ماتريس انتقال را كه نقاط را از دستگاه مختصات جديد به دستگاه مختصات قبلي انتقال مي‌دهد كدگذاري مي‌كند.

Identity

اين فراخواني ماتريس انتقال فعلي را با ماتريس شناسه[34] جايگزين مي‌كند. تأثير اين عمل وقتي كه در يك بلوك جهان استفاده شود يكي شدن دستگاه مختصات محلي با دستگاه مختصات جهاني است و وقتي در خارج بلوك جهان استفاده شود دستگاه مختصات محلي را به دستگاه مختصات دوربين يكي مي‌كند. در هر صورت فراخواني جديدتر CoordSysTransform را در بخش بعدي براي نحو عمومي‌تر و واضح‌تر ملاحظه كنيد.

Transform matrix

اين فراخواني ماتريس انتقال جاري را با پارامتر matrix جايگزين مي‌كند. اين فراخواني معادل Identity و به دنبال آن ConcatTransform matrix مي‌باشد.

 

2-4            دستگاه مختصات ويژه

 

رابط رندرمن تعداد كمي دستگاه مختصات مشخص دارد كه هم براي فرايند مدلسازي و هم براي فرايند رندرينگ آن قدر مهمند كه نام و روابط از پيش تعريف شده دارند. اولين آنها فضاي دوربين است. اين دستگاه مختصاتي است كه حول دوربين جاري به وجود مي‌آيد. دوربين در مبدأ اين دستگاه مختصات قرار دارد كه محور z مثبت از جلوي دوربين، محور x مثبت از سمت چپ و محور y مثبت از سمت بالاي دوربين امتداد مي‌يابد (يك دستگاه مختصات چپگرد). اين دستگاه مختصات از اين چهت كه مرام مدلسازي رندرمن صحنه را از دريچة دوربين مي‌سازد و در مركز جهان مجازي ايجاد شده قرار مي‌گيرد اهميت دارد. فضاي دوربين وقتي كه Projection فراخواني مي‌شود در نقطه‌اي كه ماتريس انتقال جاري با شناسه[35] مقدار گذاري مي‌شود ايجاد مي‌گردد.

از آنجا تا زماني كه به فراخواني WorldBegin برسيم تغييرات در ماتريس انتقال جاري ماتريس جهان به دوربين را به وجود مي‌آورد.

دستگاه مختصات مهم بعدي فضاي جهان[36] است. اين دستگاه مختصاتي است كه مدلساز آن را به عنوان دستگاه مختصات كانوني براي توصيف صحنه در نظر مي‌گيرد. در هر صورت در رندرمن اين دستگاه مختصات نسبت به فضاي دوربين (و نه بر عكس) مكانيابي مي‌گردد. فضاي جهان زماني كه WorldBegin فراخواني مي‌كردد مقدارگذاري اوليه مي‌گردد. ماتريس انتقال جاري به همراه انتخابهاي اختياري ثابت در زمان حال به عنوان ماتريس رسمي جهان به دوربين ذخيره مي‌شود. ماتريس انتقال جاري در اين حين به ماتريس شناسه بازگشت مي‌كند. از آنجا تا زماني كه WorldEnd فراخواني شود تغييرات در ماتريس جاري دستگاه مختصاتي را كه متناسب با فضاي جهان است مي‌سازد. به اين معني كه انتقالهاي ماتريس از دستگاه  مختصات محلي به فضاي جهان اشاره مي‌كند. وقتي كه اوليه‌هاي هندسي ساخته شدند مكانهاي خود را از ماتريس انتقال جاري در زمان ايجاد مي‌گيرند. دستگاه مختصات نيز براي مراجعة بعدي به عنوان فضاي شيء براي اولية هندسي ذخيره مي‌گردد. به طور مشابه وقتي سايه‌زنها با فراخواني رويه Surface  و ساير فراخوانيها ساخته مي‌شوند دستگاه مختصات محلي به عنوان فضاي سايه‌زن براي سايه‌زن خاص ذخيره مي‌گردد.

دستگاه‌هاي مختصات مشخص ديگري نيز وجود دارند كه در مدلها يا سايه‌زنها به آنها ارجاع مي‌شود و با پرتوافكني صفحات سه‌بعدي به صفحات دوبعدي محتمل ربط دارند:

دستگاه مختصات screen: دستگاه مختصات دوبعدي در صفحة z=1 (بعد از انجام پرتوافكني) مي‌باشد كه در آن پنجرة صفحه[37] تعريف مي‌شود. همانند فضاي دو بعدي محور x به سمت چپ و محور y به سمت بالاست و عمقها به گونه‌اي كدگذاري مي‌شوند كه صفحات برش‌دهندة نزديك و دور متناسب با فاصله به اعداد بين 0.0 و 1.0 پرتوافكني شوند.

دستگاه مختصات NDC(هنجار شده با ابزار[38]): دستگاه مختصات دوبعدي مستقل از دقت تصوير است كه در آن گوشة بالا- سمت چپ (0.0و0.0) و گوشة پايين- سمت راست (1.0و1.0) مي‌باشد. پنجرة برش در اين فضا تعريف مي‌شود (توجه شود كه در اين دستگاه مختصات y به سمت پايين است).

دستگاه مختصات raster: مختصات پيكسل روي تصوير كه در آن گوشة بالا- سمت چپ پيكسل واقع در بالا- سمت چپ (0.0و0.0) است و گوشة پايين- سمت راست پيكسل واقع در پايين- سمت راست (xRes, yRes) قرار دارد.

مسلم بدانيد كه اگر مدلسازي قادر به گسترش دستگاه مختصات از پيش تعريف شده نباشد آن مدلساط يك مدلساز رندرمن نيست:

CoordinateSystem name

اين فراخواني دستگاه مختصات محلي را بر چسب‌گذاري مي‌كند. فراخوانيهاي بعدي به دستگاه مختصات مي‌تواند با استفاده از نام انتخاب شده صورت گيرد. اين دستگاههاي مختصات نامگذاري شده (هم از پيش‌تعريف شده و هم تعريف شده توسط كاربر) بسيار پراستفاده‌اند. زيرا سايه‌زنها مي‌توانند به آنها مراجعه كنند.

فراخواني اي.پي.آي زير امكان مراجعه به دستگاه مختصات نامگذاري شده را به كاربر مي‌دهد:

CoordSysTransform name

اين فراخواني ماتريس انتقال جاري را با ماتريسي كه دستگاه مختصات با نام name را شكل مي‌دهد جايگزين مي‌كند.  اين فراخواني اجازه مي‌دهد كه اشياء مستقيماً در دستگاه مختصات ويژة تعريف شده توسط كاربر قرار گيرند. براي نمونه اگر يك شيء نيازمند آن است كه در صفحة برش نزديك قرار گيرد (بدون توجه به مكان دوربين يا مشخصات مربوط به برش) مي‌توانيد به سادگي از فراخواني زير براي تبديل دستگاه مختصات فعلي به فضاي NDC استفاده كنيد:

CoordSysTransform “NDC”

و سپس شيء را در مكان z=0 قرار دهيد.

نامهاي دستگاههاي مختصات تعريف شده توسط مدلساز مانند نامهاي دستگاه مختصات از پيش تعريف شده براي صحنه عمومي هستند و اگر يك نام از نو تعريف شود ماتريس قبلي به طور دائمي از بين خواهد رفت. اين مي‌تواند تأثيرات ناخواسته‌اي را روي رندرگر داشته باشد چنانچه عمليات مدلسازي يا سايه‌زني ممكن است به ماتريس قديمي كه از بين رفته است مراجعه كند و به طور نادانسته از ماتريس جديد به جاي آن استفاده كند.

 

ادامة مطالب اين قسمت

 

 

 



[1] RenderMan Interface

[2] RenderMan Shading Language

[3] Application Programming Interface

[4] RenderMan Interface Bytestream

[5] Pixar®

[6] live

[7]  Advanced RenderMan

[8] immediate-mode graphics hardware rendering

9 اين واژه خلاصة اولية هندسي است و به عنوان ترجمة واژة primitive در نظر گرفته شده و جز در مواردي كه مفهوم جمله مستلزم معناي ديگري مي‌باشد بايد در متن تهيه شده به معناي اشاره شده در نظر گرفته شود.

[10] push

[11] pop

[12] DAG ( directed acyclic graph)

 

[13] RenderMan Inteface Specification

[14] Pixar® RenderMan

 

[15] Advanced RenderMan

[16] viewer

[17] world

[18] options

[19] attributes

[20] world block

[21] texture map

[22] nested blocks

[23] camera-to-world matrix

[24] object-to-world

[25] identity

[26] visual

[27] symboles table

[28] dictionary

[29] storage class

[30] shading language

[31] inline

[32] translation component

[33] current transformation matrix

[34] identity

[35] identity

[36] world

[37] screen window

[38] normalized-device coordinates