Напишите собственный URP-шейдер, используя Unity BRDF.
Benjamin Swee - Custom Unity Shaders
0:00 / 0:00
Напишите собственный URP-шейдер, используя Unity BRDF.
8 217 просмотров · 3 года назад
Benjamin Swee - Custom Unity Shaders
3,79 тыс. подписчиков
8 217 просмотров · 3 года назад
Если вы хотите поддержать меня на Patreon: https://patreon.com/user?u=92850367
Для более подробного доступа у меня есть курс на Udemy, который я буду продолжать обновлять по мере создания новых мини-уроков.
https://www.udemy.com/course/unity-sh...
Меня зовут Бен, и я пишу шейдеры и целые системы шейдеров в Unity с нуля уже 6-7 лет. Шейдеры, особенно HLSL или CG-шейдеры, кажутся менее известными в Unity, поэтому я просто хотел внести свой вклад, поделиться своим опытом и показать другим, как писать код для шейдеров.
Цель — научить других писать оптимальный код для шейдеров, готовый к использованию в продакшене. Я также хочу попытаться воссоздать крутые эффекты, которые мы видим в других играх. Было бы здорово, если бы всё больше и больше людей писали шейдеры с нуля, понимали их на более глубоком уровне и в конечном итоге создавали свои собственные шейдеры.
#unity3d #unitydeveloper #gamedev #shaders
Код для этого видео
Шейдер "Custom/URP_BaseShader"
{
Свойства
{
_MainTex ("Texture", 2D) = "white" {}
_BaseColor("Base Color", color) = (1,1,1,1)
_Smoothness("Smoothness", Range(0,1)) = 0
_Metallic("Metallic", Range(0,1)) = 0
}
Подшейдер
{
Теги { "RenderType"="Opaque" "RenderPipeline" = "UniversalRenderPipeline" }
LOD 100
Проход
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float4 normal : NORMAL;
float4 texcoord1 : TEXCOORD1;
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
float3 positionWS : TEXCOORD1;
float3 normalWS : TEXCOORD2;
float3 viewDir : TEXCOORD3;
DECLARE_LIGHTMAP_OR_SH(lightmapUV, vertexSH, 4);
};
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _BaseColor;
float _Smoothness, _Metallic;
v2f vert (appdata v)
{
v2f o;
o.positionWS = TransformObjectToWorld(v.vertex.xyz);
o.normalWS = TransformObjectToWorldNormal(v.normal.xyz);
o.viewDir = normalize(_WorldSpaceCameraPos - o.positionWS);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.vertex = TransformWorldToHClip(o.positionWS);
OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUV );
OUTPUT_SH(o.normalWS.xyz, o.vertexSH );
return o;
}
half4 frag (v2f i) : SV_Target
{
half4 col = tex2D(_MainTex, i.uv);
InputData inputdata = (InputData)0;
inputdata.positionWS = i.positionWS;
inputdata.normalWS = normalize(i.normalWS);
inputdata.viewDirectionWS = i.viewDir;
inputdata.bakedGI = SAMPLE_GI( i.lightmapUV, i.vertexSH, inputdata.normalWS );
SurfaceData surfacedata;
surfacedata.albedo = _BaseColor;
surfacedata.specular = 0;
surfacedata.metallic = _Metallic;
surfacedata.smoothness = _Smoothness;
surfacedata.normalTS = 0;
surfacedata.emission = 0;
surfacedata.occlusion = 1;
surfacedata.alpha = 0;
surfacedata.clearCoatMask = 0;
surfacedata.clearCoatSmoothness = 0;
return UniversalFragmentPBR(inputdata, surfacedata);
}
ENDHLSL
}
}
}