در گرافیک سهبعدی کامپیوتری، normal mapping که از آن گاهی با عنوان “Dot3 bump mapping” نیز یاد میشود، تکنیکی است که برای شبیهسازی روشنایی برآمدگیها و فرورفتگیها استفاده شده و صورتی از bump mapping است. normal mapping به منظور اضافهکردن جزئیات، بدون افزایش تعداد پلیگانها به کار برده میشود. رویکرد رایج در استفاده از این تکنیک برای تأثیرگذاری بر ظاهر و جزئیات یک مدل با تعداد پلیگان پایین با استفاده از تولید یک normal map از یک مدل با تعداد پلیگان بالا یا height map است.
Normal map ها معمولاً به صورت تصاویر RGB ساده ذخیره میشوند که در آنها، مؤلفههای RGB، به ترتیب مطابق با مختصات X، Y و Z در سطح هستند.
استفاده از Normal mapping برای اضافه کردن جزئیات به mesh های ساده شده.
تاریخچه
ایدهی دریافت جزئیات ژئومتریک از یک مدل با تعداد پلیگان بالا، اولین بار در کنفرانس SIGGRAPH سال ۱۹۹۶ در مقالهای از کریشنامورتی و لووی (Krishnamurthy and Levoy) با عنوان «انطباق سطوح صیقلی بر Dense Polygon Mesh ها» مطرح شد. در اینجا، از این رویکرد برای ساخت displacement map بر روی nurbs استفاده شده بود. در سال ۱۹۹۸، دو مقاله با ایدههایی کلیدی برای انتقال جزئیات از mesh های با پلیگان بالا به mesh های با پلیگان پایین با استفاده از normal map ها ارائه شد:
۱- «سادهسازی با حفظ ویژگیهای ظاهری» از کوهن (Cohen) و همکاران در SIGGRAPH سال ۱۹۹۸
۲- «یک روش کلی برای حفظ کیفیت در mesh های ساده شده» از سیگنونی (Cignoni) و همکاران در IEEE Visualization سال ۱۹۹۸
اولین مقاله به معرفی ایدهای برای ذخیرهسازی مقادیر نرمال سطح به صورت مستقیم در یک تکسچر به جای displacement میپردازد. با این وجود، در این حالت، نیاز به استخراج یک مدل low-detail از یک الگوریتم خاص سادهسازی خواهد بود. دومین مقاله، یک رویکرد سادهتر ارائه کرده که در آن، mesh های با تعداد پلیگانهای بالا و پایین از یکدیگر تفکیک میشوند و امکان بازسازی هر گونه المان مربوط به یک مدل high-detail (رنگ، مختصات تکسچر، displacements و …)، به صورتی مستقل از میزان جزئیات مدل low-detail اولیه فراهم میشود. ترکیب قابلیت ذخیرهسازی مقادیر نرمال در یک تکسچر همراه با فرآیند کلیتر در ساخت به این منظور، هنوز هم در بسیاری از ابزارهای کنونی استفاده میگردد.
روش کار
برای محاسبه روشنایی Lambertian یا diffuse مربوط به یک سطح، بردار واحد از نقطه shading به طرف منبع نور با بردار واحد نرمال آن سطح تقاطع داده شده و حاصلضرب نقطهای بهدست آورده میشود؛ نتیجه، مقدار شدت روشنایی در آن سطح است. تصور کنید که یک مدل polygonal از یک کره دارید. در این حالت، تنها میتوانید شکل سطح را تخمین بزنید. با استفاده از یک ۳-channel bitmap که برای تکسچر مدل به کار برده شده، اطلاعات بردار نرمال جزئیتری میتواند کدگذاری شود. هر کدام از Channel ها در bitmap مطابق با مختصات فضایی X، Y و Z هستند. این ابعاد فضایی، یا نسبت به یک سیستم مختصات ثابت برای object-space normal map ها و یا یک سیستم مختصات متغیر یکنواخت بر اساس مشتقات موقعیت مطابق با مختصات تکسچر، در حالت استفاده از tangent-space normal map ها هستند. این امر، موجب اضافهشدن جزئیات بیشتر به سطح مدل، بهخصوص همراه با تکنیکهای نورپردازی پیشرفته میشود.
نمونهای از یک normal map (تصویر وسط) همراه با صحنهای که از طریق آن محاسبه شده (سمت چپ) و نتیجه کار پس از اضافه کردن آن به یک سطح تخت (سمت راست)
به دلیل آن که یک normal برای محاسبه حاصلضرب نقطهای برای بهدستآوردن diffuse lighting استفاده میشود، میتوانیم مشاهده کنیم که بردار نرمال واحد {۰, ۰, –۱} به صورت مقادیر {۱۲۸, ۱۲۸, ۰} منتقل میشود و یک حالت آبی آسمانی معمول در normal map ها ایجاد میگردد. همچنین بردار {۰٫۳, ۰٫۴, –۰٫۸۶۶} به صورت زیر تصویر میشود:
({۰٫۳, ۰٫۴, –۰٫۸۶۶}/۲+{۰٫۵, ۰٫۵, ۰٫۵})*۲۵۵={۰٫۱۵+۰٫۵, ۰٫۲+۰٫۵, -۰٫۴۳۳+۰٫۵}*۲۵۵={۰٫۶۵, ۰٫۷, ۰٫۰۶۷}*۲۵۵={۱۶۶, ۱۷۹, ۱۷}
علامت مختصه Z، برای مطابقت بردار نرمال normal map با چشم (ویوپوینت یا دوربین) یا بردار light، میبایست معکوس شود. مقادیر منفی برای Z به معنای قرار گرفتن ورتکس در جلوی دوربین هستند و بنابراین، این موضوع، درخشش سطح را با حداکثر قدرت در هنگام تلاقی بردار light و بردار نرمال تضمین خواهد کرد.
محاسبه فضای تانژانت
برای پیداکردن آشفتگی در normal، محاسبات tangent space میبایست بهدرستی انجام شوند. غالباً normal پس از اضافه شدن به مدل، در قالبت یک fragment shader اختلال پیدا میکند. در حالت کلی، ژئومتری یک normal و tangent در خود دارد. tangent بخشی از صفحه تانژانت و به راحتی میتواند با استفاده از بخش خطی ماتریس (۳ در ۳ بالایی) انتقال داده شود. در همین حال، normal میبایست با حالت معکوس ترانهاده منتقل شود. بسیاری از برنامههای کاربردی در این زمینه، نیاز به کتانژانت برای تطبیق ژئومتری انتقالیافته و UV مربوط به آن، پیدا میکنند. بنابراین، به جای اجبار کردن کتانژانت برای عمود بودن بر تانژانت، در حالت کلی، بهتر است که انتقال کتانژانت به مانند تانژانت انجام شود. فرض کنید که t تانژانت ، b کتانژانت، n نرمال، M3×۳ بخش خطی ماتریس مدل و V3×۳ بخش خطی ماتریس View باشد. در این حالت داریم:
Normal mapping در بازیهای کامپیوتری
رندرینگ Interactive normal map، اول از همه در ابزار PixelFlow ممکن بوده است؛ یک ماشین رندرینگ موازی که در دانشگاه کارولینای شمالی توسعه داده شده است. پس از آن، امکان پیادهسازی normal mapping در کارگاههای سطح بالای SGI با استفاده از رندرینگ multi-pass و اجرای framebuffer و یا سختافزارهای کامپیوترهای شخص با برخی ترفندهای استفاده از تکسچرهای palette فراهم شده است. با این حال، با پیشرفت shader ها در کامپیوترهای شخصی و کنسولهای بازی، normal mapping از سال ۲۰۰۳ گسترش زیادی در بازیهای ویدیویی تجاری پیدا کرد. محبوبیت برای رندرینگ real-time به دلیل کیفیت کارآیی آن در مقایسه با روشهای دیگر ساخت افکتهای مشابه است. بخش عمده این بهینهسازی توسط تکنیک distance-indexed detail scaling حاصل میشود؛ تکنیکی که در آن مقدار جزئیات normal map برای یک تکسچر خاص میتواند کاهش یابد. به این معنا که سطوح دورتر در صحنه، نیاز شبیهسازی روشنایی با پیچیدگی کمتری خواهند داشت.
normal mapping پایه میتواند در هر سختافزاری که از تکسچرهای palettized پشتیبانی میکند، به کار گرفته شود. اولین کنسول بازی که از یک سختافزار ویژه normal mapping استفاده میکرد، Sega Dreamcast بود. ولی در همین حال، این Xbox مایکروسافت بود که به عنوان اولین کنسول، به صورت گسترده در محیط بازیها استفاده کرد. همچنین در طول ۶ نسل از پلیاستیشن، تنها PlayStation 2 از پشتیبانی داخلی normal mapping بیبهره بوده است. بازیهای Xbox 360 و PlayStation 3 تکیه زیادی بر normal mapping دارند و در حال شروع بهکارگیری parallax mapping هستند. کنسول Nintendo 3DS نیز همچنان که در بازیهای Resident Evil Revelations و Metal Gear Solid: Snake Eater نشان داده شده، از normal mapping پشتیبانی میکند.