美文网首页
GLSL in Unity 系列文章(二):GLSL数据类型与限

GLSL in Unity 系列文章(二):GLSL数据类型与限

作者: 雄关漫道从头越 | 来源:发表于2020-08-18 20:29 被阅读0次

    GLSL 数据类型和限定符
    《图形编程技术学习》(五十七)GLSL的基本语法

    本节主要介绍GLSL数据类型与限定符的作用,最后会有一个RGB Cube的案例。
    作为计算机语言,肯定少不了数据类型啊,不然怎么编程,GLSL主要有基本数据类型(float,bool,int,unit)、向量(vec)、矩阵(mat)、数组、结构体(Struct)和sampler类型(贴图采样),限定符是指变量前的修饰符,类似public、private以及const之类的修饰符,主要是告诉编译器变量的特定访问范围和功能。好了,下面我们就一一列出来。

    一、数据类型与限定符

    1.基本数据类型

    名称 类型
    float 浮点型
    int 整型
    uint 无符号整型
    bool 布尔型

    2.矢量

    名称 类型 说明
    vec2 2维浮点型矢量 支持vec2.xy或vec2.rg访问
    vec3 3维浮点型矢量 支持vec3.xyz或vec3.rgb访问
    vec4 4维浮点型矢量 支持vec4.xyzw或vec4.rgba访问
    ivec2 2维整型矢量
    ivec3 3维整型矢量
    ivec4 4维整型矢量
    uvec2 2维无符号整型矢量
    uvec3 3维无符号整型矢量
    uvec4 4维无符号整型矢量
    bvec2 2维布尔型矢量
    bvec3 3维布尔型矢量
    bvec4 4维布尔型矢量

    3.矩阵

    名称 类型 说明
    mat2 2x2矩阵 mat(1.0,2.0,3.0,4.0);
    mat3 3x3矩阵 mat3(1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0);
    mat4 4x4矩阵 matrix[2,2],访问第二行第二列

    4.数组

    只支持一维数组,下标不能为负
    float a[10];或float[10] a;

    5.结构体

    struct dirlight
    {
       vec3 direction;
       vec3 color;
    };
    dirlight light;
    

    6.sampler类型

    名称 类型
    sampler1D for 1D textures
    sampler2D for 2D textures
    sampler3D for 3D textures
    samplerCube for cube map textures
    sampler1DShadow for shadow maps
    sampler2DShadow for shadow maps

    sampler类型的使用

    uniform sampler2D brickTex;
    vec4 texel = texture2D(brickTex,gl_TexCoord[0].st);
    

    7.限定符

    名称 类型 说明
    属性变量 attribute 1)只在顶点着色器中使用。2)一般用于表示顶点坐标、纹理坐标等。3)使用bindAttributeLocation来设置变量在着色器程序中参数列表的索引。4)使用glVertexAttribPointer来设置attribute的数值。
    一致变量 uniform 1)uniform是由外部程序传递给顶点着色器和片元着色器的变量。2)当顶点着色器和片元着色器声明了一个完全一样的unifrom变量,则两者都可以访问到数据,但不能修改,相当于只读全局变量。3)一般情况下用于表示材质数据。
    易变变量 varing 1)用于顶点着色器和片元着色器之间传递的变量。2)由顶点着色器赋值,片元着色器只读。3)二者的声明必须完全一致,外部程序不能使用该变量。
    常量 const 限定为const的变量是编译时常量。这些变量在声明它们的着色器外部是不可见的。
    输入形参 in VS中为输入的顶点属性
    输出形参 out VS中输出的顶点属性

    二、RGB Cube

    RGB Cube

    GLSL 代码:

    Shader "GLSL/GLSL RGB Cube"
    {
        SubShader
        {
            Pass
            {
                GLSLPROGRAM
                #ifdef VERTEX // here begins the vertex shader
                //varying变量是vertex和fragment shader之间做数据传递用的
                varying vec4 color;
                // this is a varying variable in the vertex shader
                void main()
                {
                    //cube是以1为边长的正方体,所以顶点的xyz取值范围为[-0.5,0.5],
                    //分别加上0.5,将取值范围转换到[0,1],正好是颜色RGB每个通道的取值范围
                    color = gl_Vertex + vec4(0.5, 0.5, 0.5, 0.0);
                    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
                }
                #endif // here ends the vertex shader
    
                #ifdef FRAGMENT // here begins the fragment shader
                varying vec4 color;
                // this is a varying variable in the fragment shader
                void main()
                {
                    //使用cube对象空间的顶点坐标的xyz值作为颜色rgb输出
                    gl_FragColor = color;
                }
                #endif // here ends the fragment shader
                ENDGLSL
            }
        }
    }
    

    github:https://github.com/eangulee/GLSLInUnity.git

    相关文章

      网友评论

          本文标题:GLSL in Unity 系列文章(二):GLSL数据类型与限

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