14.CG-CG语句写在哪里
14.1 知识点
CG语句写在哪里
对于顶点\片元着色器来说,CG语句需要写在Pass渲染通道语句块中。我们需要在Pass语句块中加入指令 CGPROGRAM
和 ENDCG
。在这两个指令之间就是我们书写CG代码的地方。
Pass
{
CGPROGRAM
// CG代码写在这里
ENDCG
}
重要的编译指令 —— 指定着色器函数
在真正书写CG代码之前,我们需要先使用 #pragma
声明编译指令。我们目前只学习指定顶点\片元着色器函数的编译指令,其他相关编译指令我们以后再学习。
定义实现顶点/片元着色器代码的函数名称:
#pragma vertex name(实现顶点着色器的函数名)
#pragma fragment name(实现片元着色器的函数名)
这两个编译指令的作用是将顶点\片元着色器实现定位到两个函数中。之后我们只需要在这两个函数中书写Shader逻辑即可。
Pass
{
CGPROGRAM
// 开始一个 CG 程序块
#pragma vertex vert // 使用 vert 函数作为顶点着色器
#pragma fragment frag // 使用 frag 函数作为片段着色器
// make fog work
#pragma multi_compile_fog // 在多个雾效选项之间进行编译
#include "UnityCG.cginc" // 包含 UnityCG.cginc 文件,其中定义了一些 Unity 的常用函数和宏
// 定义输入结构体 appdata,包含顶点位置和纹理坐标
struct appdata
{
float4 vertex : POSITION; // 顶点位置
float2 uv : TEXCOORD0; // 纹理坐标
};
// 定义输出结构体 v2f,包含纹理坐标和裁剪空间坐标
struct v2f
{
float2 uv : TEXCOORD0; // 纹理坐标
UNITY_FOG_COORDS(1) // 雾效坐标,用于雾效计算
float4 vertex : SV_POSITION; // 裁剪空间坐标
};
sampler2D _MainTex; // 主纹理采样器
float4 _MainTex_ST; // 主纹理的纹理坐标变换矩阵
// 定义顶点着色器函数 vert,参数为输入结构体 appdata
v2f vert(appdata v)
{
v2f o; // 输出结构体
o.vertex = UnityObjectToClipPos(v.vertex); // 将顶点位置变换到裁剪空间
o.uv = TRANSFORM_TEX(v.uv, _MainTex); // 对纹理坐标进行变换
UNITY_TRANSFER_FOG(o, o.vertex); // 将雾效数据传递给输出结构体
return o; // 返回输出结构体
}
// 定义片段着色器函数 frag,参数为输出结构体 v2f
fixed4 frag(v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv); // 采样主纹理
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col); // 应用雾效
return col; // 返回颜色
}
ENDCG // 结束 CG 程序块
}
注意以下代码,定义实现时使用 vert
函数作为顶点着色器和使用 frag
函数作为片元着色器。
Pass
{
CGPROGRAM
#pragma vertex vert // 使用 vert 函数作为顶点着色器
#pragma fragment frag // 使用 frag 函数作为片段着色器
//...
// 定义顶点着色器函数 vert,参数为输入结构体 appdata
v2f vert(appdata v)
{
v2f o; // 输出结构体
//...
return o; // 返回输出结构体
}
// 定义片段着色器函数 frag,参数为输出结构体 v2f
fixed4 frag(v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv); // 采样主纹理
//...
return col; // 返回颜色
}
ENDCG
}
14.2 知识点代码
Lesson14_CG_CG语句写在哪里
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson14_CG_CG语句写在哪里 : MonoBehaviour
{
void Start()
{
#region 知识点一 CG语句写在哪里?
//对于顶点\片元着色器来说
//CG语句需要写在Pass渲染通道语句块中
//我们需要在Pass语句块中
//加入指令
//CGPROGRAM
//在这两个指令之间 就是我们书写CG代码的地方
//ENDCG
#endregion
#region 知识点二 重要的编译指令 —— 指定着色器函数
//在真正书写CG代码之前
//我们需要先使用 #pragma 声明编译指令
//我们目前只学习 指定顶点\片元着色器函数的 编译指令
//其他相关编译指令我们以后再学习
//定义实现 顶点/片元着色器 代码的函数名称
//#pragma vertex name(实现顶点着色器的函数名)
//#pragma fragment name(实现片元着色器的函数名)
//这两个编译指令的作用是将顶点\片元着色器实现定位到两个函数中
//之后我们只需要在这两个函数中书写Shader逻辑即可
#endregion
}
}
Lesson14_NewUnlitShader.shader
Shader "ShaderTeach/Lesson14_NewUnlitShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags
{
"RenderType"="Opaque"
}
LOD 100
Pass
{
CGPROGRAM
// 开始一个 CG 程序块
#pragma vertex vert // 使用 vert 函数作为顶点着色器
#pragma fragment frag // 使用 frag 函数作为片段着色器
// make fog work
#pragma multi_compile_fog // 在多个雾效选项之间进行编译
#include "UnityCG.cginc" // 包含 UnityCG.cginc 文件,其中定义了一些 Unity 的常用函数和宏
// 定义输入结构体 appdata,包含顶点位置和纹理坐标
struct appdata
{
float4 vertex : POSITION; // 顶点位置
float2 uv : TEXCOORD0; // 纹理坐标
};
// 定义输出结构体 v2f,包含纹理坐标和裁剪空间坐标
struct v2f
{
float2 uv : TEXCOORD0; // 纹理坐标
UNITY_FOG_COORDS(1) // 雾效坐标,用于雾效计算
float4 vertex : SV_POSITION; // 裁剪空间坐标
};
sampler2D _MainTex; // 主纹理采样器
float4 _MainTex_ST; // 主纹理的纹理坐标变换矩阵
// 定义顶点着色器函数 vert,参数为输入结构体 appdata
v2f vert(appdata v)
{
v2f o; // 输出结构体
o.vertex = UnityObjectToClipPos(v.vertex); // 将顶点位置变换到裁剪空间
o.uv = TRANSFORM_TEX(v.uv, _MainTex); // 对纹理坐标进行变换
UNITY_TRANSFER_FOG(o, o.vertex); // 将雾效数据传递给输出结构体
return o; // 返回输出结构体
}
// 定义片段着色器函数 frag,参数为输出结构体 v2f
fixed4 frag(v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv); // 采样主纹理
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col); // 应用雾效
return col; // 返回颜色
}
ENDCG // 结束 CG 程序块
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com