برو به محتوای اصلی
بابک سلیمی
از اعضای تیم لیک هورس
سال گذشته پرسیده شده

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟ آیا باید از openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟ چه منابعی برای اینکار وجود دارد؟

من کجام؟ اینجا کجاست؟

در جامعه بازی‌سازان ایران می‌تونید در مورد هر موضوعی سوال کنید، به سوالای بقیه جواب بدید و تجربه‌تون رو به اشتراک بگذارید!

امین برمکی
آرتیست - طراح بازی

بابک جان

ازونجایی که حیطه استفاده شیدر خیلی وسیع هست، مباحث زیادی به صورت پراکنده برای یادگیری وجود داره. دوستان توضیحات خوبی دادند. من سعی میکنم خلاصه و سریع مواردی که خاطرم هست رو اضافه کنم. 

 

شیرجه زدن

بهترین روش برای یادگیری شیدر نویسی، بررسی شیدر‌های نوشته شدست. shadertoy.com۱۱۶ منبع خوبی برای این کار هست. میتونی یکی از sample هارو انتخاب کنی، همونجا تغییرش بدی و نتیجه رو ببین. البته نمونه‌ها به زبون glsl هست که میتونی با کمی تغییر (یا یکم بیشتر از کمی تغییر) تبدیلش کنی به hlsl و توی unity تستش کنی.

در کنار این، کار کردن با shader editor ‌ها هم کمک میکنه با مفاهیم و کلید واژه‌ها آشنا بشی و خیلی سریع‌تر آزمون و خطا کنی. (shader forge یا unity shader editor).

 

پروژه 3d

در اکثر پروژه‌های 3d قرار هست که به تصویر realistic برسیم. پس باید بدونی که چه چیزهایی تصویر رو واقعی‌تر میکنه و چطور اون چیزهارو به صورت خیلی بهینه و گاها با کلک تولید کنی. برای همین موارد زیر مهم میشن: 

  • فیزیک نور و انعکاس
  • شناخت لایه‌های رندر (...render passes: diffuce, specular, depth )
  • شناخت خصوصیت‌های دوربین و لنز در دنیای واقعی (...lens flare, vignette, motion blur)
  • پیاده سازی با کلک‌ برای optimization (بزرگترین چالش)

برای مثال کاری که ما برای پروژه Gt Club انجام دادیم.

اکثر شیدر‌های بازی رفتار دوربین و نور را به صورت fake و با هزینه پایین شبیه سازی میکردند 
اکثر شیدر‌های بازی رفتار دوربین و نور را به صورت fake و با هزینه پایین شبیه سازی میکردند 

 

مفاهیم پایه

سرفصل‌هایی هم وجود داره که دونستنشون تقریبا واجبه. فرقی هم نمیکنه که شیدر realtime باشه یا offline یا  2d یا 3d.

  • شناخت تصویر دیجیتال (image formats, bit depth, channel & buffer, ...)
  • آشنایی با image processing یا پردازش تصویر (gamma, contrast, hue, blur...)
  • دونستن ریاضی پایه دبیرستان (جبر، حساب، مثلثات، ماتریس، پردازش سیگنال، روشهای عددی ...)

 

اگر میخوای بدون درگیر شدن با syntax دست و پاگیر تمرین کنی میتونی توی blender فایلهای شیدر OSL رو کامپایل کنی و نتیجه رو ببینی. OSL زبون خیلی ساده و سطح بالایی هست و برای تمرین عالیه. البته برای رندر offline و در صنعت انیمیشن و vfx استفاده میشه و realtime نیست. اما برای ما اهمیتی نداره.  

 

در هر کدوم از موارد بالا اگر خواستی میتونیم مفصل‌تر صحبت کنیم.

علی افروغه
مدیر پروژه/فنی بازی باغ نگار

اگر هدفتون تنها shader نویسی هست به نظرم کتاب Unity 2018 Shaders and Effects Cookbook می‌تونه مناسب باشه.

