UnityChan(Channel)
560 subscribers
2.07K photos
86 videos
38 files
89 links
کانال آموزش و نکات UnityChan

مالک کانال : @FProSensei

حمایت مالی (دونیت) : https://daramet.com/FProSensei

گروه یونیتی https://t.me/UnityChan
Download Telegram
FPro Sensei
مجموعه دوره های آموزش تخصصی NPR در UnityChan با FProSensei توضیح روش Triplanar Texturing و اهمیت شدید ان برای استفاده در انواع شیدر های مثل PBR و NPR
برای اثبات این ادعا روی کاراکتر خودم تست کردم و به شما تفاوت رو نشون خواهدم دادم وقتی که Gbuffer وارد محاسبه میشه چقدر تاثیر داره :
FPro Sensei
برای اثبات این ادعا روی کاراکتر خودم تست کردم و به شما تفاوت رو نشون خواهدم دادم وقتی که Gbuffer وارد محاسبه میشه چقدر تاثیر داره :
طبق علامت فلش از بالا تسکتچر پروجکتشن را دریافت میکنه ولی کشیدگی شدیدی داره چون فقط از جهت Z دارد محاسبه میکند
FPro Sensei
طبق علامت فلش از بالا تسکتچر پروجکتشن را دریافت میکنه ولی کشیدگی شدیدی داره چون فقط از جهت Z دارد محاسبه میکند
ولی وقتی که از تکنیک Triplaner استفاده میکنم داستان کاملا عوض میشود و کشیدگی تکستچر ها بشدت کاهش و به حداقل میرسد که به وسلیه GBuffer ممکن هست که از HD Buffer میتواند نرمال واقعی ابجکتی که در داخل محوطه دریافت تسکتچر هست را دریافت کنه
FPro Sensei
ولی وقتی که از تکنیک Triplaner استفاده میکنم داستان کاملا عوض میشود و کشیدگی تکستچر ها بشدت کاهش و به حداقل میرسد که به وسلیه GBuffer ممکن هست که از HD Buffer میتواند نرمال واقعی ابجکتی که در داخل محوطه دریافت تسکتچر هست را دریافت کنه
کد + نحوه استفاده در شیدر گراف بعنوان کاستوم فانکشن :

