美文网首页OpenGL
0011--GLSL语言学习(一)

0011--GLSL语言学习(一)

作者: 清风烈酒2157 | 来源:发表于2020-07-29 10:54 被阅读0次

    前言

    OpenGL ES 的渲染管线包含有一个可编程的顶点阶段的一个可编程的片段阶段。其余的阶段则有固定的功能,应用程序对其行为的控制非常有限。每个可编程阶段中编译单元的集合组成了一个着色器。在OpenGL ES 中,每个着色器只支持一个编译单元。着色程序则是一整套编译好并链接在一起的着色器的集合。着色器 shader 的编写需要使用着色语言 GL Shader Language(GLSL)GLSL 的语法与 C语言很类似.

    • 着色器架构
    image.png

    规则

    习惯上,我们一般把顶点着色器命名为 xx.vsh,片段着色器命名为 xx.fsh

    文件中尽量少使用汉字注释防止编译错误.

    GLSL 写出的着色器:

    • 变量 position
    • 变量类型 vec4
    • 限定符 attribute
    • main 函数
    • 基本赋值语句 colorVarying = color
    • 内置变量 gl_Position

    一个简单顶点着色器和片元着色器代码

    .vsh
    
    attribute vec4 position;
    attribute vec4 color;
    varying vec4 colorVarying;
    vec4 myVec4 = vec4(1.0);
    void main(void){
        colorVarying = color;
        gl_Position = position;
    }
    
    .fsh
    
    varying lowp vec4 colorVarying;
    void main (void){
        gl_FragColor = colorVarying;
    }
    
    
    

    gl_Position:顶点着色器的输出属性-变换后的顶点的位置,用于后面的固定的裁剪等操作。所有的顶点着色器都必须写这个值。在顶点着色器中必须要设置

    gl_FragColor:片元着色器中的输出属性-每个像素点的颜色值。在片元着色器中必须要设置

    变量

    • 变量及变量类型
    变量类别 变量类型 描述
    void 用于无返回值的函数或空的参数列表
    标量 float, int, bool 浮点型,整型,布尔型的标量数据类型
    浮点型向量 float, vec2, vec3, vec4 包含1,2,3,4个元素的浮点型向量
    整数型向量 int, ivec2, ivec3, ivec4 包含1,2,3,4个元素的整型向量
    布尔型向量 bool, bvec2, bvec3, bvec4 包含1,2,3,4个元素的布尔型向量
    矩阵 mat2, mat3, mat4 尺寸为2x2,3x3,4x4的浮点型矩阵
    纹理句柄 sampler2D, samplerCube 表示2D,立方体纹理的句柄

    GLSL中没有指针类型.

    • 变量构造器和类型转换

    对于变量运算,GLSL中有非常严格的规则,即只有类型一致时,变量才能完成赋值或其它对应的操作。可以通过对应的构造器来实现类型转换

    标量

    标量对应 C语言的基础数据类型,它的构造和C语言一致,如下:

    float myfloat = 1.0;
    float mybool = true;
    float myfloat = float(mybool);
    float mybool = bool(myfloat);
    

    向量

    构造向量时,向量构造器中的各参数将会被转换成相同的类型(浮点型整型布尔型)。往向量构造器中传递参数有两种形式:

    • 如果向量构造器中只提供了一个标量参数,则向量中所有值都会设定为该标量值
    • 如果提供了多个标量值或提供了向量参数,则会从左至右使用提供的参数来给向量赋值,如果使用多个标量来赋值,则需要确保标量的个数要多于向量构造器中的个数。

    向量构造器用法如下:

    vec4 myVec4 = vec4(1.0); // myVec4 = {1.0, 1.0, 1.0, 1.0}
    vec3 myVec3 = vec3(1.0,0.0,0.5); //myVec3 = {1.0, 0.0, 0.5}
    vec3 temp = vec3(myVec3); // temp =myVec3= {1.0, 0.0, 0.5}
    
    vec2 myVec2 = vec2(myVec3);//myVec2 = {myVec3.x, myVec3.y}
    myVec4 = vec4(myVec2,temp,0.0); //myVec4 = {myVec2.x, myVec2.y , temp, 0.0 }
    
    

    矩阵

    矩阵数据类型:

    image.png

    注:一般使用3x3、4x4的方阵 – mat3、mat4

    修饰符

    修饰符:

    image.png

    相关文章

      网友评论

        本文标题:0011--GLSL语言学习(一)

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