【语法】HLSL、GLSL、CG语言的官方文档及内置函数翻译

参考资料

以下网址多数为中文网址

HLSL

HLSL微软网址

https://docs.microsoft.com/zh-cn/windows/desktop/direct3dhlsl/dx-graphics-hlsl

内置函数页

https://docs.microsoft.com/zh-cn/windows/desktop/direct3dhlsl/dx-graphics-hlsl-intrinsic-functions

GLSL

GLSL官方网站

https://www.khronos.org/

内置函数页

https://www.khronos.org/developers/reference-cards/

GLSL中文手册

https://github.com/wshxbqq/GLSL-Card

CG

Cg Nvidia文档

https://developer.download.nvidia.cn/cg/

内置函数页

https://developer.download.nvidia.cn/cg/index_stdlib.html

内置函数

HLSL

Name Description 描述 Minimum shader model
abort Terminates the current draw or dispatch call being executed. 终止当前正在执行的绘制或调度 4
abs Absolute value (per component). 绝对值(每个分量)
acos Returns the arccosine of each component of x. 返回x的反余弦
all Test if all components of x are nonzero. 所有分量均为非零
AllMemoryBarrier Blocks execution of all threads in a group until all memory accesses have been completed. 终止一个组中的所有线程,直到内存访问完成 5
AllMemoryBarrierWithGroupSync Blocks execution of all threads in a group until all memory accesses have been completed and all threads in the group have reached this call. 终止一个组中的所有线程,直到内存访问完成且组内的全部线程到达调用 5
any Test if any component of x is nonzero. 存在非零分量
asdouble Reinterprets a cast value into a double. 强制转换为double 5
asfloat Convert the input type to a float. 强制转换为float 4
asin Returns the arcsine of each component of x. 返回x的反正弦
asint Convert the input type to an integer. 强制转换为int 4
asuint Reinterprets the bit pattern of a 64-bit type to a uint. 强制转换为uint 5
asuint Convert the input type to an unsigned integer. 强制转换为uint 4
atan Returns the arctangent of x. 返回x的反正切
atan2 Returns the arctangent of of two values (x,y). 返回x/y的反正切
ceil Returns the smallest integer which is greater than or equal to x. 返回大于等于x的最小int
CheckAccessFullyMapped Determines whether all values from a Sample or Load operation accessed mapped tiles in a tiled resource. 确定来自采样或加载操作的所有值是否访问了平铺资源中的映射图块。 5
clamp Clamps x to the range [min, max]. 将x限制在区间[min,max]中
clip Discards the current pixel, if any component of x is less than zero. 当x的任意分量小于0时,剔除像素
cos Returns the cosine of x. 返回x的余弦
cosh Returns the hyperbolic cosine of x. 返回x的双曲余弦
countbits Counts the number of bits (per component) in the input integer. 统计输入整数各分量的位数 5
cross Returns the cross product of two 3D vectors. 叉乘
D3DCOLORtoUBYTE4 Swizzles and scales components of the 4D vector xto compensate for the lack of UBYTE4 support in some hardware. 用于旋转和缩放X参数的分量。以补偿某些硬件缺少对Ubyte4的支持。
ddx Returns the partial derivative of x with respect to the screen-space x-coordinate. 返回x相对于屏幕空间x坐标的偏导数
ddx_coarse Computes a low precision partial derivative with respect to the screen-space x-coordinate. 返回x相对于屏幕空间x坐标的低精度偏导数 5
ddx_fine Computes a high precision partial derivative with respect to the screen-space x-coordinate. 返回x相对于屏幕空间x坐标的高精度偏导数 5
ddy Returns the partial derivative of x with respect to the screen-space y-coordinate. 返回x相对于屏幕空间y坐标的偏导数
ddy_coarse Computes a low precision partial derivative with respect to the screen-space y-coordinate. 返回x相对于屏幕空间y坐标的低精度偏导数 5
ddy_fine Computes a high precision partial derivative with respect to the screen-space y-coordinate. 返回x相对于屏幕空间y坐标的高精度偏导数 5
degrees Converts x from radians to degrees. 弧度转换为角度
determinant Returns the determinant of the square matrix m. 求方阵行列式
DeviceMemoryBarrier Blocks execution of all threads in a group until all device memory accesses have been completed. 阻止组中所有线程的执行,直到完成所有设备内存访问 5
DeviceMemoryBarrierWithGroupSync Blocks execution of all threads in a group until all device memory accesses have been completed and all threads in the group have reached this call. 阻止组中所有线程的执行,直到完成所有设备内存访问且组中的所有线程被调用 5
distance Returns the distance between two points. 返回两点距离
dot Returns the dot product of two vectors. 返回两个向量点乘结果 1
dst Calculates a distance vector. 计算距离向量 5
errorf Submits an error message to the information queue. 向消息队列提交错误 4
EvaluateAttributeAtCentroid Evaluates at the pixel centroid. 在像素质心处求值 5
EvaluateAttributeAtSample Evaluates at the indexed sample location. 在索引的采样位置求值 5
EvaluateAttributeSnapped Evaluates at the pixel centroid with an offset. 在带偏移的像素质心处求值 5
exp Returns the base-e exponent. 返回e为底的指数值
exp2 Base 2 exponent (per component). 返回2为底的指数值(每分量)
f16tof32 Converts the float16 stored in the low-half of the uint to a float. 将float16存储在float32的下半部分 5
f32tof16 Converts an input into a float16 type. 将float32输入转换为float16 5
faceforward Returns -n * sign(dot(i, ng)). 返回n*sign(dot(i,ng))
firstbithigh Gets the location of the first set bit starting from the highest order bit and working downward, per component. 获取每分量的第一个高位bit,并将其置位低位 5
firstbitlow Returns the location of the first set bit starting from the lowest order bit and working upward, per component. 获取每分量的第一个低位bit,并将其置位高位 5
floor Returns the greatest integer which is less than or equal to x. 返回小于等于x的最大整数
fma Returns the double-precision fused multiply-addition of a * b + c. 返回a*b+c的双精度结合乘法加法 5
fmod Returns the floating point remainder of x/y. 返回x/y的余数
frac Returns the fractional part of x. 返回x的小数部分
frexp Returns the mantissa and exponent of x. 返回(对数)尾数和指数
fwidth Returns abs(ddx(x)) + abs(ddy(x)) abs(ddx(x)) + abs(ddy(x))
GetRenderTargetSampleCount Returns the number of render-target samples. 返回render-target采样数 4
GetRenderTargetSamplePosition Returns a sample position (x,y) for a given sample index. 返回给定采样索引的采样位置position (x,y) 4
GroupMemoryBarrier Blocks execution of all threads in a group until all group shared accesses have been completed. 阻止组中所有线程的执行,直到完成所有组共享访问 5
GroupMemoryBarrierWithGroupSync Blocks execution of all threads in a group until all group shared accesses have been completed and all threads in the group have reached this call. 阻止执行组中的所有线程,直到完成所有组共享访问并且组中的所有线程被调用 5
InterlockedAdd Performs a guaranteed atomic add of value to the dest resource variable. 原子Add 5
InterlockedAnd Performs a guaranteed atomic and. 原子And 5
InterlockedCompareExchange Atomically compares the input to the comparison value and exchanges the result. 将输入与比较值进行原子比较并交换结果 5
InterlockedCompareStore Atomically compares the input to the comparison value. 将输入与比较值进行原子比较 5
InterlockedExchange Assigns value to dest and returns the original value. 将值赋给目标并返回原始值 5
InterlockedMax Performs a guaranteed atomic max. 原子max 5
InterlockedMin Performs a guaranteed atomic min. 原子min 5
InterlockedOr Performs a guaranteed atomic or. 原子or 5
InterlockedXor Performs a guaranteed atomic xor. 原子xor(异或) 5
isfinite Returns true if x is finite, false otherwise. x是否有限
isinf Returns true if x is +INF or -INF, false otherwise. x是正或负无限
isnan Returns true if x is NAN or QNAN, false otherwise. x是 NAN 或 QNAN(无意义、非数字)
ldexp Returns x * 2exp x * 2^exp
length Returns the length of the vector v. 返回向量v的长度
lerp Returns x + s(y - x). 返回x + s(y - x)
lit Returns a lighting vector (ambient, diffuse, specular, 1) 返回照明向量(环境光、漫反射光、镜面反射光、1)
log Returns the base-e logarithm of x. 返回x以e为底数的对数
log10 Returns the base-10 logarithm of x. 返回x以10为底数的对数
log2 Returns the base-2 logarithm of x. 返回x以2为底数的对数
mad Performs an arithmetic multiply/add operation on three values. 对三个值执行乘法/加法运算,返回mvalue * avalue + bvalue. 5
max Selects the greater of x and y. 返回最大值
min Selects the lesser of x and y. 返回最小值
modf Splits the value x into fractional and integer parts. 将值x拆分为小数和整数部分
msad4 Compares a 4-byte reference value and an 8-byte source value and accumulates a vector of 4 sums. 比较4字节参考值和8字节源值,并填充4分量向量 5
mul Performs matrix multiplication using x and y. 叉乘 1
noise Generates a random value using the Perlin-noise algorithm. 使用Perlin噪波算法生成随机值
normalize Returns a normalized vector. 返回规范化向量
pow Returns xy.  返回x^y
printf Submits a custom shader message to the information queue. 向信息队列提交自定义着色器消息 4
Process2DQuadTessFactorsAvg Generates the corrected tessellation factors for a quad patch. 为四边形面片生成校正的曲面细分因子 5
Process2DQuadTessFactorsMax Generates the corrected tessellation factors for a quad patch. 为四边形面片生成校正的曲面细分因子 5
Process2DQuadTessFactorsMin Generates the corrected tessellation factors for a quad patch. 为四边形面片生成校正的曲面细分因子 5
ProcessIsolineTessFactors Generates the rounded tessellation factors for an isoline. 为等值线的圆形面片生成校正的曲面细分因子 5
ProcessQuadTessFactorsAvg Generates the corrected tessellation factors for a quad patch. 为四边形面片生成校正的曲面细分因子 5
ProcessQuadTessFactorsMax Generates the corrected tessellation factors for a quad patch. 为四边形面片生成校正的曲面细分因子 5
ProcessQuadTessFactorsMin Generates the corrected tessellation factors for a quad patch. 为四边形面片生成校正的曲面细分因子 5
ProcessTriTessFactorsAvg Generates the corrected tessellation factors for a tri patch. 为三边形面片生成校正的曲面细分因子 5
ProcessTriTessFactorsMax Generates the corrected tessellation factors for a tri patch. 为三边形面片生成校正的曲面细分因子 5
ProcessTriTessFactorsMin Generates the corrected tessellation factors for a tri patch. 为三边形面片生成校正的曲面细分因子 5
radians Converts x from degrees to radians. 角度转为弧度 1
rcp Calculates a fast, approximate, per-component reciprocal. 计算快速近似的倒数 5
reflect Returns a reflection vector. 返回反射向量 1
refract Returns the refraction vector. 返回折射向量
reversebits Reverses the order of the bits, per component. 反转每分量的bits 5
round Rounds x to the nearest integer 将x舍入为最接近的整数
rsqrt Returns 1 / sqrt(x) 返回1/sqrt(x)
saturate Clamps x to the range [0, 1] 返回限制在0-1中的x 1
sign Computes the sign of x. 计算x的符号
sin Returns the sine of x 返回x的正弦
sincos Returns the sine and cosine of x. 返回x的正弦余弦
sinh Returns the hyperbolic sine of x 返回x的双曲正弦
smoothstep Returns a smooth Hermite interpolation between 0 and 1.

