unity默认创建的CG语言的模板,保留一份HLSL的比较方便。
Shader "Unlit/PointArt_Code"
{
Properties
{
_MainColor ("MainColor", color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
Name "Forward"
Tags {"LightMode" = "UniversalForwardOnly" }
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/Lighting.hlsl"
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 vertex : SV_POSITION;
};
CBUFFER_START(UnityPerMaterial)
float4 _MainColor;
CBUFFER_END
v2f vert (appdata v)
{
v2f o;
o.vertex = TransformObjectToHClip(v.vertex);
return o;
}
float4 frag (v2f i) : SV_Target
{
return float4(_MainColor);
}
ENDHLSL
}
}
CustomEditor "UnityEditor.ShaderGraphUnlitGUI"
FallBack "Hidden/Shader Graph/FallbackError"
}
1. Properties 块
Properties
块用于定义可在 Unity 编辑器中调整的参数。这些参数可以是颜色、纹理、数值等。
2. SubShader 块
SubShader
块包含实际的渲染指令和着色器程序。一个 Shader 可以包含多个 SubShader,以便在不同的硬件上使用不同的实现。
- Tags: 用于定义渲染顺序和其他渲染相关的信息。
- Pass: 一个 SubShader 可以包含多个 Pass,每个 Pass 定义一次完整的渲染过程。
3. CGPROGRAM 块
在 Pass
中,可以使用 CGPROGRAM
来编写 GPU 程序(Cg/HLSL)。
- #pragma vertex vert: 指定顶点着色器函数为
vert
。 - #pragma fragment frag: 指定片段着色器函数为
frag
。 - appdata: 顶点着色器输入结构体。
- v2f: 顶点着色器输出结构体。
- vert: 顶点着色器函数。
- frag: 片段着色器函数。
4. Uniforms 和 Samplers
在 Shader 中,可以定义 uniform 和 sampler,用于传递数据到 GPU。
- uniform float4 _Color: 定义一个 uniform 变量
_Color
,类型为float4
。 - sampler2D _MainTex: 定义一个采样器,用于访问纹理数据。
5. 内置变量和函数
Unity 提供了一些内置变量和函数,用于简化常见操作。
- UnityObjectToClipPos: 将对象空间坐标转换为裁剪空间坐标。
- WorldSpaceNormal: 将法线从对象空间转换为世界空间。
这些字段和块是 Unity Shader 编程中的基本构建块,通过理解它们,你可以创建复杂而强大的材质效果。如果你有具体的问题或需要进一步的解释,请告诉我!