顶点和片段程序的输入输出
in输入关键字
out输出关键字
inout输入输出
常用语义
POSITION 位置
COLOR 颜色
1,从应用阶段传递模型数据给顶点着色器时支持的语义如下表
语义 | 描述 |
---|---|
POSITION | 模型空间中的顶点位置 通常float4 |
NORMAL | 顶点法线 通常float3 |
TANGENT | 顶点切线 通常float4 |
TEXCOORD(n) | 该顶点的纹理坐标 n组 |
COLOR | 顶点颜色 通常fixed4 float4 |
2,丛顶点着色器传递到片元着色器时支持的语义如下表:
语义 | 描述 |
---|---|
SV_POSITION | 裁剪空间中的顶点坐标 结构体必须包含一个该词修饰的变量 |
COLOR0 | 通常用于输出第一组顶点颜色 |
COLOR1 | 通常用于输出第二组顶点颜色 |
TEXCOORDN(0~7) | 通常用于输出纹理坐标 |
3,片元着色器输出时支持的语义
语义 | 描述 |
---|---|
SV_Target | 输出值将会存储到渲染目标中 |
CG profile
一个CG profile 定义了一个“被特定图形硬件或API所支持的Cg语言子集”,任意一个shader language都是基于可编程图形硬件的(寄存器、指令集等),这也就意味着:不同的图形硬件对应这不同功能的子集。这些可选的语言功能暴扣某些控制结构和标准库函数。porfile还定义了数据类型的精度,并且制定数据类型是否全部或仅部分支持。profile按照功能可以划分为顶点profile和片段profile,而顶点profile和片段profile又基于OpenGL和DirectX的不同版本或扩展,划分为各种版本。从某种意义上而言,OpenGL和DirectX的发展历程成就了Cg语言。
基本数据类型
float/float2/float3/float4 | 32位精度浮点值 |
---|---|
half/half2/half3/half4 | 16位中精度浮点数。范围是[-6万, +6万],能精确到十进制的小数点后3.3位 |
fixed/fixed2/fixed3/fixed4 | 11位低精度浮点数。范围是[-2, 2],精度是1/256 |
bool | true/false |
int | 很多时候当作float使用 |
矩阵 | float2x2等 |
struct | 结构体 |
//类型别名
typedef float4 Fl4;
//定义宏
#define MACROFL Fl4(fl2.xyxx)
//Swizzle操作
float2 fl2 = float2(1,0);
float4 fl4 = float4(fl2,0,0);
fl4 = float4(fl2.xy,0,0);//xyzw/rgba -> (1,0,0,0)
fl4 = flaot4(fl2.yx,0,0);//->(0,1,0,0)
fl4 = float4(fl2.xyxx);//->(1,0,1,1)
fl4 = MACROFL;//->(1,0,1,1)
float2x4 m2x4 = {{0,1,0,1},{0,0,0,0}};
Fl4 col = m2x4[0];//->(0,1,0,1)
//数组
float arr[4] = {1,2,3,4};
//结构体
col = float4(arr[0],arr[1],arr[2],arr[3]);
struct v2f{
float4 pos;
float2 uv;
}
v2f o;
o.pos = fl4;
o.uv = fl2;
流程控制
if else
while
do while
for
函数
cg标准函数库 转自:
https://blog.csdn.net/jingmengshenaaa/article/details/52809879
数学函数
函数 | 功能描述 |
---|---|
abs(x) | 返回输入参数的绝对值 |
acos(x) | 反余切函数,输入参数范围为[-1,1], 返回[0,π]区间的角度值 |
all(x) | 如果输入参数均不为0,则返回ture; 否则返回flase。&&运算 |
any(x) | 输入参数只要有其中一个不为0,则返回true。 |
asin(x) | 反正弦函数,输入参数取值区间为,返回角度值范围为, |
atan(x) | 反正切函数,返回角度值范围为 |
atan2(y,x) | 计算y/x的反正切值。实际上和atan(x)函数功能完全一样,至少输入参数不同。atan(x) = atan2(x, float(1))。 |
ceil(x) | 对输入参数向上取整。例如: ceil(float(1.3)) ,其返回值为2.0 |
clamp(x,a,b) | 如果x值小于a,则返回a;如果x值大于b,返回b;否则,返回x。 |
cos(x) | 返回弧度x的余弦值。返回值范围为 |
cosh(x) | 双曲余弦(hyperbolic cosine)函数,计算x的双曲余弦值。 |
cross(A,B) | 返回两个三元向量的叉积(cross product)。注意,输入参数必须是三元向量! |
degrees(x) | 输入参数为弧度值(radians),函数将其转换为角度值(degrees) |
determinant(m) | 计算矩阵的行列式因子。 |
dot(A,B) | 返回A和B的点积(dot product)。参数A和B可以是标量,也可以是向量(输入参数方面,点积和叉积函数有很大不同)。 |
exp(x) | 计算的值,e=2.71828182845904523536 |
exp2(x) | 计算的值 |
floor(x) | 对输入参数向下取整。例如floor(float(1.3))返回的值为1.0;但是floor(float(-1.3))返回的值为-2.0。该函数与ceil(x)函数相对应。 |
fmod(x,y) | 返回x/y的余数。如果y为0,结果不可预料。 |
frac(x) | 返回标量或矢量的小数 |
frexp(x, out i) | 将浮点数x分解为尾数和指数,即, 返回m,并将指数存入i中;如果x为0,则尾数和指数都返回0 |
isfinite(x) | 判断标量或者向量中的每个数据是否是有限数,如果是返回true;否则返回false; |
isinf(x) | 判断标量或者向量中的每个数据是否是无限,如果是返回true;否则返回false; |
isnan(x) | 判断标量或者向量中的每个数据是否是非数据(not-a-number NaN),如果是返回true;否则返回false; |
ldexp(x, n) | 计算的值 |
lerp(a, b, f) | 计算或者的值。即在下限a和上限b之间进行插值,f表示权值。注意,如果a和b是向量,则权值f必须是标量或者等长的向量。 |
lit(NdotL, NdotH, m) | N表示法向量;L表示入射光向量;H表示半角向量;m表示高光系数。 函数计算环境光、散射光、镜面光的贡献,返回的4元向量。 X位表示环境光的贡献,总是1.0; Y位代表散射光的贡献,如果 ,则为0;否则为 Z位代表镜面光的贡献,如果 或者,则位0;否则为;W位始终位1.0 |
log(x) | 计算ln(x)的值,x必须大于0 |
log2(x) | 计算log(x)2的值,x必须大于0 |
log10(x) | 计算log(x)10的值,x必须大于0 |
max(a, b) | 比较两个标量或等长向量元素,返回最大值。 |
min(x) | 比较两个标量或等长向量元素,返回最小值。 |
modf(x, out ip) | 把x分解成整数和分数两部分,每部分都和x有着相同的符号,整数部分被保存在ip中,分数部分由函数返回 |
mul(M, N) | 矩阵M和矩阵N的积,计算方法如下mul(M,N)=⎡⎣⎢⎢⎢M11M12M13M14M21M22M23M24M31M32M33M34M41M42M43M44⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢N11N12N12N13N21N22N23N24N31N32N33N34N41N42N43N44⎤⎦⎥⎥⎥ |
mul(M, v) | 矩阵M和列向量v的积,公式如下mul(M,v)=⎡⎣⎢⎢⎢M11M12M13M14M21M22M23M24M31M32M33M34M41M42M43M44⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢v1v2v3v4⎤⎦⎥⎥⎥ |
mul(v, M) | 行向量v和矩阵M的积,公式如下mul(v,M)=[v1v2v3v4]⎡⎣⎢⎢⎢M11M12M13M14M21M22M23M24M31M32M33M34M41M42M43M44⎤⎦⎥⎥⎥ |
noise(x) | 根据它的参数类型,这个函数可以是一元、二元或三元噪音函数。返回的值在0和1之间,并且通常与给定的输入值一样 |
pow(x, y) | x的y次方 |
radians(x) | 函数将角度值转换为弧度值 |
round(x) | 返回四舍五入值。 |
rsqrt(x) | x的平方根的倒数,x必须大于0 |
saturate(x) | 把x限制到[0,1]之间 |
sign(x) | 如果x>0则返回1;否则返回0 |
sin(x) | 输入参数为弧度,计算正弦值,返回值范围 为[-1,1] |
sincos(float x, out s, out c) | 该函数是同时计算x的sin值和cos值,其中s=sin(x),c=cos(x)。该函数用于“同时需要计算sin值和cos值的情况”,比分别运算要快很多! |
sinh(x) | 计算x的双曲正弦 |
smoothstep(min, max, x) | 值x位于min、max区间中。如果x=min,返回0;如果x=max,返回1;如果x在两者之间,按照下列公式返回数据:−2∗(x−minmax−min)3+3∗(x−minmax−min)2 |
step(x) | 如果x<a,返回0;否则,返回1 |
sqrt(x) | 求x的平方根,,x必须大于0 |
tan(x) | 计算x正切值 |
tanh(x) | 计算x的双曲线切线 |
transpose(M) | 矩阵M的转置矩阵如果M是一个AxB矩阵,M的转置是一个BxA矩阵,它的第一列是M的第一行,第二列是M的第二行,第三列是M的第三行,等等 |
几何函数
函数 | 功能描述 |
---|---|
distance(pt1, pt2) | 两点之间的欧几里德距离(Euclidean distance) |
faceforward(N,I,Ng) | 如果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)。只对三元向量有效 |
纹理函数
函数 | 功能描述 |
---|---|
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(sampler2D tex, float2 sq) | 一维投影纹理查询 |
Tex1Dproj(sampler2D tex, float3 szq) | 一维投影纹理查询,并比较深度值 |
tex2D(sampler2D tex, float s) | 二维纹理查询 |
tex2D(sampler2D tex, float s, float dsdx, float dsdy) | 使用导数值(derivatives)查询二维纹理 |
Tex2D(sampler2D tex, float2 sz) | 二维纹理查询,并进行深度值比较 |
Tex2D(sampler2D tex, float2 sz, float dsdx,float dsdy) | 使用导数值(derivatives)查询二维纹理, 并进行深度值比较 |
Tex2Dproj(sampler2D tex, float2 sq) | 二维投影纹理查询 |
Tex2Dproj(sampler2D tex, float3 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, float s, float dsdx, float 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) | 查询投影立方体纹理 |
在这个表中,每个函数第二个参数的名字指明了在执行纹理查询的时候,它的值是如果被使用的:
s表示这是一个一元、二元或三元纹理坐标。
z表示这是一个用来进行阴影贴图查找的深度比较值。
q表示这是一个透视值,在进行纹理查找之前,它被用来除以纹理坐标(s)。
当你使用的纹理函数允许你指定一个深度比较值的时候,与之相关联的纹理单元必须被设置成深度比较纹理。否则,深度比较实际上不会被执行。
导数函数
函数 | 功能描述 |
---|---|
ddx(a) | 近似a关于屏幕空间x轴的偏导数 |
ddy(a) | 近似a关于屏幕空间y轴的偏导数 |
调试函数
函数 | 功能描述 |
---|---|
void debug(float4 x) | 如果在编译时设置了DEBUG,片段着 色程序中调用该函数可以将值x作为COLOR语义的最终输出;否则该函数什么也不做。 |
Shader "Sbin/vf" {
SubShader {
pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
void Func(out float4 c);//声明,后实现
float Func2(float arr[3])//声明实现一起,传入数组要确定维度
{
float sum = 0;
for(int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
return sum;
}
void vert(in float2 objpos:POSITION, out float4 pos:POSITION, out float4 col:COLOR)
{
pos = float4(objpos, 0, 0);
col = pos;
}
void frag(inout float4 col:COLOR)
{
Func(col);
float arr[] = {0.5,0.5,0};
col.x = func2(arr);
}
void Func(out float4 c)
{
c = float4(0,1,0,1);
}
ENDCG
}
}
}