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

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

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

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

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

اگر هدفتون تنها 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 خیلی کتاب مفیدی هست. ریاضیات پایه‌ای که نیاز هست هم در فصول اول به طور کامل توضیح میده.

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

بابک جان

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

 

شیرجه زدن

بهترین روش برای یادگیری شیدر نویسی، بررسی شیدر‌های نوشته شدست. 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 نیست. اما برای ما اهمیتی نداره.  

 

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

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

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۵۲

 

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

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