可以参考下面的版本介绍
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; // 从顶点着色器中传出数据
片段着色器
#version 330 core
out vec4 FragColor;
in vec3 ourColor;
in vec2 TexCoord; // 和顶点着色器中传出的变量的命名不同,因此他的值为0
GLSL中纹理坐标Y方向的原点在顶部,而HLSL中纹理坐标Y方向的原点在底部,所以你需要使用这个公式uv.y = 1 – uv.y 对每个点重新定义纹理坐标
GLSL 允许自定义函数,但参数默认是以值形式(in 限定符)传入的,也就是说任何变量在传入时都会被拷贝一份,若想以引用方式传参,需要增加函数参数限定符。
in
用在函数的参数中,表示这个参数是输入的,在函数中改变这个值,并不会影响对调用的函数产生副作用。(相当于C语言的传值),这个是函数参数默认的修饰符
out
用在函数的参数中,表示该参数是输出参数,值是会改变的。
inout
用在函数的参数,表示这个参数即是输入参数也是输出参数。
下面部分可能由于版本迭代已经被删减了
顶点着色器可用的内置变量
名称 | 类型 | 描述 |
---|---|---|
gl_Color | vec4 | 输入属性-表示顶点的主颜色 对应unity中的mesh.color |
gl_SecondaryColor | vec4 | 输入属性-表示顶点的辅助颜色 |
gl_Normal | vec3 | 输入属性-表示顶点的法线值 |
gl_Vertex | vec4 | 输入属性-表示物体空间的顶点位置 对应unity中的mesh.vertices |
gl_MultiTexCoordn | vec4 | 输入属性-表示顶点的第n个纹理的坐标,这个对应unity的mesh.uv n |
gl_FogCoord | float | 输入属性-表示顶点的雾坐标 |
gl_Position | vec4 | 输出属性-变换后的顶点的位置,用于后面的固定的裁剪等操作。所有的顶点着色器都必须写这个值。 |
gl_ClipVertex | vec4 | 输出坐标,用于用户裁剪平面的裁剪 |
gl_PointSize | float | 点的大小 |
gl_FrontColor | vec4 | 正面的主颜色的varying输出 |
gl_BackColor | vec4 | 背面主颜色的varying输出 |
gl_FrontSecondaryColor | vec4 | 正面的辅助颜色的varying输出 |
gl_BackSecondaryColor | vec4 | 背面的辅助颜色的varying输出 |
gl_TexCoord[] | vec4 | 纹理坐标的数组varying输出 |
gl_FogFragCoord | float | 雾坐标的varying输出 |
片元着色器可用的内置变量
名称 | 类型 | 描述 |
---|---|---|
gl_Color | vec4 | 包含主颜色的插值只读输入 |
gl_SecondaryColor | vec4 | 包含辅助颜色的插值只读输入 |
gl_TexCoord[] | vec4 | 包含纹理坐标数组的插值只读输入 |
gl_FogFragCoord | float | 包含雾坐标的插值只读输入 |
gl_FragCoord | vec4 | 只读输入,窗口的x,y,z和1/w |
gl_FrontFacing | bool | 只读输入,如果是窗口正面图元的一部分,则这个值为true |
gl_PointCoord | vec2 | 点精灵的二维空间坐标范围在(0.0, 0.0)到(1.0, 1.0)之间,仅用于点图元和点精灵开启的情况下。 |
gl_FragData[] | vec4 | 使用glDrawBuffers输出的数据数组。不能与gl_FragColor结合使用。 |
gl_FragColor | vec4 | 输出的颜色用于随后的像素操作 |
gl_FragDepth | float | 输出的深度用于随后的像素操作,如果这个值没有被写,则使用固定功能管线的深度值代替 |
关于宏的名字可以任意取,但是不能和两个内置的宏冲突,分别是 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
GLSL ES 还提供了一个#version
指令来指定着色器使用的GLSL ES的版本,如果不指定GLSL ES的版本,默认指定101,如果你要指定为100版本,在着色器的顶部写下 #version 100
语句,
注意, #version
指令必须写在着色器顶部,在它之前只能有注释和空白
https://registry.khronos.org/OpenGL/specs/gl/GLSLangSpec.1.20.pdf