void TriplanarUV_float(
in float3 WorldPos,
in float3 WorldNormal,
in float Sharpness,
out float2 UV
)
{
float2 uvXZ = WorldPos.xz;
float2 uvXY = WorldPos.xy;
float2 uvYZ = WorldPos.zy;

float3 blend = pow(abs(WorldNormal), Sharpness);
blend = blend / (blend.x + blend.y + blend.z + 0.0001);

float2 lerpA = lerp(uvYZ, uvXZ, saturate(blend.y / max(blend.x + blend.y, 0.0001)));
float2 lerpB = lerp(lerpA, uvXY, saturate(blend.z));

UV = lerpB;
}
امیداورم که از این آموزش لذت برده باشید تا یک آموزش خوب دیگه بدرود 😊
FPro Sensei
کد + نحوه استفاده در شیدر گراف بعنوان کاستوم فانکشن : void TriplanarUV_float( in float3 WorldPos, in float3 WorldNormal, in float Sharpness, out float2 UV ) { float2 uvXZ = WorldPos.xz; float2 uvXY = WorldPos.xy; float2 uvYZ =…
یک نکته کوچیک که یادم رفت بگم این بود که با نوع پوزیشن بزارید absoluteWorld نه world چون اگر نزارید با حرکت دوربین اونم حرکت میکنه که درست نیست ❗️
نمونه تست افکت های زیر اب AniToon Water System 🌊
🔥2
FPro Sensei
نمونه تست افکت های زیر اب AniToon Water System 🌊
چه چیزی در شیدر بزرگ AniToon HDRP خواهد بود ؟

شیدر کامل کاراکتر 🥷

شیدر آب حرفه ای با قابلیت های ویژه 💧

شیدر درخت 🌳

شیدر مخصوص اسلحه 🔫

شیدر محیط تبدیل PBR به Anime Style 🎨

شیدر آب و هوا 🌤

شیدر چمن های استایل انیمه 🌿

شیدر های مخصوص VFX

همه اینا در شیدر فوق حرفه ای AniToon خواهد بود 🚀
🤩1
FPro Sensei
نمونه تست افکت های زیر اب AniToon Water System 🌊
This media is not supported in your browser
VIEW IN TELEGRAM
دارم برای یونیتی یک سیستمی شبیه به Dynamic Paint بلندر میسازم 🛠 اینو هم فرستادم بدونید چطوری باید افکت ripple آب رو بلندر بسازید 💧

🌊. توی یونیتی نقشه ساخت به این طریقه که ما با سی شارپ داده های اولیه رو میگیرن که متخصات کاراکتر کجاست 📍. بعد اگر حرکت کرد از اون اطلاعات اولیه پاس میدم شیدر و با استفاده از پارتیکل اون افکت را میسازیم 🎨
🔥3
FPro Sensei
دارم برای یونیتی یک سیستمی شبیه به Dynamic Paint بلندر میسازم 🛠 اینو هم فرستادم بدونید چطوری باید افکت ripple آب رو بلندر بسازید 💧 🌊. توی یونیتی نقشه ساخت به این طریقه که ما با سی شارپ داده های اولیه رو میگیرن که متخصات کاراکتر کجاست 📍. بعد اگر حرکت کرد از…
دوستان یکی از زیبای های یونیتی این هست که کاملا دست باز (fixable) هست یعنی اگر چیزی نیاز داری که این انجین در داخل وجود ندارد مثل مدلسازی کردن یا ریگ های حرفه ای IK - FK و ... هر چیزی که فکرشو میکنید رو میشه با کد نویسی واینا داخلش اورد و این واقعا جذابترش میکنه
🔥2
FPro Sensei
دوستان یکی از زیبای های یونیتی این هست که کاملا دست باز (fixable) هست یعنی اگر چیزی نیاز داری که این انجین در داخل وجود ندارد مثل مدلسازی کردن یا ریگ های حرفه ای IK - FK و ... هر چیزی که فکرشو میکنید رو میشه با کد نویسی واینا داخلش اورد و این واقعا جذابترش…
در مقابل بلندر متن بازه ولی دست باز نیست یعنی چی یعنی بلندر توی هیچ کدام از رندر های دسترسی به کد ها رو نمیده ملا بخوای مانند یونتی هر چی خواستی از api بکشی بیرون نداره بشدت محدوده مانند یونیتی هم نیست که بخوای کاستوم پس یا رندر فیچر بسازی و بعد تایین کنی از کجا injection بزنه پس بشدت محدود هست و از زبان قدیمی GLSL استفاده میکنه اگر بخواهید مثلا انجین خودتون داخلش بسازید بشدت سخته و باید با c/ c++ و چیزای مثل Cmake وا اینا کار کنید که واقعا نمی صرفه
FPro Sensei
در مقابل بلندر متن بازه ولی دست باز نیست یعنی چی یعنی بلندر توی هیچ کدام از رندر های دسترسی به کد ها رو نمیده ملا بخوای مانند یونتی هر چی خواستی از api بکشی بیرون نداره بشدت محدوده مانند یونیتی هم نیست که بخوای کاستوم پس یا رندر فیچر بسازی و بعد تایین کنی…
پس در نهایت یکی برگ برنده یونیتی در مقابل تمام انجین ها داشتن سیستم SRP هست یعنی با این من میتوانم رندر انجین خودم داشته باشم و بهش دستور بدم که کدام Buffer ها باید رندر بشه یا نه و بصورت کامل Render Pass ها رو مدیریت کنم تا بازی بهینه تر ساخته بشه و این یک مزیت فوق العاده هست بعنوان این سیستم DOTS و بزودی CORE CLR هم بهش اضافه میشه تا پیش از هر زمانی بهینه تر بشه
FPro Sensei
Buffer
از جمله نمونه از بافر ها توی یونیتی این هست که :

1. Color Buffer: این بافر شامل رنگ پیکسل‌ها است که در نهایت بر روی صفحه نمایش نشان داده می‌شود. هر پیکسل معمولاً شامل مقادیر RGBA (قرمز، سبز، آبی و آلفا) است.

2. Depth Buffer: این بافر عمق هر پیکسل را ذخیره می‌کند تا مشخص کند که کدام اشیاء در صحنه نزدیک‌تر به دوربین هستند. این اطلاعات برای انجام عملیات‌هایی مانند سایه‌زنی و تعیین اینکه کدام اشیاء باید قابل مشاهده باشند، ضروری است.

3. Stencil Buffer: این بافر برای انجام عملیات‌های خاصی مانند ماسک‌گذاری استفاده می‌شود. با استفاده از این بافر، می‌توان بخش‌هایی از تصویر را مخفی یا نمایان کرد.

4. Normal Buffer: این بافر اطلاعات نرمال‌های سطح اشیاء را ذخیره می‌کند که برای محاسبات نور و سایه‌ها در رندرینگ ضروری است.

5. Shadow Map: این بافر برای ذخیره‌سازی اطلاعات سایه‌ها از نورهای موجود در صحنه استفاده می‌شود. این اطلاعات برای تعیین اینکه کدام بخش‌ها از صحنه در سایه قرار دارند، کاربرد دارد.

6. Render Target: این بافرها برای ذخیره‌سازی نتایج رندرینگ یک مرحله خاص (مانند افکت‌های پس‌پردازش) استفاده می‌شوند.

7. Vertex Buffer: این بافر شامل داده‌های مربوط به ورودی‌های ورتکس‌ها (نقطه‌های هندسی) است، مانند موقعیت، رنگ و نرمال.

8. Index Buffer: این بافر برای ذخیره‌سازی ایندکس‌های ورتکس‌ها استفاده می‌شود و به تسریع فرآیند رندرینگ کمک می‌کند.

و دیگر بافر ها...
به یکی از آموزش های شیدر خوش امدید در این آموزش قراره نحوه ساخت شیدر Ripple بدون دخالت تکستچر را یاد بدیم

یکی از مهم ترین چیز هم در بازی و هم انیمیشن چه انیمه چه Pbr اصلا هر چی ساخت امواج Ripple برای زمانی هست که چیزی به نقطه اب برخورد کرد یک سری امواج ایجاد کند و این بخاطر قانون امواج مویینگی در فیزیک هست :
FPro Sensei
Photo
This media is not supported in your browser
VIEW IN TELEGRAM
یک مثال از امواج مویینگی در شیدر Anime
2
FPro Sensei
Photo
فرم اول مربوط به Ripple Center هست یعنی ما با استفاده از گرفتن فاصله پوزیشن + مقدار بردار دو بعد که ما میدم مشخص میشده بعد در یک عدد اعشاری ضرب میکنم تا تعداد ایجاد Ripple مخشص بشود و در اخر با استفاده از one Munis عدد را معکوس میکنم همان معادل invert در بلندر هست
FPro Sensei
Fraction چ
تابع ریاضی fraction (کسر) در زبان‌های برنامه‌نویسی و نرم‌افزارهای محاسباتی معمولاً به منظور تبدیل یک عدد اعشاری به یک کسر استفاده می‌شود.
اخرین فرم ما مربوط به محاسبات اصلی تر ripple هست یعنی اول دو فرم قبلی که ایجاد کردید را جمع میکنید بعد برای اینکه از حالت SDF بودن خارج کنیم ان را در معدل ریاضی TAU ضرب میکنیم بعد با استفاده از تابع Sine حالت Ripple را شبیه سازی مکنیم در مرحله اخر برای تایین میزان قدرت در یک عدد اعشاری ضرب و با Normal form Heghit نرمال را میسازیم