glsl语言基础

来源:互联网 发布:钢结构图纸及数据图片 编辑:程序博客网 时间:2024/05/12 00:05

glsl的语言风格和C语言很像,但是变量的命名不能以gl_开始,因为gl_前缀用于glsl内部变量

基本类型

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

修饰符

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

顶点着色器内置变量

名称类型描述gl_Colorvec4输入属性-表示顶点的主颜色gl_SecondaryColorvec4输入属性-表示顶点的辅助颜色gl_Normalvec3输入属性-表示顶点的法线值gl_Vertexvec4输入属性-表示物体空间的顶点位置gl_MultiTexCoordnvec4输入属性-表示顶点的第n个纹理的坐标gl_FogCoordfloat输入属性-表示顶点的雾坐标gl_Positionvec4输出属性-变换后的顶点的位置,用于后面的固定的裁剪等操作。所有的顶点着色器都必须写这个值。gl_ClipVertexvec4输出坐标,用于用户裁剪平面的裁剪gl_PointSizefloat点的大小gl_FrontColorvec4正面的主颜色的varying输出gl_BackColorvec4背面主颜色的varying输出gl_FrontSecondaryColorvec4正面的辅助颜色的varying输出gl_BackSecondaryColorvec4背面的辅助颜色的varying输出gl_TexCoord[]vec4纹理坐标的数组varying输出gl_FogFragCoordfloat雾坐标的varying输出

片段着色器内置变量

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

操作符

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