ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【TA/Unity】Shader基础结构

2026/8/3 23:06:21 拓冰建站 浏览量
【TA/Unity】Shader基础结构

目录

  • 创建Shader
  • 基本结构
  • Properties
  • SubShader
  • 代码总览


创建Shader

右键资源浏览器,通过Create>Shader菜单创建Shader文件。

请添加图片描述


基本结构

Shader "Learn/Shader" {Properties {// ...}SubShader {Pass {CGPROGRAM// ...ENDCG}}
}

Properties

  Properties {_float("Float", Float) = 0.0  // 浮点数_Range("Range", Range(0.0, 1.0)) = 0.0  // _Vector("Vector", Vector) = (1, 1, 1)  // 向量_Color("Color", Color) = (0.5, 0.5, 0.5, 0.5) // 颜色_Texture("Texture", 2D) = "black"{} // 贴图}
  • 属性语法:【属性名称 (“显示名称”, 参数类型) = 默认值】

  • 在此声明变量后可以在材质球的细节面板中查看、编辑变量值。
    在这里插入图片描述

  • 使用时,还需要在Pass中声明相同类型、名称的变量。


SubShader

SubShader {Pass {CGPROGRAM#pragma vertex Vert#pragma fragment Fragfloat3 _Light_;float4 _Color_;struct Appdata {float4 Vertex : POSITION;float3 Normal : NORMAL;};struct V2F {float4 Vertex : SV_POSITION;float3 Normal : NORMAL;};V2F Vert(Appdata _data) {V2F v2f;float4 pos = mul(unity_MatrixMVP, _data.Vertex);v2f.Vertex = pos;v2f.Normal = _data.Normal;return v2f;}float4 Frag(V2F _v2f) : SV_Target {float4 color = dot(_v2f.Normal, _Light_) * _Color_;return color;}ENDCG}}
  • SubShader:可以有多个SubShader,显卡从第一个SubShader开始运行,如果一个SubShader无法运行完成,自动运行下一个SubShader。
  • Pass:Pass理解为一个GPU渲染管线。在这里完成:获取模型数据;顶点Shader;图元装配及光栅化;片段Shader;输出合并等工作。可以有多个Pass。
  • pragma vertex/fragment:指定顶点着色器、片段着色器函数名称,在后面的代码中声明这些函数,在其中编写顶点、片段着色器代码。
  • Properties中声明的变量,要在此再次声明才可以使用。
  • 定义结构体,主要是传递给顶点着色器的数据、以及顶点着色器传递给片段着色器的数据。
    • 属性语法:【属性类型 属性名称 : 特定语义词】。
  • 着色器函数:实现上文中指定的着色器。

代码总览

Shader "Learn/Shader" { // Shader名称Properties {// 属性语法:属性名称("显示名称", 参数类型) = 默认值// 使用时需要在Pass中声明相同类型、名称的变量_float("Float", Float) = 0.0  // 浮点数_Range("Range", Range(0.0, 1.0)) = 0.0  // _Vector("Vector", Vector) = (1, 1, 1)  // 向量_Color("Color", Color) = (0.5, 0.5, 0.5, 0.5) // 颜色_Texture("Texture", 2D) = "black"{} // 贴图}// SubShader可以有多个,显卡运行效果时从第一个SubShader开始//如果一个SubShader无法运行完成,自动运行下一个SubShaderSubShader {// Pass理解为一个GPU渲染管线// 在这里完成:获取模型数据;顶点Shader;图元装配及光栅化;片段Shader;输出合并等工作Pass {CGPROGRAM#pragma vertex Vert // 指定顶点Shader名称为vert#pragma fragment Frag // 指定片段Shader名称为frag// Properties中的变量float3 _Vector_;	float4 _Color_;// 输入数据的结构体struct Appdata {// 属性语法:属性类型 属性名称 : 特定语义词float4 Vertex : POSITION;float3 Normal : NORMAL;};// 顶点Shader传递给片段着色器的结构体struct V2F {float4 Vertex : SV_POSITION;float3 Normal : NORMAL;};// 顶点ShaderV2F Vert(Appdata _data) {V2F v2f;float4 pos = mul(unity_MatrixMVP, _data.Vertex);	// MVP矩阵变换v2f.Vertex = pos;v2f.Normal = _data.Normal;return v2f;}// 片段Shaderfloat4 Frag(V2F _v2f) : SV_Target { // 渲染的目标SV_Targetfloat4 color = dot(_v2f.Normal, _Light_) * _Color_;	// Lambert光照模型return color;}ENDCG}}
}

正春华枝俏,待秋实果茂,愿与君共勉