美文网首页OpenGL ES
第十七节—GLSL的常见着色器内建变量和内建函数

第十七节—GLSL的常见着色器内建变量和内建函数

作者: L_Ares | 来源:发表于2020-10-12 17:01 被阅读0次

    本文为L_Ares个人写作,如需转载请表明原文出处。

    本节主要介绍GLSL中的常见内建变量都有哪些,作用是什么,并不是全部,而是常见。

    一、顶点着色器(VertexShader)

    1. 顶点着色器的内建变量

    (1). gl_VertexID : 这是一个输入的变量,它的作用是保存你输入的每一个顶点的索引值,也就是你输入的每一个顶点的ID。比如你输入的第一个顶点,第二个顶点,第三个顶点。。。等等,都是由它来确认的。它是一个标签,一般情况下都是默认高精度(highp)来修饰的。

    (2). gl_InstanceID : 保存当前绘制的是第几个图形的编号。

    (3). gl_Position : 保存的是所有运算完成后的,顶点坐标。它是一个高精度(highp)的浮点型的(float)4维向量(vec4)。

    (4). gl_PointSize :表示的是每个顶点的大小。点精灵的大小。

    (5). gl_FrontFacing : 这是一个bool值,表示的是是否要做前面。

    2. 顶点着色器的内建Uniform属性

    窗口深度值的范围:gl_DepthRangeParameters

    这是一个结构体,结构体内包含了高精度浮点型的近剪切面深度,远剪切面深度,和远近剪切面深度的差值。

    struct gl_DepthRangeParameters {
        highp float near;
        highp float far;
        highp float diff;
    }
    

    uniform gl_DepthRangeParameters gl_DepthRange;

    3. 顶点着色器的内建常量

    在这里可以发现,下述的内建常量全部都是const修饰符修饰的,所以很明显是不可以修改的,精度全部都是mediump所以全部都是中精度的,数据类型全部是int,所以全都是整型的 。

    (1). 顶点数据的最大量,就是单次可以指定的,最多支持多少个顶点同时输入。
    const mediump int gl_MaxVertexAttribs = 16;

    (2). 顶点着色器中,最多支持的Uniform修饰的数据是多少。
    const mediump int gl_MaxVertexUniformVectors = 256;

    (3). 输出的变量的最大数量。
    const mediump int gl_MaxVertexOutputVectors = 16;

    (4). 最多可以单次使用多少个纹理单元。
    const mediump int gl_MaxVertexTextureImageUnits = 16;

    (5). 在顶点着色器和片元着色器中,两个一起可以使用的最多的纹理单元的数量
    const mediump int gl_MaxCombinedTextureImageUnits = 32;

    二、片元着色器(FragmentShader)

    1. 片元着色器的内建变量

    下面的前三个变量都是只读的!!!

    (1). gl_FragCoord : 表示的是片段中的窗口相对坐标。就是片元着色器中,像素点的坐标在屏幕上的一个相对坐标值。

    (2). gl_FrontFacing : bool类型,表示的是你当前渲染的这个图形它是正面的还是背面的,是正面的话,可以得到一个true,如果渲染的是背面的话,可以得到一个false

    (3). gl_PointCoord : 表示我们在使用点精灵的时候,它会给我们返回一个点精灵的坐标。(点精灵就是点图元,因为我们在OpenGL中构成图形的三个基本图元只有点,线,三角形,分别可以叫点精灵,线精灵,三角形精灵)

    (4). gl_FragDepth : 其实这个变量是只写的。表示每一个片元的深度值。就是说,在片元着色器中写入它时,它会覆盖片元的功能深度值。但是我们应该尽量减少手动的写入深度值,因为这样可能会使GPU禁用许多深度值的优化。

    2. 片元着色器的内建常量

    和顶点着色器一样,片元着色器的内建常量也都是const修饰的,不可修改的常量,也都是mediump中精度的int整形常量。

    (1). 片元着色器中的输入变量的最大数量。也就是你给片元着色器设置用来in的变量不能超过15个。
    const mediump int gl_MaxFragmentInputVectors = 15;

    (2). 片元着色器中的纹理单元的最大数量。记得上面的顶点着色器的纹理单元最大数量和Combined的最大数量吗?

    顶点着色器的纹理单元最大数量+片元着色器的纹理单元的最大数量=MaxCombinedTextureUnits

    const mediump int gl_MaxTextureImageUnits = 16;

    (3). 片元着色器中允许单次输入的最大Uniform修饰的变量数量
    const mediump int gl_MaxFragmentUniformVectors = 224;

    (4). 多重渲染最多只支持4个。drawbuffer也就是OpenGL ES要向绘制buffer上绘制图形,也就是可绘制buffer,也就是RT(Render Target)。
    const mediump int gl_MaxDrawBuffers = 4;

    3. 内建函数

    常见的内建函数:

    (1). dot : 点乘

    (2). cross : 叉乘

    (3). texture2D : 用于对纹理的采样。也就是获取纹素。

    (4). normalize : 对一个向量标准化(规格化)。

    (5). clamp : 将一个向量固定在一个范围内,一个最小值和一个最大值之间。超过这个范围的都会取到对应的最小或者最大值。

    其他内建函数如图3.1所示:

    3.1.png

    相关文章

      网友评论

        本文标题:第十七节—GLSL的常见着色器内建变量和内建函数

        本文链接:https://www.haomeiwen.com/subject/bsiepktx.html