如果x在[min,max]范围内,则返回0到1之间的平滑hermite插值

这里用到的是2点3次hermite插值

y = -2*x^3 + 3*x^2

sqrt Square root (per component) 每分量的平方根
step Returns (x >= a) ? 1 : 0 返回(x >= a) ? 1 : 0
tan Returns the tangent of x 返回x的正切
tanh Returns the hyperbolic tangent of x 返回x的双曲正切
tex1D(s, t) 1D texture lookup. 1维纹理查找 1
tex1D(s, t, ddx, ddy) 1D texture lookup. 1维纹理查找带偏导数
tex1Dbias 1D texture lookup with bias. 1维纹理查找带偏心
tex1Dgrad 1D texture lookup with a gradient. 1维纹理查找带偏导数
tex1Dlod 1D texture lookup with LOD. 1维纹理查找带LOD
tex1Dproj 1D texture lookup with projective divide. 1维纹理查找带投影除法
tex2D(s, t) 2D texture lookup. 2维纹理查找
tex2D(s, t, ddx, ddy) 2D texture lookup. 2维纹理查找
tex2Dbias 2D texture lookup with bias. 2维纹理查找带偏心
tex2Dgrad 2D texture lookup with a gradient. 2维纹理查找带偏导数
tex2Dlod 2D texture lookup with LOD. 2维纹理查找带LOD 3
tex2Dproj 2D texture lookup with projective divide. 2维纹理查找带投影除法
tex3D(s, t) 3D texture lookup. 3维纹理查找
tex3D(s, t, ddx, ddy) 3D texture lookup. 3维纹理查找带偏导数
tex3Dbias 3D texture lookup with bias. 3维纹理查找带偏心
tex3Dgrad 3D texture lookup with a gradient. 3维纹理查找带偏导数
tex3Dlod 3D texture lookup with LOD. 3维纹理查找带LOD
tex3Dproj 3D texture lookup with projective divide. 3维纹理查找带投影除法
texCUBE(s, t) Cube texture lookup. 立方体维纹理查找
texCUBE(s, t, ddx, ddy) Cube texture lookup. 立方体维纹理查找带偏导数
texCUBEbias Cube texture lookup with bias. 立方体维纹理查找带偏心
texCUBEgrad Cube texture lookup with a gradient. 立方体维纹理查找带偏导数
texCUBElod Cube texture lookup with LOD. 立方体维纹理查找带LOD
texCUBEproj Cube texture lookup with projective divide. 立方体维纹理查找带投影除法
transpose Returns the transpose of the matrix m. 返回矩阵m的转置 1
trunc Truncates floating-point value(s) to integer value(s) 将浮点值截断为整数值 1

