FPro Sensei
خب داشتم کد نویسی HLSL شیدر استلایزد بازی رو انجام میدادم ولی خیلی بهم درخواست دادید نمونه از کد را براتون بزارم و توضیح بدم که اینکارو میکنم : قبل از این کار بدونید که سه تا پایپ لاین توی یونیتی داریم که کد نویسی انها تفاوته یعنی شما نمی توانید شیدر urp…
قبل از کد نویسی و توضیح دادن باید بگم که hlsl یک زبان شیدر نویسی بر اساسc++ که کمی به c# شبیه ولی دونستن c# هیچ کمکی به کد نویسی اش نمی کنه پس میخواهید شیدر نویسی کنید HLSL یاد بگیرید
بخش اول :
بخش اول :
Shader "Custom/StylizedURPShader_FProSensei"
{
Properties
{
_MainTex ("Main Texture", 2D) = "white" {}
_NormalMap ("Normal Map", 2D) = "bump" {}
_HeightMap ("Height Map", 2D) = "white" {}
_TranslucencyColor ("Translucency Color", Color) = (1,1,1,1)
_TranslucencyIntensity ("Translucency Intensity", Range(0, 1)) = 0.5
_RimColor ("Rim Color", Color) = (1,1,1,1)
_RimPower ("Rim Power", Range(1, 10)) = 3
_EmissionColor ("Emission Color", Color) = (1,1,1,1)
_EmissionIntensity ("Emission Intensity", Range(0, 10)) = 1
_Alpha ("Alpha", Range(0, 1)) = 1
_SpecularColor ("Specular Color", Color) = (1,1,1,1)
_SpecularIntensity ("Specular Intensity", Range(0, 1)) = 0.5
_Metallic ("Metallic", Range(0, 1)) = 0.0
_Smoothness ("Smoothness", Range(0, 1)) = 0.5
_TransmissionColor ("Transmission Color", Color) = (1, 1, 1, 1)
_TransmissionIntensity ("Transmission Intensity", Range(0, 1)) = 0.5
_OutlineColor ("Outline Color", Color) = (0, 0, 0, 1)
_OutlineThickness ("Outline Thickness", Range(0.01, 0.1)) = 0.05
_StylizedColor ("Stylized Color", Color) = (1, 0.5, 0.5, 1)
_StylizedIntensity ("Stylized Intensity", Range(0, 2)) = 1.0
}
SubShader
{
Tags { "RenderType"="Transparent" }
Blend SrcAlpha OneMinusSrcAlpha
ZWrite On
ZTest LEqual
Pass
{
Name "Forward"
Tags { "LightMode"="UniversalForward" }
HLSLPROGRAM
#pragma target 4.5
#include "UnityShaderVariables.hlsl"
#include "UnityLighting.hlsl"
#include "CoreRP/ShaderLibrary/Core.hlsl"
#include "CoreRP/ShaderLibrary/Lighting.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
float3 normalOS : NORMAL;
float2 uv0 : TEXCOORD0;
float2 uv1 : TEXCOORD1;
};
struct Varyings
{
float2 uv0 : TEXCOORD0;
float2 uv1 : TEXCOORD1;
float3 normalWS : TEXCOORD2;
float4 positionCS : SV_POSITION;
float3 tangentWS : TEXCOORD3;
};
struct FragmentInput
{
float2 uv0 : TEXCOORD0;
float2 uv1 : TEXCOORD1;
float3 normalWS : TEXCOORD2;
float3 tangentWS : TEXCOORD3;
};
sampler2D _MainTex;
sampler2D _NormalMap;
sampler2D _HeightMap;
fixed4 _TranslucencyColor;
float _TranslucencyIntensity;
fixed4 _RimColor;
float _RimPower;
fixed4 _EmissionColor;
float _EmissionIntensity;
float _Alpha;
fixed4 _SpecularColor;
float _SpecularIntensity;
float _Metallic;
float _Smoothness;
fixed4 _TransmissionColor;
float _TransmissionIntensity;
fixed4 _OutlineColor;
float _OutlineThickness;
fixed4 _StylizedColor;
float _StylizedIntensity;
Varyings vert(Attributes input)
{
Varyings output;
output.positionCS = TransformObjectToClip(input.positionOS);
output.uv0 = input.uv0;
output.uv1 = input.uv1;
output.normalWS = TransformObjectToWorldNormal(input.normalOS);
👏2
توضیح کد و نحوه کارکرد آن :
در این شما شیدر و ویژگی آن را تعریف میکنید که در این مسیر میتوانید شیدر خود را بروی متریال انتخاب کنید
Shader "Custom/StylizedURPShader_FProSensei"
ویژگیها: این بخش شامل ویژگیهای قابل تنظیم شیدر است که در ادیتور یونیتی قابل مشاهده هست. هر ویژگی یک نام، نوع و مقدار پیشفرض داره (دقیقا مثل ورودی میمومه مثل این که شما داری public int تعریف میکین که مقدارشو توی ادیتور یونیتی تنظیم کنی)
Properties
{
_MainTex ("Main Texture", 2D) = "white" {}
_NormalMap ("Normal Map", 2D) = "bump" {}
_HeightMap ("Height Map", 2D) = "white" {}
_TranslucencyColor ("Translucency Color", Color) = (1,1,1,1)
_TranslucencyIntensity ("Translucency Intensity", Range(0, 1)) = 0.5
_RimColor ("Rim Color", Color) = (1,1,1,1)
_RimPower ("Rim Power", Range(1, 10)) = 3
_EmissionColor ("Emission Color", Color) = (1,1,1,1)
_EmissionIntensity ("Emission Intensity", Range(0, 10)) = 1
_Alpha ("Alpha", Range(0, 1)) = 1
_SpecularColor ("Specular Color", Color) = (1,1,1,1)
_SpecularIntensity ("Specular Intensity", Range(0, 1)) = 0.5
_Metallic ("Metallic", Range(0, 1)) = 0.0
_Smoothness ("Smoothness", Range(0, 1)) = 0.5
_TransmissionColor ("Transmission Color", Color) = (1, 1, 1, 1)
_TransmissionIntensity ("Transmission Intensity", Range(0, 1)) = 0.5
_OutlineColor ("Outline Color", Color) = (0, 0, 0, 1)
_OutlineThickness ("Outline Thickness", Range(0.01, 0.1)) = 0.05
_StylizedColor ("Stylized Color", Color) = (1, 0.5, 0.5, 1)
_StylizedIntensity ("Stylized Intensity", Range(0, 2)) = 1.0
}
SubShader: این بخش شامل مراحل رندرینگ است یعنی کل pass ها در این بخش قرار میگیره.
Tags: نوع رندرینگ را مشخص میکند (در اینجا چون از ترنسپرنت استفاده کردم شفاف).
Blend: نحوه ترکیب رنگها را در حالت شفافیت مشخص میکند.
ZWrite: تعیین میکند که آیا باید عمق پیکسلها نوشته شود یا نه.
ZTest: نوع تست عمق را مشخص میکند.
SubShader
{
Tags { "RenderType"="Transparent" }
Blend SrcAlpha OneMinusSrcAlpha
ZWrite On
ZTest LEqual
Pass: یک مرحله رندرینگ را تعریف می کنیم مثلا اوت لاین خودش یک pass داره.
Name: نام مرحله رندرینگ.
Tags: نوع نورپردازی را مشخص میکند.
Pass
{
Name "Forward"
Tags { "LightMode"="UniversalForward" }
HLSLPROGRAM: شروع برنامهنویسی HLSL.
#pragma target: نسخه هدف HLSL را مشخص میکند.
#include: فایلهای کتابخانهای مربوط به متغیرها و نورپردازی را وارد میکند.
HLSLPROGRAM
#pragma target 4.5
#include "UnityShaderVariables.hlsl"
#include "UnityLighting.hlsl"
#include "CoreRP/ShaderLibrary/Core.hlsl"
#include "CoreRP/ShaderLibrary/Lighting.hlsl"
Attributes: ساختاری برای ورودیهای وکتورهای هندسی که شامل موقعیت، نرمال و UVها است.
struct Attributes
{
float4 positionOS :
float3 normalOS :
float2 uv0 : TEXCOORD0;
float2 uv1 : TEXCOORD1;
};
Varyings: ساختاری برای نگهداری مقادیر بین مرحله vertex و fragment.
struct Varyings
{
float2 uv0 : TEXCOORD0;
float2 uv1 : TEXCOORD1;
float3 normalWS : TEXCOORD2;
float4 positionCS : SV_POSITION;
float3 tangentWS : TEXCOORD3;
};
FragmentInput: ساختاری برای ورودیهای مرحله fragment.
struct FragmentInput
{
float2 uv0 : TEXCOORD0;
float2 uv1 : TEXCOORD1;
float3 normalWS : TEXCOORD2;
float3 tangentWS : TEXCOORD3;
};
متغیرهای نمونهبرداری: این متغیرها برای نگهداری بافتها و ویژگیهای مختلف مانند رنگ، شدت و غیره استفاده میشوند.
sampler2D _MainTex;
sampler2D _NormalMap;
sampler2D _HeightMap;
fixed4 _TranslucencyColor;
float _TranslucencyIntensity;
fixed4 _RimColor;
float _RimPower;
fixed4 _EmissionColor;
float _EmissionIntensity;
float _Alpha;
fixed4 _SpecularColor;
float _SpecularIntensity;
float _Metallic;
float _Smoothness;
fixed4 _TransmissionColor;
float _TransmissionIntensity;
fixed4 _OutlineColor;
float _OutlineThickness;
fixed4 _StylizedColor;
float _StylizedIntensity;
🔥2👍1