• 【Unity Shader】GLSL


    GLSL版本

    在这里插入图片描述
    可以参考下面的版本介绍
    https://registry.khronos.org/OpenGL/specs/gl/

    修饰符版本变化

    1.varying
    片段着色器的输入或顶点着色器的输出。(GLSL 1.30 (OpenGL 3.0)废弃,GLSL 1.40及以上移除), 当然webgl中还是使用这个老版本
    新版本中对应使用的的是in/out

    在GLSL中用in修饰的变量表示传入的数据,用out修饰的变量表示传出的数据,通过这样可以实现顶点着色器向片段着色器传递数据,但要注意这个变量的命名要相同,不相同的话,片段着色器是获取不到从顶点着色器传入的数据的。

    顶点着色器

    #version 330 core
    layout (location = 0) in vec3 aPos;
    layout (location = 1) in vec3 aColor;
    layout (location = 2) in vec2 aTexCoord;
     
    out vec3 ourColor;
    out vec2 texCoord;  // 从顶点着色器中传出数据
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    片段着色器

    #version 330 core
    out vec4 FragColor;
     
    in vec3 ourColor;
    in vec2 TexCoord;  // 和顶点着色器中传出的变量的命名不同,因此他的值为0
    
    • 1
    • 2
    • 3
    • 4
    • 5

    GLSL 中纹理坐标问题

    GLSL中纹理坐标Y方向的原点在顶部,而HLSL中纹理坐标Y方向的原点在底部,所以你需要使用这个公式uv.y = 1 – uv.y 对每个点重新定义纹理坐标

    函数参数限定符

    GLSL 允许自定义函数,但参数默认是以值形式(in 限定符)传入的,也就是说任何变量在传入时都会被拷贝一份,若想以引用方式传参,需要增加函数参数限定符。

    in 用在函数的参数中,表示这个参数是输入的,在函数中改变这个值,并不会影响对调用的函数产生副作用。(相当于C语言的传值),这个是函数参数默认的修饰符
    out 用在函数的参数中,表示该参数是输出参数,值是会改变的。
    inout 用在函数的参数,表示这个参数即是输入参数也是输出参数。

    内置变量

    下面部分可能由于版本迭代已经被删减了
    顶点着色器可用的内置变量

    名称类型描述
    gl_Colorvec4输入属性-表示顶点的主颜色 对应unity中的mesh.color
    gl_SecondaryColorvec4输入属性-表示顶点的辅助颜色
    gl_Normalvec3输入属性-表示顶点的法线值
    gl_Vertexvec4输入属性-表示物体空间的顶点位置 对应unity中的mesh.vertices
    gl_MultiTexCoordnvec4输入属性-表示顶点的第n个纹理的坐标,这个对应unity的mesh.uvn
    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/w
    gl_FrontFacingbool只读输入,如果是窗口正面图元的一部分,则这个值为true
    gl_PointCoordvec2点精灵的二维空间坐标范围在(0.0, 0.0)到(1.0, 1.0)之间,仅用于点图元和点精灵开启的情况下。
    gl_FragData[]vec4使用glDrawBuffers输出的数据数组。不能与gl_FragColor结合使用。
    gl_FragColorvec4输出的颜色用于随后的像素操作
    gl_FragDepthfloat输出的深度用于随后的像素操作,如果这个值没有被写,则使用固定功能管线的深度值代替

    宏定义

    关于宏的名字可以任意取,但是不能和两个内置的宏冲突,分别是 GL_ES 和 GL_FRAGMENT_PRECISION_HIGH,GL_ES 在OpenGL ES 2.0 中定义为1,GL_FRAGMENT_PRECISION_HIGH 表示片元着色器支持highp精度
    关于精度限定,来看一个例子

    #ifdef GL_ES
      #ifdef GL_FRAGMENT_PRECISION_HIGH
        precision highp float; //着色器支持高精度,限定浮点类型为高精度
      #else
        precision mediump float; //着色器不支持高精度,限定浮点类型为中精度	
      #endif
    #endif
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    GLSL ES 还提供了一个#version 指令来指定着色器使用的GLSL ES的版本,如果不指定GLSL ES的版本,默认指定101,如果你要指定为100版本,在着色器的顶部写下 #version 100 语句,
    注意, #version指令必须写在着色器顶部,在它之前只能有注释和空白

    参考

    https://registry.khronos.org/OpenGL/specs/gl/GLSLangSpec.1.20.pdf

  • 相关阅读:
    Nginx配置Https证书
    2023探寻室内设计的新趋势与即将流逝的旧潮流
    多线程进阶篇
    基于模糊控制算法的快速反射镜 系统扰动抑制
    LeetCode——662.二叉树最大宽度
    关于python中的装饰器(Decorator)的讲解
    双网并行route设置后有一个变成未识别的网络
    2022年下半年上午易错题(软件设计师考试)
    Mac搭建vue环境
    asp.net乡村旅游管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
  • 原文地址:https://blog.csdn.net/qq_22849251/article/details/126776593