GLSL

变量

GLSL的变量命名方式与C语言类似。变量的名称可以使用字母,数字以及下划线,但变量名不能以数字开头,还有变量名不能以gl_作为前缀,这个是GLSL保留的前缀,用于GLSL的内部变量。当然还有一些GLSL保留的名称是不能够作为变量的名称的。

基本类型

除了布尔型,整型,浮点型基本类型外,GLSL还引入了一些在着色器中经常用到的类型作为基本类型。这些基本类型都可以作为结构体内部的类型。如下表:

类型 描述
void 跟C语言的void类似,表示空类型。作为函数的返回类型,表示这个函数不返回值。
bool 布尔类型,可以是true 和false,以及可以产生布尔型的表达式。
int 整型 代表至少包含16位的有符号的整数。可以是十进制的,十六进制的,八进制的。
float 浮点型
bvec2 包含2个布尔成分的向量
bvec3 包含3个布尔成分的向量
bvec4 包含4个布尔成分的向量
ivec2 包含2个整型成分的向量
ivec3 包含3个整型成分的向量
ivec4 包含4个整型成分的向量
mat2 或者 mat2x2 2x2的浮点数矩阵类型
mat3或者mat3x3 3x3的浮点数矩阵类型
mat4x4 4x4的浮点矩阵
mat2x3 2列3行的浮点矩阵(OpenGL的矩阵是列主顺序的)
mat2x4 2列4行的浮点矩阵
mat3x2 3列2行的浮点矩阵
mat3x4 3列4行的浮点矩阵
mat4x2 4列2行的浮点矩阵
mat4x3 4列3行的浮点矩阵
sampler1D 用于内建的纹理函数中引用指定的1D纹理的句柄。只可以作为一致变量或者函数参数使用
sampler2D 二维纹理句柄
sampler3D 三维纹理句柄
samplerCube cube map纹理句柄
sampler1DShadow 一维深度纹理句柄
sampler2DShadow 二维深度纹理句柄

