Unity支持多种类型的Shader结构,每种结构适用于不同的渲染需求和场景。以下是一些常见的Shader类型及其结构:
顶点和片元着色器(Vertex and Fragment Shaders): 这是最基础的Shader类型,允许直接编写顶点着色器和片元着色器代码。
Shader "Custom/VertexFragmentShader"
{
Properties
{
// 属性定义
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// HLSL代码
ENDCG
}
}
} 2.表面着色器(Surface Shaders): 表面着色器是Unity的高级抽象,用于简化复杂光照模型的编写。
Shader "Custom/SurfaceShader"
{
Properties
{
// 属性定义
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surfaceFunction lightModel [optional params]
// HLSL代码
ENDCG
}
} 3.固定功能着色器(Fixed Function Shaders): 这是一种较老的Shader类型,不常用,它不使用HLSL代码,而是使用ShaderLab的固定功能设置。
Shader "Custom/FixedFunctionShader"
{
Properties
{
// 属性定义
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
// 固定功能设置
Blend Off
AlphaTest Greater 0.5
ColorMaterial AmbientAndDiffuse
// ...
}
} 4.计算着色器(Compute Shaders): 计算着色器用于执行不需要渲染到屏幕的计算任务
ComputeShader "Custom/ComputeShader"
{
CGPROGRAM
#pragma kernel myComputeKernel
// HLSL代码
ENDCG
} 5.阴影投射器着色器(Shadow caster shaders): 用于生成阴影贴图。
Shader "Custom/ShadowCasterShader"
{
Properties
{
// 属性定义
}
SubShader
{
Tags { "RenderType"="Opaque" "Queue"="Geometry+1" "ForceNoShadowCasting"="True" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// HLSL代码
ENDCG
}
}
} 6.自定义渲染器着色器(Custom Renderers): 用于与Unity的渲染管线交互的自定义渲染器。 每种Shader类型都有其特定的用途和结构,但它们都遵循ShaderLab的基本语法。在编写Shader时,应根据项目的具体需求和性能要求选择合适的Shader类型。
7.我看一个地形的Shader,块结构,是一个属性块,紧跟着没有块,但是这个没有块的部分写了HLSLINCLUDE部分.然后是SubShader块,如下,这是什么结构.
Shader "Custom/TerrainShader"
{
Properties
{
// 属性定义
}
HLSLINCLUDE
// HLSL代码,比如宏定义、结构体、函数等
#include "UnityCG.cginc"
#define MY_MACRO ...
struct MyDataStruct
{
// ...
};
ENDCG
SubShader
{
// 标签 (Tags)
// LOD级别 (LOD)
Pass
{
CGPROGRAM
// 使用HLSLINCLUDE中的代码
#pragma vertex vert
#pragma fragment frag
// 顶点和片元着色器实现
// ...
ENDCG
}
}
} 在Unity的Shader代码中,部分是一种特殊的方式来包含HLSL代码,它通常位于属性块和子着色器块之间。不是ShaderLab的正式部分,但它是一种约定,Unity在编译Shader时会将其内容包含在每个Pass中。
以下是代码的主要部分关键字和解释:
Properties部分:定义了着色器的一些属性,如是否启用高度混合、阴影模式、纹理映射等。
SubShader部分:定义了着色器的多个Pass,分别负责不同的渲染阶段。每个Pass包含一个标签(如"LightMode"),用于指定当前Pass的光照模式。
Pass "GBuffer":用于渲染物体的基本信息(如颜色、法线、深度等)。
Pass "META":用于提取纹理信息,为光照等进行预处理。
Pass "ShadowCaster":用于渲染物体的阴影。
Pass "DepthOnly":用于渲染物体的深度。
Pass "Forward":用于渲染物体的透明部分。
Pass "SceneSelectionPass":用于渲染场景选择时的深度。
UsePass "Hidden/Nature/Terrain/Utilities/PICKING":用于渲染选定物体的伪颜色。
Dependency "BaseMapShader":指向一个用于纹理映射的着色器。
Dependency "BaseMapGenShader":指向一个用于纹理生成的着色器。
CustomEditor:指定一个自定义的编辑器,用于修改着色器属性。