خب، رسیدیم به بحث شیرین normal map.
اول می خوام یه یادآوری بکنم از دروس شیرین دوران دبیرستان!
اگه از هندسه یادتون باشه (خصوصاً هندسه تحلیلی سال پیش دانشگاهی) ما برای مشخص کردن یک صفحه در فضا و نوشتن معادله اون به دوتا چیز نیاز داشتیم. 1. مختصات یک نقطه از اون صفحه 2. مختصات یک بردار یکه عمود بر اون صفحه (برای مشخص شدن جهت صفحه در فضا) که به اون بردار، بردار نرمال گفته می شد.
خب باید بگم normal map توی مبحث ما همین مفهوم رو داره. همون طور که گفتم به علت سخت افزار محدود و نیاز به پردازش Realtime تصاویر، محدودیت زیادی برای استفاده از تعداد Polygon ها در مدل ها وجود داره. مثلاً شما یک دیوار آجری رو فرض کنید که قراره برای یک بازی ساخته بشه.
حالا شما اگه بیاید و ریز به زیر بخواید همه آجرها رو با polygon بسازید، پردازش ریادی به سخت افزارتون تحمیل کردید. شاید حالا توی یک دیوار خیلی به چشم نیاد، اما فکرشو بکنید که اگه تمام مدلهای صحنه تون رو این طوری بسازید، چقدر مرحله تون سنگین می شه. پس چه کار باید کرد. اول بیایم ببینیم اگه یه دیوار رو با جزئیات زیاد (Highpoly) بسازیم، (و فرض کنیم مشکلی هم پیش نیاد) چه فرقی داره با وقتی که دیوار رو lowpoly می سازیم. طبیعیه که توی مدل highpoly وقتی نور به دبوار تابیده می شه، بین آجر ها سایه میفته و زمانی هم که منبع نورمون متحرک باشه، سایه ها نسبت به منبع نور حرکت می کنند. حالا اگه مدلمون lowpoly باشه، حتی اگه Texture (بافت) شبیه دیوار بهش داده باشیم، در مقابل نور هیچ اتفاقی براش نمیفته و بین آجرها هیچ سایه ای تشکیل نمی شه.
حالا می تونیم مستقیماً بریم سراغ normal map. توی بازی برای هر جسمی یک normal map درست می کنن. در واقع normal map میاد و برای هر نقطه از این دیوار یک بردار نرمال تعریف می کنه که اون نقطه از جسم هنگامی که نور بهش می تابه، بر اساس اون بردار نرمال عکس العمل نشون می ده و نور رو در جهتی که اون بردار نرمال براش تعیین کرده، بازتاب می ده. حالا وقتی نوری که به تمام جسم تابیده می شه و در جهات مختلف بازتاب می شه رو در نظر بگیریم، می بینیم که به سایه هایی در فرو رفتگی های جسم ایجاد شده که اون رو بسیار پر جزئیات نشون می ده. و به همین خاطر با یک مدل lowpoly و یک normal map می شه کاری کرد که اون مدل کاملاً Highpoly به نظر برسه.
این قضیه کاملاً در مورد کاراکترها هم صادقه. یعنی برای یک کاراکتر توی بازی یک مدل lowpoly وجود داره که اصلا نمی شه جزئیاتی مثل چروک لباس، منافذ پوست، جزئیات ریز لباس و تجهیزات مثل دکمه لباس، بند کفش، محل دوخت پارچه و ... رو توش در آورد. و اینجاست که normal map به کمک میاد و می شه باهاش تمام این جزئیات رو توی بازی دید.
حالا برای ساخت normal map چه کار می شه کرد؟ چند روش برای این کار وجود داره که هر کدوم معمولاً در جایی استفاده می شه.
2 تا از روش های متداول رو یه اشاره ای بهش می کنم.
قبل از توضیح روش ها بیاید با یه مفهومی آشنا بشیم به اسم height map. این عکس رو ببینید.
height map در واقع صفحه ای سیاه و سفیده که نقشه ارتفاع رو در محدوده مورد نظر ما تعیین می کنه!
در واقع هر جا که رنگ سفیدتر باشه، مربوط به نقاط با ارتفاع بیشتر، و هر جا سیاه تر باشه ،مربوط به نقاط با ارتفاع کمتره. البته height map کاربردهای هواشناسی و جغرافیایی هم داره.
حالا به روش اول درست کردن بردار نرمال می رسیم. در روش اول هنرمندی که مدل سه بعدی رو ساحته، میاد و برای مدلش به صورت دستی یک height map درست می کنه. به طوری که نقاط برجسته تر رو سفید و نقاط فرو رفته تر رو مشکی می کنه. مثلاً توی اون دیوار آجری محل خود آجرها سفیدتر و فاصله بینشون سیاه تر می شه. خب، نرم افزارهایی مثل crazy bump هست که این height map رو از هنرمند می گیره و بر اساس اون پستی و بلندی ها بهش normal map می ده. normal map چنین ظاهری داره.
خب این روش اول بیشتر برای اجسامی مثل همون دیوار و ... استفاده می شه.
روش دیگه ای که برای ساختن normal map وجود داره، اینه که هنرمند میاد و مدل رو کاملاً highpoly و با تمام جزئیاتش می سازه. (مثلاً یه کاراکتر می سازه با 50 میلیون polygon.) مدل lowpoly جسمش رو هم می سازه (مثلاً همون کاراکتر این بار با 20000 Polygon). (البته این به سلیقه مدلساز برمی گرده که اول مدل lowpoly رو بسازه و بعد با detail دادن به اون highpoly رو بسازه یا اول مدل highpoly رو بسازه و بعد با retopology کردن اون، مدل lowpoly رو بسازه). سپس با استفاده از این دو مدل و نرم افزارهایی که برای این کار وجود داره، از مدل highpoly برای مدل lowpoly نرمال مپ درست می کنه. این روش هم برای مدل های پرجزئیاتی مثل کاراکترها بیشتر کاربرد داره.
خب دیگه، ببخشید که طولانی شد. امیدوارم حوصله تون سر نرفته باشه و بیشتر از اون امیدوارم تاپیک تلوی عزیز رو منحرف نکرده باشم.