结构体

结构体

结构体可以组合基本类型和数组来形成用户自定义的类型。在定义一个结构体的同时,你可以定义一个结构体实例。或者后面再定义。

struct surface {float indexOfRefraction;

vec3 color;float turbulence;

} mySurface;

surface secondeSurface;

你可以通过=为结构体赋值,或者使用 ==,!=来判断两个结构体是否相等。

mySurface = secondSurface;

mySurface == secondSurface;

只有结构体中的每个成分都相等,那么这两个结构体才是相等的。访问结构体的内部成员使用. 来访问。

vec3 color = mySurface.color + secondSurface.color;

结构体至少包含一个成员。固定大小的数组也可以被包含在结构体中。GLSL的结构体不支持嵌套定义。只有预先声明的结构体可以嵌套其中。

struct myStruct {

  vec3 points[3]; //固定大小的数组是合法的

  surface surf;  //可以,之前已经定义了

  struct velocity {  //不合法float speed;

    vec3 direction;

  } velo;

  subSurface sub; //不合法,没有预先声明;};struct subSurface {  int id;
};

数组

GLSL中只可以使用一维的数组。数组的类型可以是一切基本类型或者结构体。下面的几种数组声明是合法的:

surface mySurfaces[];
vec4 lightPositions[8];
vec4 lightPos[] = lightPositions;const int numSurfaces = 5;
surface myFiveSurfaces[numSurfaces];float[5] values;

