关于glsl:GLSL

GLSL是学习webgl的必备的知识点,故整顿这篇文章前言GLSL Shader Example,这是一份不错的练习例子。 1. 变量1.1 根本类型变量类型阐明bool布尔型标量数据类型int/ivec2/ivec3/ivec4蕴含 1/2/3/4 个整型向量float/vec2/vec3/vec4蕴含 1,2,3,4 个浮点型向量sampler2D示意 2D 纹理samplerCube示意立方体纹理mat[2..3]示意 2x2 和 3x3 的矩阵mat4示意 4x4 的矩阵sampler1D用于内建的纹理函数中援用指定的 1D 纹理的句柄。只能够作为统一变量或者函数参数应用sampler2D二维纹理句柄sampler3D三维纹理句柄samplerCubecube map 纹理句柄sampler1DShadow一维深度纹理句柄sampler2DShadow二维深度纹理句柄1.2 内置变量顶点着色器可用的内置变量如下表: 名称类型形容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输入的深度用于随后的像素操作,如果这个值没有被写,则应用固定性能管线的深度值代替2. 修饰符变量的申明能够应用如下的修饰符: 修饰符形容const常量值必须在申明时初始化。它是只读的不可批改的。attribute示意只读的顶点数据,只用在顶点着色器中。数据来自以后的顶点状态或者顶点数组。它必须是全局范畴申明的,不能在函数外部。一个attribute能够是浮点数类型的标量,向量,或者矩阵。不能够是数组或者构造体uniform统一变量。在着色器执行期间统一变量的值是不变的。与const常量不同的是,这个值在编译期间是未知的是由着色器内部初始化的。统一变量在顶点着色器和片段着色器之间是共享的。它也只能在全局范畴进行申明。varying顶点着色器的输入。例如色彩或者纹理坐标,(插值后的数据)作为片段着色器的只读输出数据。必须是全局范畴申明的全局变量。能够是浮点数类型的标量,向量,矩阵。不能是数组或者构造体。centorid varying在没有多重采样的状况下,与varying是一样的意思。在多重采样时,centorid varying在光栅化的图形外部进行求值而不是在片段核心的固定地位求值。invariant(不变量)用于示意顶点着色器的输入和任何匹配片段着色器的输出,在不同的着色器中计算产生的值必须是统一的。所有的数据流和控制流,写入一个invariant变量的是统一的。编译器为了保障后果是完全一致的,须要放弃那些可能会导致不统一值的潜在的优化。除非必要,不要应用这个修饰符。在多通道渲染中防止z-fighting可能会应用到。in用在函数的参数中,示意这个参数是输出的,在函数中扭转这个值,并不会影响对调用的函数产生副作用。(相当于C语言的传值),这个是函数参数默认的修饰符out用在函数的参数中,示意该参数是输入参数,值是会扭转的。inout用在函数的参数,示意这个参数即是输出参数也是输入参数。3. 数组GLSL中只能应用一维数组。数组的类型能够是所有根本类型或者构造体。申明形式如下: vec4 transMatrix[4];vec4 affineMatrix[4] = {0, 1, 2, 3};vec4 rotateMatrix = affineMatrix;4. 构造体struct rotateMatrix { float x; float y; float z; float coeff[8];}struct positionInfo { vec2 coord; float value; rotateMatrix matrix;}5. 控制结构5.1 循环for (int s = 0; s < 7; s++) {vec2 r;r = vec2(cos(uv.y * i0 - i4 + time / i1), sin(uv.x * i0 - i4 + time / i1)) / i2;r += vec2(-r.y, r.x) * 0.3;uv.xy += r;i0 *= 1.93;i1 *= 1.15;i2 *= 1.7;i4 += 0.05 + 0.1 * time * i1;}5.2 管制语句与js统一,留神没有switch语句,且if过多会耗费性能。 ...

March 17, 2023 · 2 min · jiezi