مروری بر طراحی فیلترهای فلش با Adobe Pixel Bender (قسمت اول)

نرم‌افزار Pixel Bender یکی از زیرمجموعه‌های بسته نرم‌افزاری CS است که توسط شرکت Adobe ارائه شده و هدف از ارائه این آن، فراهم کردن امکان طراحی Pixel Shader های سفارشی، توسط برنامه‌نویسان می‌باشد.
در حال حاضر جلوه‌ها و فیلترهایی که در این محیط طراحی می‌شوند، در برنامه‌های Flash و After Effects قابل استفاده هستند.
برای فهم بهتر این مسئله که برنامه Pixel Bender دقیقا چه کاری انجام می‌دهد، باید با مفهوم Shader و Pixel Shader آشنا شوید.
یک Shader، عبارت است از مجموعه‌ای از دستورالعمل‌های سطح پایین که به منظور محاسبه سریع و بلادرنگ Render تصاویر، در واحد پردازش گرافیکی سیستم (GPU) طراحی شده است. همان طور که میدانید GPU، همان پردازنده سخت‌افزاری فوق سریعی است که در کارت گرافیک سیستم تعبیه شده است.
به عبارتی، Shader ها برای اجرای مستقیم و بدون واسطه بر روی پردازنده کارت گرافیک سیستم طراحی می‌شوند. در واقع این همان کاری است که در کتابخانه‌های OpenGL و Direct3D هم انجام می‌شود. (مبحث طراحی Shader، جزء داغ‌ترین مباحث صنعت طراحی بازی‌های کامپیوتری است)
Shader ها به سه دسته Vertex Shader، Geometry Shader و Pixel Shader تقسیم می‌شوند که دسته آخر، برای محاسبه Render گرافیکی به صورت پیکسل به پیکسل طراحی شده‌اند.
هر Pixel Shader شامل مجموعه‌ای از دستورالعمل‌های سطح Kernel می‌باشد که به ازای هر پیکسل موجود در تصویر ورودی، یک بار اجرا شده و مشخصات پیکسل تصویر خروجی (تصویر Render شده) را محاسبه می‌کند. از آنجا که قرار است دستورات پردازشی این توابع، به دفعات و بر روی GPU اجرا شوند، معمولا از زبان‌های سطح پایینی مانند اسمبلی (در گذشته) و زبان C (در حال حاضر) استفاده می‌شود.
جالب است که بدانید عبارت Shader، اولین بار در سال 1989 و در رابطه با نرم‌افزار RenderMan از استودیوی پیکسار (PIXAR) که به منظور render تصاویر یک دوربین طراحی شده بود، مورد استفاده قرار گرفت. همچنین اولین استفاده حقیقی از Shader ها نیز، به انیمیشن “داستان اسباب‌بازی” (Toy Story) از این شرکت بر می‌گردد.
بگذریم،
تا به اینجا، مشخص شد که برنامه Pixel Bender به عنوان یک IDE برای طراحی توابع Shader در زبان C ارائه شده است. اما اجازه دهید بعد از ذکر این مقدمه، به طراحی اولین Shader بپردازیم:
طراحی Shader:
برنامه Pixel Bender را اجرا نموده و گزینه Create New Kernel را انتخاب کنید. با این کار قالب کلی یک تابع Shader به صورت زیر نمایش داده می‌شود:

kernel NewFilterName

<   namespace : "Your Namespace";
    vendor : "Your Vendor";
    version : 1;
    description : "your description";
>

{
    input image4 src;
    output pixel4 dst;

void
    evaluatePixel()
    {
        dst = sampleNearest(src,outCoord());
    }
}
با ایجاد تمایز در رنگ کدهای این تابع، شرح هر بخش به صورت زیر است:
قسمت اول: انتصاب نام به تابع جدید و شروع کدنویسی.
قسمت دوم: تعریف Metadata برای معرفی تابع.
قسمت سوم: کد نویسی بدنه تابع.
در دو سطر اول، دو متغیر از نوع داده image4 و pixel4 برای دریافت تصویر ورودی (src) و محاسبه مقدار پیکسل خروجی (dst) مورد استفاده قرار گرفته‌اند. عدد 4 در انتهای نوع داده آنها به معنی 4 کاناله (Red, Green, Blue, Alpha) بودن پیکسل‌های آنها می‌باشد.
ضمنا در صورت نیاز به دریافت پارامتر ورودی از کاربر، نام و نوع آنها در همین قسمت تعریف می‌شود.
تابع evaluatePixel نیز، همان تابع اصلی محاسبه render پیکسل‌های خروجی بوده (تمام عملیات پردازشی در بدنه این تابع تعریف می‌گردد) و به صورت خودکار اجرا می‌گردد.
دستور outCoord، مختصات پیکسل ورودی را محاسبه کرده و دستور sampleNearest نیز عملیات نمونه گیری از هر پیکسل را انجام می‌دهد. در نتیجه در دستور فوق، با انتصاب مقدار نمونه‌گیری شده به متغیر dst، مقدار هر پیکسل دقیقا به همان صورتی که هست به تصویر خروجی منتقل شده و هیچ تغییری در پیکسلهای تصویر ایجاد نمی‌شود.
با بررسی این دستور، مشخص میشود که برای اعمال هر نوع افکت در تصویر خروجی، باید مقدار نمونه‌گیری شده را پس از انجام تغییرات مورد نظر در مشخصه‌های red، green، blue و alpha، به متغیر خروجی که همان dst است انتصاب دهیم.
اساس طراحی یک Pixel Shader در برنامه Adobe Pixel Bender همین است:
       1. دریافت مقدار اولیه پیکسل.
       2. اعمال تغییرات در آن.
       3. انتصاب به پیکسل خروجی.
در قسمت آینده، به طراحی بدنه تابع و در نهایت، استفاده از آن در ActionScript3 پرداخته می‌شود.ضمنا پیش‌نمایشی از تابع طراحی شده در مقاله بعد و اتصال به فلش در این آدرس موجود است.

About محمد شمس

برنامه‌نویس، طراح انیمیشن و علاقمند به هوش مصنوعی

پاسخ دهید