指定显示大小的数组可以作为函数的参数或者使返回值,也可以作为结构体的成员.数组类型内建了一个length()函数,可以返回数组的长度。

lightPositions.length() //返回数组的大小 8

最后,你不能定义数组的数组。

修饰符

变量的声明可以使用如下的修饰符。

修饰符 描述
const 常量值必须在声明是初始化。它是只读的不可修改的。
attribute 表示只读的顶点数据,只用在顶点着色器中。数据来自当前的顶点状态或者顶点数组。它必须是全局范围声明的,不能再函数内部。一个attribute可以是浮点数类型的标量,向量,或者矩阵。不可以是数组或则结构体
uniform 一致变量。在着色器执行期间一致变量的值是不变的。与const常量不同的是,这个值在编译时期是未知的是由着色器外部初始化的。一致变量在顶点着色器和片段着色器之间是共享的。它也只能在全局范围进行声明。
varying 顶点着色器的输出。例如颜色或者纹理坐标,(插值后的数据)作为片段着色器的只读输入数据。必须是全局范围声明的全局变量。可以是浮点数类型的标量,向量,矩阵。不能是数组或者结构体。
centorid varying 在没有多重采样的情况下,与varying是一样的意思。在多重采样时,centorid varying在光栅化的图形内部进行求值而不是在片段中心的固定位置求值。
invariant (不变量)用于表示顶点着色器的输出和任何匹配片段着色器的输入,在不同的着色器中计算产生的值必须是一致的。所有的数据流和控制流,写入一个invariant变量的是一致的。编译器为了保证结果是完全一致的,需要放弃那些可能会导致不一致值的潜在的优化。除非必要,不要使用这个修饰符。在多通道渲染中避免z-fighting可能会使用到。
in 用在函数的参数中,表示这个参数是输入的,在函数中改变这个值,并不会影响对调用的函数产生副作用。(相当于C语言的传值),这个是函数参数默认的修饰符
out 用在函数的参数中,表示该参数是输出参数,值是会改变的。
inout 用在函数的参数,表示这个参数即是输入参数也是输出参数。

内置变量

内置变量可以与固定函数功能进行交互。在使用前不需要声明。顶点着色器可用的内置变量如下表:

