一、可编程Shader初步
1.1 单色Shader
源码如下:
//单色顶点&片段着色器
Shader "Shader/SimpleShader"
{
//------------------------------------【唯一的子着色器】------------------------------------
SubShader
{
//--------------------------------唯一的通道-------------------------------
Pass
{
//===========开启CG着色器语言编写模块============
CGPROGRAM
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vert
#pragma fragment frag
//--------------------------------【顶点着色函数】-----------------------------
// 输入:POSITION语义(坐标位置)
// 输出:SV_POSITION语义(像素位置)
//---------------------------------------------------------------------------------
float4 vert(float4 vertexPos : POSITION) : SV_POSITION
{
//坐标系变换
//输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
return mul(UNITY_MATRIX_MVP,vertexPos);
}
//--------------------------------【片段着色函数】-----------------------------
// 输入:无
// 输出:COLOR语义(颜色值)
//---------------------------------------------------------------------------------
float4 frag(void): COLOR
{
//返回单色
return float4(0.0, 0.6, 0.8, 1.0);
}
//===========结束CG着色器语言编写模块===========
ENDCG
}
}
}
1.2 单色可调Shader
源码如下:
//单色可调顶点&片段着色器
Shader "Shader/ColorChange"
{
//------------------------------------【属性值】------------------------------------
Properties
{
//主纹理
_Color("Color", Color) = (1,1,1,1)
}
//------------------------------------【唯一的子着色器】------------------------------------
SubShader
{
//--------------------------------唯一的通道-------------------------------
Pass
{
//===========开启CG着色器语言编写模块============
CGPROGRAM
//指定顶点与片段着色器名称
#pragma vertex vert
#pragma fragment frag
//--------------------------------【顶点着色函数】-----------------------------
// 输入:POSITION语义(坐标位置)
// 输出:SV_POSITION语义(像素位置)
//---------------------------------------------------------------------------------
float4 vert(float4 vertexPos : POSITION) : SV_POSITION
{
//坐标系变换
//输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
return mul(UNITY_MATRIX_MVP, vertexPos);
}
uniform float4 _Color;
//--------------------------------【片段着色函数】-----------------------------
// 输入:无
// 输出:COLOR语义(颜色值)
//---------------------------------------------------------------------------------
float4 frag(void) : COLOR
{
//返回单色
return _Color;
}
//===========结束CG着色器语言编写模块===========
ENDCG
}
}
}
1.3 RGB Cube Shader
源码如下:
//RGB立方体
Shader "Shader/RGB cube"
{
//------------------------------------【唯一的子着色器】------------------------------------
SubShader
{
//--------------------------------唯一的通道-------------------------------
Pass
{
//===========开启CG着色器语言编写模块============
CGPROGRAM
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vert
#pragma fragment frag
//顶点着色器输出结构
struct vertexOutput
{
float4 positon : SV_POSITION;//空间位置
float4 color : TEXCOORD0;//0级纹理坐标
};
//--------------------------------【顶点着色函数】-----------------------------
// 输入:POSITION语义
// 输出:顶点输出结构体
//---------------------------------------------------------------------------------
vertexOutput vert(float4 vertexPos : POSITION)
{
//实例化一个vertexOutput输出结构
vertexOutput output;
//坐标系变换:将三维空间中的坐标投影到二维窗口
output.positon = mul(UNITY_MATRIX_MVP, vertexPos);
//输出颜色为顶点位置加上一个颜色偏移量
output.color = vertexPos + float4(0.2, 0.2, 0.2, 0.0);
//返回最终的值
return output;
}
//--------------------------------【片段着色函数】-----------------------------
// 输入:vertexOutput结构体
// 输出:COLOR语义(颜色值)
//---------------------------------------------------------------------------------
float4 frag(vertexOutput input) : COLOR
{
//直接返回输入的颜色值
return input.color;
}
//===========结束CG着色器语言编写模块===========
ENDCG
}
}
}
1.4 颜色单项可调的RGB Cube
源码如下:
//RGB立方体单项可调
Shader "Shader/RGB cube v2"
{
//------------------------------------【属性值】------------------------------------
Properties
{
//单项颜色调节变量
_ColorValue("Color", Range(0.0, 1.0)) = 0.6
}
//------------------------------------【唯一的子着色器】------------------------------------
SubShader
{
//--------------------------------唯一的通道-------------------------------
Pass
{
//===========开启CG着色器语言编写模块============
CGPROGRAM
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vert
#pragma fragment frag
//顶点着色器输出结构
struct vertexOutput
{
float4 positon : SV_POSITION;
float4 color : TEXCOORD0;
};
//变量声明
uniform float _ColorValue;
//--------------------------------【顶点着色函数】-----------------------------
// 输入:POSITION语义
// 输出:顶点输出结构体
//---------------------------------------------------------------------------------
vertexOutput vert(float4 vertexPos : POSITION)
{
//实例化一个vertexOutput输出结构
vertexOutput output;
//坐标系变换:将三维空间中的坐标投影到二维窗口
output.positon = mul(UNITY_MATRIX_MVP, vertexPos);
//输出颜色为顶点位置加上一个颜色偏移量
output.color = vertexPos + float4(_ColorValue, _ColorValue, _ColorValue, 0.0);
//返回最终的值
return output;
}
//--------------------------------【片段着色函数】-----------------------------
// 输入:vertexOutput结构体
// 输出:COLOR语义(颜色值)
//---------------------------------------------------------------------------------
float4 frag(vertexOutput input) : COLOR
{
//直接返回输入的颜色值
return input.color;
}
//===========结束CG着色器语言编写模块===========
ENDCG
}
}
}
1.5 三色分量可调的RGB Cube
源码如下:
//RGB立方体三色可调
Shader "Shader/RGB cube v3"
{
//------------------------------------【属性值】------------------------------------
Properties
{
//红色
_ColorValueRed("ColorRed", Range(0.0, 1.0)) = 0.2
//绿色
_ColorValueGreen("ColorGreen", Range(0.0, 1.0)) = 0.5
//蓝色
_ColorValueBlue("ColorBlue", Range(0.0, 1.0)) = 0.6
}
//------------------------------------【唯一的子着色器】------------------------------------
SubShader
{
//--------------------------------唯一的通道-------------------------------
Pass
{
//===========开启CG着色器语言编写模块============
CGPROGRAM
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vert
#pragma fragment frag
//顶点着色器输出结构
struct vertexOutput
{
float4 positon : SV_POSITION;
float4 color : TEXCOORD0;
};
//变量声明
uniform float _ColorValueRed;
uniform float _ColorValueGreen;
uniform float _ColorValueBlue;
//--------------------------------【顶点着色函数】-----------------------------
// 输入:POSITION语义
// 输出:顶点输出结构体
//---------------------------------------------------------------------------------
vertexOutput vert(float4 vertexPos : POSITION)
{
//实例化一个vertexOutput输出结构
vertexOutput output;
//坐标系变换:将三维空间中的坐标投影到二维窗口
output.positon = mul(UNITY_MATRIX_MVP, vertexPos);
//输出颜色为顶点位置加上一个颜色偏移量
output.color = vertexPos + float4(_ColorValueRed, _ColorValueGreen, _ColorValueBlue, 0.0);
//返回最终的值
return output;
}
//--------------------------------【片段着色函数】-----------------------------
// 输入:vertexOutput结构体
// 输出:COLOR语义(颜色值)
//---------------------------------------------------------------------------------
float4 frag(vertexOutput input) : COLOR
{
//直接返回输入的颜色值
return input.color;
}
//===========结束CG着色器语言编写模块===========
ENDCG
}
}
}