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

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

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

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

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