名称 类型 描述
gl_Color vec4 输入属性-表示顶点的主颜色
gl_SecondaryColor vec4 输入属性-表示顶点的辅助颜色
gl_Normal vec3 输入属性-表示顶点的法线值
gl_Vertex vec4 输入属性-表示物体空间的顶点位置
gl_MultiTexCoordn vec4 输入属性-表示顶点的第n个纹理的坐标
gl_FogCoord float 输入属性-表示顶点的雾坐标
gl_Position vec4 输出属性-变换后的顶点的位置,用于后面的固定的裁剪等操作。所有的顶点着色器都必须写这个值。
gl_ClipVertex vec4 输出坐标,用于用户裁剪平面的裁剪
gl_PointSize float 点的大小
gl_FrontColor vec4 正面的主颜色的varying输出
gl_BackColor vec4 背面主颜色的varying输出
gl_FrontSecondaryColor vec4 正面的辅助颜色的varying输出
gl_BackSecondaryColor vec4 背面的辅助颜色的varying输出
gl_TexCoord[] vec4 纹理坐标的数组varying输出
gl_FogFragCoord float 雾坐标的varying输出

片段着色器的内置变量如下表:

名称 类型 描述
gl_Color vec4 包含主颜色的插值只读输入
gl_SecondaryColor vec4 包含辅助颜色的插值只读输入
gl_TexCoord[] vec4 包含纹理坐标数组的插值只读输入
gl_FogFragCoord float 包含雾坐标的插值只读输入
gl_FragCoord vec4 只读输入,窗口的x,y,z和1/w
gl_FrontFacing bool 只读输入,如果是窗口正面图元的一部分,则这个值为true
gl_PointCoord vec2 点精灵的二维空间坐标范围在(0.0, 0.0)到(1.0, 1.0)之间,仅用于点图元和点精灵开启的情况下。
gl_FragData[] vec4 使用glDrawBuffers输出的数据数组。不能与gl_FragColor结合使用。
gl_FragColor vec4 输出的颜色用于随后的像素操作
gl_FragDepth float 输出的深度用于随后的像素操作,如果这个值没有被写,则使用固定功能管线的深度值代替

表达式

操作符

GLSL语言的操作符与C语言相似。如下表(操作符的优先级从高到低排列)

操作符 描述
() 用于表达式组合,函数调用,构造
[] 数组下标,向量或矩阵的选择器
. 结构体和向量的成员选择
++ -- 前缀或后缀的自增自减操作符
+ – ! 一元操作符,表示正 负 逻辑非
* / 乘 除操作符
+ - 二元操作符 表示加 减操作
<> <= >= == != 小于,大于,小于等于, 大于等于,等于,不等于 判断符
&& || ^^ 逻辑与 ,或,  异或
?: 条件判断符
= += –= *=  /= 赋值操作符
, 表示序列

像 求地址的& 和 解引用的 * 操作符不再GLSL中出现,因为GLSL不能直接操作地址。类型转换操作也是不允许的。 位操作符(&,|,^,~, <<, >> ,&=, |=, ^=, <<=, >>=)是GLSL保留的操作符,将来可能会被使用。还有求模操作(%,%=)也是保留的。

数组访问

数组的下标从0开始。合理的范围是[0, size - 1]。跟C语言一样。如果数组访问越界了,那行为是未定义的。如果着色器的编译器在编译时知道数组访问越界了,就会提示编译失败。

vec4 myColor, ambient, diffuse[6], specular[6];

myColor = ambient + diffuse[4] + specular[4];

构造函数

构造函数可以用于初始化包含多个成员的变量,包括数组和结构体。构造函数也可以用在表达式中。调用方式如下:

vec3 myNormal = vec3(1.0, 1.0, 1.0);

greenTint = myColor + vec3(0.0, 1.0, 0.0);

ivec4 myColor = ivec4(255);

还可以使用混合标量和向量的方式来构造,只要你的元素足以填满该向量。

vec4 color = vec4(1.0, vec2(0.0, 1.0), 1.0);

vec3 v = vec3(1.0, 10.0, 1.0);

vec3 v1 = vec3(v);

vec2 fv = vec2(5.0, 6.0);

float f = float(fv); //用x值2.5构造,y值被舍弃

对于矩阵,OpenGL中矩阵是列主顺序的。如果只传了一个值,则会构造成对角矩阵,其余的元素为0.

mat3 m3 = mat3(1.0);

构造出来的矩阵式:

