自定义函数
在ShaderLabCG中函数的定义与C语言类似
void func ()
{
}
定义函数的格式如下
返回值类型 函数名 (参数1,参数2,参数3,......)
{
//函数体
return//返回值
}
函数的前项声明
💡 在Cg语言当中函数的定义要写在后面调用它的方法之前 如果一定要写在后面可以使用前项声明
如果函数写在调用它之前,并且没有进行前项声明,则会报错
前项声明示例子如下:
fixed4 func(fixed4 col);
void frag(inout fixed4 col:COLOR)
{
col=func(col);
}
fixed4 func (fixed4 col)
{
col.x=1;
return col;
}
Cg include
内置着色器 include 文件
Unity 提供了若干文件供
用于引入预定义的变量和 helper 函数。这可以通过标准
#include 指令来完成,例如:
CGPROGRAM
// ...
#include"UnityCG.cginc"
// ...
ENDCG
Unity 中的着色器 include 文件采用 .cginc 扩展名,内置的着色器 include 文件包括:
HLSLSupport.cginc-_(自动包含)_用于跨平台着色器编译的 helper 宏和定义。UnityShaderVariables.cginc-_(自动包含)_常用的全局变量。UnityCG.cginc- 常用的。
AutoLight.cginc- 光照和阴影功能,例如在内部使用此文件。
Lighting.cginc- 标准光照模型;当您编写表面着色器时会自动包含。
TerrainEngine.cginc- 地形和植被着色器的 helper 函数。
如果您要查看任何 helper 代码具体执行的操作,可在 Unity 应用程序中找到这些文件(Windows 上位于 {unity 安装路径}/Data/CGIncludes/UnityCG.cginc__,Mac 上位于 /Applications/Unity/Unity.app/Contents/CGIncludes/UnityCG.cginc__)。
HLSLSupport.cginc
编译 CGPROGRAM 着色器时会自动包含此文件(但不会对 HLSLPROGRAM 着色器包含此文件)。此文件声明各种
以帮助进行多平台着色器开发。
UnityShaderVariables.cginc
编译 CGPROGRAM 着色器时会自动包含此文件(但不会对 HLSLPROGRAM 着色器包含此文件)。此文件声明着色器中常用的各种
。
UnityCG.cginc
Shader 对象中通常会包含此文件。此文件声明大量
和数据结构。
UnityCG.cginc 中的数据结构
- struct
appdata_base:顶点着色器输入,包含位置、法线和一个纹理坐标。 - struct
appdata_tan:顶点着色器输入,包含位置、法线、切线和一个纹理坐标。 - struct
appdata_full:顶点着色器输入,包含位置、法线、切线、顶点颜色和两个纹理坐标。 - struct
appdata_img: 顶点着色器输入,包含位置和一个纹理坐标。
Cg数学函数Mathematical Functions
几何函数 Geometric Functions
函数
功能描述
distance(pt1, pt2)
两点之间的欧几里德距离(Euclidean distance)
faceforward(N,I,Ng)
如果dot( Ng , I ) < 0,返回N;否则返回-N。
length(v)
返回一个向量的模,即sqrt(dot(v,v))
normalize(v)
返回v向量的单位向量
reflect(I, N)
根据入射光线方向I和表面法向量N计算反射向量,仅对三元向量有效
refract(I,N,eta)
根据入射光线方向I,表面法向量N和折射相对系数eta,计算折射向量。如果对给定的eta,I和N之间的角度太大,返回(0,0,0)。只对三元向量有效
贴图函数 Texture Map Functions
函数
功能描述
tex1D(sampler1D tex, float s)
一维纹理查询
tex1D(sampler1D tex, float s, float dsdx, float dsdy)
使用导数值(derivatives)查询一维纹理
Tex1D(sampler1D tex, float2 sz)
一维纹理查询,并进行深度值比较
Tex1D(sampler1D tex, float2 sz, float dsdx,float dsdy)
使用导数值(derivatives)查询一维纹理, 并进行深度值比较
Tex1Dproj(sampler1D tex, float2 sq)
一维投影纹理查询
Tex1Dproj(sampler1D tex, float3 szq)
一维投影纹理查询,并比较深度值
Tex2D(sampler2D tex, float2 s)
二维纹理查询
Tex2D(sampler2D tex, float2 s, float2 dsdx, float2 dsdy)
使用导数值(derivatives)查询二维纹理
Tex2D(sampler2D tex, float3 sz)
二维纹理查询,并进行深度值比较
Tex2D(sampler2D tex, float3 sz, float2 dsdx,float2 dsdy)
使用导数值(derivatives)查询二维纹理,并进行深度值比较
Tex2Dproj(sampler2D tex, float3 sq)
二维投影纹理查询
Tex2Dproj(sampler2D tex, float4 szq)
二维投影纹理查询,并进行深度值比较
texRECT(samplerRECT tex, float2 s)
二维非投影矩形纹理查询(OpenGL独有)
texRECT (samplerRECT tex, float3 sz, float2 dsdx,float2 dsdy)
二维非投影使用导数的矩形纹理查询(OpenGL独有)
texRECT (samplerRECT tex, float3 sz)
二维非投影深度比较矩形纹理查询(OpenGL独有)
texRECT (samplerRECT tex, float3 sz, float2 dsdx,float2 dsdy)
二维非投影深度比较并使用导数的矩形纹理查询(OpenGL独有)
texRECT proj(samplerRECT tex, float3 sq)
二维投影矩形纹理查询(OpenGL独有)
texRECT proj(samplerRECT tex, float3 szq)
二维投影矩形纹理深度比较查询(OpenGL独有)
Tex3D(sampler3D tex, float s)
三维纹理查询
Tex3D(sampler3D tex, float3 s, float3 dsdx, float3 dsdy)
结合导数值(derivatives)查询三维纹理
Tex3Dproj(sampler3D tex, float4 szq)
查询三维投影纹理,并进行深度值比较
texCUBE(samplerCUBE tex, float3 s)
查询立方体纹理
texCUBE (samplerCUBE tex, float3 s, float3 dsdx, float3 dsdy)
结合导数值(derivatives)查询立方体纹理
texCUBEproj (samplerCUBE tex, float4 sq)
查询投影立方体纹理
导数函数 Derivative Functions
函数
功能描述
ddx(a)
近似a关于屏幕空间x轴的偏导数
ddy(a)
近似a关于屏幕空间y轴的偏导数
调试函数 Debugging Function
函数
功能描述
void debug(float4 x)
如果在编译时设置了DEBUG,片段着 色程序中调用该函数可以将值x作为COLOR语义的最终输出;否则该函数什么也不做。


...