اما اگر هدفتون اینه که به درک خیلی خوبی از Render Pipeline و تکنیک‌های کلان‌تر رندرینگ برسید باید با یک GraphicsAPI کار کنید. DirectX به نظر من چون توسط مایکروسافت نگه داری میشه تمیزتر و منظم‌تر هست . هر چند در نهایت کار کردن با هر کدوم دانشی که می‌خواهید رو بهتون میده.

در مورد DirectX به نظرم کتاب Introduction to 3D Game Programming with DirectX 12 یا ویرایش قدیمی ترش Introduction to 3D Game Programming with DirectX 11 نوشته Frank Luna خیلی کتاب مفیدی هست. ریاضیات پایه‌ای که نیاز هست هم در فصول اول به طور کامل توضیح میده.

بلد بودن Opengl توانایی فنی رو بالا میبره و حتی درآینده اگر مسلط بشید توانایی این رو خواهید داشت که یک بخش از یک انجین رو خودتون طراحی کنید . ولی در یونیتی اگر شیدر نویسی و حتی استفاده از شیدرلب میتونه با سرعت بیشتری توسعه یک بازی رو برای شما پیش ببره ولی از نظر فنی دست آورد خاصی نیست .

به نظرم هدف گذاری شما در این مورد بسیار مهمه .

یکسری منابع شیدر نویسی که امیدوارم براتون مفید باشه

Unity Shader Documentation۱۱۷

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

Unity Shaders Cook Book۶۶ 

Alan Zucconi۶۱

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

 

Noob to Pro Unity Shader Writing in Unity 4 beginner  ۵۴

www.unitycookie.com۵۸

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

Chayan Goswami shader tutorial۶۶

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

Ronja's Shader Tutorials۲۳۳

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

RenderHell۱۴۱

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

Game Art Tricks۱۴۶

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

Stelabouras Unity Library۹۹

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

Getting Cozy with Shader Forge for Unity 3D۴۸

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

Makin’ Stuff Look Good۴۳

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

MinionsArt۴۳

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

Linden Reid۷۸

Rostyan۴۸

منابع شیدر نویسی به زبان GLSL

Inigo quilez۵۲ 

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

ShaderToy for beginners۱۶۵

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

The Art Of Code۴۳

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

The book of shaders۵۵

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

LearnOpenGL۶۵

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

مقالات شیدر نویسی من در سایت گیمولوژی

مقدمات شیدر نویسی در یونیتی۵۶

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

شیدرنویسی در یونیتی (بخش اول)۵۳

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

شیدر نویسی در یونیتی (بخش دوم)۴۴

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

مدلسازی با Raymarching و میادین فاصله در یونیتی۴۵

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

آموزش های فارسی که در این زمینه ساختم

مقدمه شیدر نویسی۴۸

آشنایی با RenderPipeline۵۲

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

نوشتن یک شیدر ساده۴۸

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

درک مدل های نور پردازی در یونیتی۴۳

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

آشنایی با Depth & Culling۴۲

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

شیدر آب قسمت اول۴۸

شیدر آب قسمت دوم۴۵

شیدر آب قسمت سوم۴۲

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

چند نمونه از شیدر هایی که نوشتم

Iridescence۴۶

Iridescence article۴۳

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

CyberPunkEffect۴۱

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

اینم کتاب شیدری که نوشتم ( Shader In Depth )۴۶

به نظر شما بهترین راه برای شروع برنامه نویسی Shader چیست؟
آیا باید از  openGL و زبان GLSL شروع کرد یا برای کسی که با برنامه نویسی یونیتی آشناست یاد گیری CG و HLSL را پیشنهاد میکنید؟ آیا اصلا تکنولوژی و زبان مهم است؟
 چه منابعی برای اینکار وجود دارد؟

 

پست های شیدر نویسی من در سایت GameDev Stack Exchange:

create a “see behind walls” effect۷۶

make a “wet surface”/“shallow puddle” shader ۶۹

fade player character when he goes inside or outside of area۴۹

Moving texture according to position in shader۴۷