1.0 0.0 0.0

0.0 1.0 0.0

0.0 0.0 1.0

mat2 matrix1 = mat2(1.0, 0.0, 0.0, 1.0);

mat2 matrix2 = mat2(vec2(1.0, 0.0), vec2(0.0, 1.0));

mat2 matrix3 = mat2(1.0); 

mat2 matrix4 = mat2(mat4(2.0)); //会取 4x4矩阵左上角的2x2矩阵。

构造函数可以用于标量数据类型的转换。GLSL不支持隐式或显示的转换,只能通过构造函数来转。其中int转为float值是一样的。float转为int则小数部分被丢弃。int或float转为bool,0和0.0转为false,其余的值转为true. bool转为int或float,false值转为0和0.0,true转为1和1.0.

float f = 1.7;

int I = int(f); // I = 1

数组的初始化,可以在构造函数中传入值来初始化数组中对应的每一个值。

ivec2 position[3] = ivec2[3]((0,0), (1,1), (2,2));

ivec2 pos2[3] = ivec2[]((3,3), (2,1), (3,1));

构造函数也可以对结构体进行初始化。其中顺序和类型要一一对应。

struct surface {  int  index;
  vec3 color;  float rotate;
};

surface mySurface = surface(3, vec3(red, green, blue), 0.5);

成分选择

向量中单独的成分可以通过{x,y,z,w},{r,g,b,a}或者{s,t,p,q}的记法来表示。这些不同的记法用于顶点,颜色,纹理坐标。在成分选择中,你不可以混合使用这些记法。其中{s,t,p,q}中的p替换了纹理的r坐标,因为与颜色r重复了。下面是用法举例:

vec3 myVec = {0.5, 0.35, 0.7};float r = myVec.r;float myYz = myVec.yz;float myQ = myVec.q;//出错,数组越界访问,q代表第四个元素float myRY = myVec.ry; //不合法,混合使用记法

较特殊的使用方式,你可以重复向量中的元素,或者颠倒其顺序。如:

vec3 yxz = myVec.yxz; //调换顺序vec4 mySSTT = myVec.sstt; //重复其中的值

在赋值是,也可以选择你想要的顺序,但是不能重复其中的成分。

vec4 myColor = {0.0, 1.0, 2.0, 1.0};
myColor.x = -1.0;
myColor.yz = vec2(3.0, 5.0);
myColor.wx = vec2(1.0, 3.0);
myColor.zz = vec2(2.0, 3.0); //不合法

我们也可以通过使用下标来访问向量或矩阵中的元素。如果越界那行为将是未定义的。

float myY = myVec[1];

在矩阵中,可以通过一维的下标来获得该列的向量(OpenGL的矩阵是列主顺序的)。二维的小标来获得向量中的元素。

mat3 myMat = mat3(1.0);
vec3 myVec = myMat[0]; //获得第一列向量 1.0, 0.0, 0.0float f = myMat[0][0]; // 第一列的第一个向量。

控制流

循环

与C和C++相似,GLSL语言也提供了for, while, do/while的循环方式。使用continue跳入下一次循环,break结束循环。

for (l = 0; l < numLights; l++)
{if (!lightExists[l])continue;
    color += light[l];
}while (i < num)
{
    sum += color[i];
    i++;
}do{
    color += light[lightNum];
    lightNum--;
}while (lightNum > 0)

if/else

color = unlitColor;if (numLights > 0)
{
    color = litColor;
}else{
    color = unlitColor;
}

discard

片段着色器中有一种特殊的控制流成为discard。使用discard会退出片段着色器,不执行后面的片段着色操作。片段也不会写入帧缓冲区。

if (color.a < 0.9)

discard;

函数

在每个shader中必须有一个main函数。main函数中的void参数是可选的,但返回值是void时必须的。

void main(void)
{
 ...
}

GLSL中的函数,必须是在全局范围定义和声明的。不能在函数定义中声明或定义函数。函数必须有返回类型,参数是可选的。参数的修饰符(in, out, inout, const等)是可选的。

