本文是视频课程《Unity技术美术TA:Shader篇》,算是对自己学习的总结,也希望分享下所学知识~~
如果是在BuildIn管线下:
//Prop
_Tex("Tex", 2d) = "white" {}
//Def
sampler2d _Tex;
fixed4 _Tex_ST;
//Sample
fixed4 col = tex2D(_Tex, i.uv);
URP管线下:
主要区别:
1.纹理和采样器分别定义
原因:采样器的个数有限制,内置管线是一一对应的,现在可以定义很多贴图,只有一个采样器
2.可以自定义 WrapMode 和 FilterModel
(不用走 Inspector面板内的了)
ShaderGraph 定义的采样器如图:
代码如下:
Shader "Custom/TA_URP/SimplestUnlitCopy"
{
Properties
{
_MainTex("MainTex", 2D) = "white"{}
}
SubShader
{
Tags
{
"RenderPipeline"="UniversalPipeline"
"RenderType"="Opaque"
"Queue"="Geometry"
}
Pass
{
Blend One Zero
Cull Back
ZTest LEqual
ZWrite On
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl"
struct Attributes
{
float3 positionOS : POSITION;
float2 uv : TEXCOORD0;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float2 uv : TEXCOORD0;
};
// sampler2D _MainTex;
//纹理通用定义 Texture2D _MainTex;
// 只有gles2.0 是sampler2D
TEXTURE2D(_MainTex);
float4 _MainTex_ST;
//采样器的定义 SamplerState sampler_MainTex;
// 只有gles2.0 是空
// SAMPLER(sampler_MainTex);
//通过这种命名方式可以自定义 WrapMode 和 FilterModel
#define smp _Linear_Clamp
SAMPLER(smp);
//顶点着色器
Varyings vert(Attributes v)
{
Varyings o = (Varyings)0;
float3 positionWS = TransformObjectToWorld(v.positionOS);
o.positionCS = TransformWorldToHClip(positionWS);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
//URP下 没有 fixed了
half4 frag(Varyings i) : SV_Target
{
// tex2D 是默认渲染管线的操作
// half4 texCol = tex2D(_MainTex, i.uv);
half4 texCol = SAMPLE_TEXTURE2D(_MainTex, smp, i.uv);
return texColl;
}
ENDHLSL
}
}
FallBack "Hidden/Shader Graph/FallbackError"
}