//函数声明bool isAnyNegative(const vec4 v);//函数调用void main(void)
{bool isNegative = isAnyNegative(gl_Color);
    ...
}//定义bool isAnyNegative(const vec4 v)
{if (v.x < 0.0 || v.y < 0.0 || v.z < 0.0 || v.w < 0.0)return true;elsereturn false;
}

结构体和数组也可以作为函数的参数。如果是数组作为函数的参数,则必须制定其大小。在调用传参时,只传数组名就可以了。

vec4 sumVectors(int sumSize, vec4 v[10]);void main()
{
    vec4 myColors[10];
    ...
    vec4 sumColor = sumVectors(5, myColors);
}

vec4 sumVectors(int sumSize, vec4 v[10])
{int i = 0;
    vec4 sum = vec4(0.0);for(; i < sumSize; ++i)
    {
        sum += v[i]; 
    }return sum;
}

GLSL的函数是支持重载的。函数可以同名但其参数类型或者参数个数不同即可。

float sum(float a, float b)
{return a + b;
}

vec3 sum(vec3 v1, vec3 v2)
{return v1 + v2;
}

GLSL中函数递归是不被允许的。其行为是未定义的。

GLSL中提供了许多内建的函数,来方便我们的使用。可以在官方手册中查找相关的函数http://www.opengl.org/sdk/docs/man/

GLSL指南 http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdf

CG

(1)数学函数

函数 功能描述
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) 计算的值,x必须大于0
log2(x) 计算的值,x必须大于0
log10(x) 计算的值,x必须大于0
max(a, b) 比较两个标量或等长向量元素,返回最大值。
min(a,b) 比较两个标量或等长向量元素,返回最小值。
modf(x, out ip) 把x分解成整数和分数两部分,每部分都和x有着相同的符号,整数部分被保存在ip中,分数部分由函数返回
mul(M, N) 矩阵M和矩阵N的积,计算方法如下
mul(M, v) 矩阵M和列向量v的积,公式如下
mul(v, M) 行向量v和矩阵M的积,公式如下
noise(x) 根据它的参数类型,这个函数可以是一元、二元或三元噪音函数。返回的值在0和1之间,并且通常与给定的输入值一样
pow(x, y)  
radians(x) 函数将角度值转换为弧度值
round(x) 返回四舍五入值。
rsqrt(x) x的平方根的倒数,x必须大于0
saturate(x) 把x限制到[0,1]之间
sign(x) 如果则返回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在两者之间,按照下列公式返回数据:
step(a, x) 如果,返回0;否则,返回1
sqrt(x) 求x的平方根,,x必须大于0
tan(x) 计算x正切值
tanh(x) 计算x的双曲线切线
transpose(M) 矩阵M的转置矩阵
如果M是一个AxB矩阵,M的转置是一个BxA矩阵,它的第一列是M的第一行,第二列是M的第二行,第三列是M的第三行,等等

(2)几何函数

函数 功能描述
distance(pt1, pt2) 两点之间的欧几里德距离(Euclidean distance)
faceforward(N,I,Ng) 如果,返回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)。
只对三元向量有效

(3)纹理映射函数

函数 功能描述
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) 查询投影立方体纹理


在这个表中,每个函数第二个参数的名字指明了在执行纹理查询的时候,它的值是如果被使用的:

  • s表示这是一个一元、二元或三元纹理坐标。
  • z表示这是一个用来进行阴影贴图查找的深度比较值。
  • q表示这是一个透视值,在进行纹理查找之前,它被用来除以纹理坐标(s)。

当你使用的纹理函数允许你指定一个深度比较值的时候,与之相关联的纹理单元必须被设置成深度比较纹理。否则,深度比较实际上不会被执行。 
 

(4)偏导函数

函数 功能描述
ddx(a) 近似a关于屏幕空间x轴的偏导数
ddy(a) 近似a关于屏幕空间y轴的偏导数

 

(5)调试函数

函数 功能描述
void debug(float4 x) 如果在编译时设置了DEBUG,片段着 色程序中调用该函数可以将值x作为COLOR语义的最终输出;否则该函数什么也不做。

 

你可能感兴趣的:(渲染,语法)