内置变量
顶点着色器内置常量
1.const mediump int gl_MaxVertexAttribs>=8
gl_MaxVertexAttribs 表示在vertex shader(顶点着色器)中可用的最大attributes数。
这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 8 个。
2.const mediump int gl_MaxVertexUniformVectors >= 128
gl_MaxVertexUniformVectors 表示在vertex shader(顶点着色器)中可用的最大uniform vectors数。
这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 128 个。
3.const mediump int gl_MaxVaryingVectors >= 8
gl_MaxVaryingVectors 表示在vertex shader(顶点着色器)中可用的最大varying vectors数。
这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 8 个。
4.const mediump int gl_MaxVertexTextureImageUnits >= 0
gl_MaxVaryingVectors 表示在vertex shader(顶点着色器)中可用的最大纹理单元数(贴图)。
这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 甚至可以一个都没有(无法获取顶点纹理)
5.const mediump int gl_MaxCombinedTextureImageUnits >= 8
gl_MaxVaryingVectors 表示在 vertex Shader和fragment Shader总共最多支持多少个纹理单元。
这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 8 个。
片元着色内置常量
1.const mediump int gl_MaxTextureImageUnits >= 8。
gl_MaxVaryingVectors 表示在 fragment Shader(片元着色器)中能访问的最大纹理单元数,这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 8 个。
2.const mediump int gl_MaxFragmentUniformVectors >= 16。
gl_MaxFragmentUniformVectors 表示在 fragment Shader(片元着色器)中可用的最大uniform vectors数,这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 16 个。
3.const mediump int gl_MaxDrawBuffers = 1。
gl_MaxDrawBuffers 表示可用的drawBuffers数,在OpenGL ES 2.0中这个值为1, 在将来的版本可能会有所变化。
glsl中还有一种内置的uniform状态变量, gl_DepthRange 它用来表明全局深度范围。
顶点着色器的内置变量
名称 | 类型 | 描述 |
---|---|---|
gl_Color | vec4 | 输入属性,表示顶点的主颜色 |
gl_SecondaryColor | vec4 | 输入属性,表示顶点的辅助颜色 |
gl_Normal | vec3 | 输入属性,表示顶点的法线值 |
gl_Vertex | vec4 | 输入属性,表示物体空间的顶点位置 |
gl_MultiTexCoordn | vec4 | 输入属性,表示顶点的第n个纹理的坐标 |
gl_FogCoord | vec4 | 输入属性,表示顶点的雾坐标 |
gl_Position | vec4 | 输出属性,变换后的顶点位置,用于后面的固定的裁剪等操作。所有的顶点着色器都必须写这个值 |
gl_ClipVertex | vec4 | 输出坐标,用于用户裁剪平面的裁剪 |
gl_PointSize | float | 点的大小(默认值1,通常设置绘图为点绘制才有意义) |
gl_FrontColor | vec4 | 正面主颜色的 varing 输出 |
gl_BackColor | vec4 | 背面主演色的 varing 输出 |
gl_FrontSecondaryColor | vec4 | 正面辅助颜色的 varing 输出 |
gl_BackSecondaryColor | vec4 | 背面辅助颜色的 varing 输出 |
gl_TextCoord[] | vec4 | 纹理坐标的数组 varing 输出 |
gl_FogFragCoord | float | 雾坐标的 varing 输出 |
gl_ModelViewProjectMatrix | Mat4 | 模型视图变换矩阵 |
gl_ProjectMatrix | Mat4 | 投影矩阵 |
gl_ModelViewProjectMatrix | Mat4 | 模型视图投影变换矩阵 |
gl_NormalMatrix | Mat4 | 法向量变换到视空间矩阵 |
gl_TextureMatrix[gl_MatTextureCoords] | Mat4 | 各纹理变换矩阵 |
片元着色器内置变量
名称 | 类型 | 描述 |
---|---|---|
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 | 输出的深度用于随后的像素操作,如果这个值没有被写,则使用固定功能管线的深度值代替 |
示例1:
attribute vec4 gl_Color; // 顶点颜色
attribute vec4 gl_SecondaryColor; // 辅助顶点颜色
attribute vec3 gl_Normal; // 顶点法线
attribute vec4 gl_Vertex; // 顶点物体空间坐标(未变换)
attribute vec4 gl_MultiTexCoord[0-N]; // 顶点纹理坐标(N = gl_MaxTextureCoords)
attribute float gl_FogCoord; // 顶点雾坐标
//OpenGL将光源的方向保存在视点空间坐标系内,因此需要把法线也变换到视点空间。
vec4 normal = gl_NormalMatrix * gl_Normal;
//求取顶点变换到相机空间的位置
vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;
//用于向片元着色器传递纹理坐标
vec2 Texcoord = gl_MultiTexCoord0.xy;
//片元着色器中的纹理采样器
uniform sampler2D decal;
//获取纹理颜色
vec4 color = texture2D(decal, Texcoord);
attribute vec4 gl_Color; // 顶点颜色
attribute vec4 gl_SecondaryColor; // 辅助顶点颜色
attribute vec3 gl_Normal; // 顶点法线
attribute vec4 gl_Vertex; // 顶点物体空间坐标(未变换)
attribute vec4 gl_MultiTexCoord[0-N]; // 顶点纹理坐标(N = gl_MaxTextureCoords)
attribute float gl_FogCoord; // 顶点雾坐标
//OpenGL将光源的方向保存在视点空间坐标系内,因此需要把法线也变换到视点空间。
vec4 normal = gl_NormalMatrix * gl_Normal;
//求取顶点变换到相机空间的位置
vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;
//用于向片元着色器传递纹理坐标
vec2 Texcoord = gl_MultiTexCoord0.xy;
//片元着色器中的纹理采样器
uniform sampler2D decal;
//获取纹理颜色
vec4 color = texture2D(decal, Texcoord);
示例2:
// 矩阵状态
uniform mat4 gl_ModelViewMatrix; // 模型视图变换矩阵
uniform mat4 gl_ProjectMatrix; // 投影矩阵
uniform mat4 gl_ModelViewProjectMatrix; // 模型视图投影变换矩阵(ftransform())
uniform mat3 gl_NormalMatrix; // 法向量变换到视空间矩阵
uniform mat4 gl_TextureMatrix[gl_MatTextureCoords]; // 各纹理变换矩阵
// 法线专用缩放因子
uniform float gl_NormalScale; //示例:normal = noraml * gl_NormalScale;
// 窗口坐标中深度范围
struct gl_DepthRangeParameters
{
float near; //*剪切*面
float far; //远剪切*面
float diff; //进剪切*面到远剪切*面的距离差
};
uniform gl_DepthRangeParameters gl_DepthRange;
// 裁剪*面
uniform vec4 gl_ClipPlane[gl_MaxClipPlanes];
// 点属性
struct gl_PointParameters
{
float size;
float sizeMin;
float sizeMax;
float fadeThresholdSize;
float distanceConstantAttenuation;
float distanceLinearAttenuation;
float distanceQuadraticAttenuation;
};
uniform gl_PointParameters gl_Point;
// 材质,对应于OSG中的Material类,下述参数由该类的函数传入
struct gl_MaterialParameters
{
vec4 emission; //自身发出的光
vec4 ambient; //对环境光的反射能力
vec4 diffuse; //对散射光的反射能力
vec4 specular; //对镜面光的反射能力
float shininess; //镜面指数,示例:float spec = pow(max(dot(eyeVec, reflectVec), 0.0), shininess);
//镜面指数越大,镜面反射光越强,散射程度越小,高光点就越集中。
};
// 正面材质
uniform gl_MaterialParameters gl_FrontMaterial;
// 反面材质
uniform gl_MaterialParameters gl_BackMaterial;
// 光源性质,对应于OSG中的Light类,下述参数由该类的函数传入
struct gl_LightSourceParameters
{
vec4 ambient; //环境光的颜色
vec4 diffuse; //散射光的颜色,反映了在场景中光源对RGBA各成分的散射能力
vec4 specular; //镜面反射光的颜色,它直接影响着材质上高光的颜色,通常为白色或灰色
vec4 position; //光源在场景中的放置位置
vec4 halfVector; //半角向量,示例:halfVector = normalize(单位入射向量 + 单位观察者向量);
vec3 spotDirection; //聚光灯方向,表示圆锥体的轴
float spotExponent; //聚光指数,表示从圆锥的中心轴向外表面变化时光强度的衰减
float spotCutoff; //聚光灯的切角,取值范围为[0.0, 90.0]和180,光锥的角度为为此角的2倍
float spotCosCutoff; //为上个量的cos值,取值范围为[1.0, 0.0]和-1.0
float constantAttenuation; //常量衰减因子
float linearAttenuation; //线性衰减因子
float quadraticAttenuation; //二次衰减因子
//示例:attenuation = 1.0 / (gl_LightSource[0].constantAttenuation +
//gl_LightSource[0].linearAttenuation * d + gl_LightSource[0].quadraticAttenuation * d * d);
};
uniform gl_LightSourceParameters gl_LightSource[gl_MaxLights];
struct gl_LightModelParameters
{
vec4 ambient; //整个场景的环境光的RGBA强度
};
uniform gl_LightModelParameters gl_LightModel;
// 光照和材质的派生状态
struct gl_LightModelProducts
{
vec4 sceneColor; //等于gl_FrontMaterial.emission + gl_FrontMaterial.ambient * gl_LightModel.ambient;
};
uniform gl_LightModelProducts gl_FrontLightModelProduct;
uniform gl_LightModelProducts gl_BackLightModelProduct;
struct gl_LightProducts
{
vec4 ambient; //等于gl_FrontMaterial.ambient * gl_LightSource[0].ambient
vec4 diffuse; //等于gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse
vec4 specular; //等于gl_FrontMaterial.specular * gl_LightSource[0].specular
};
uniform gl_LightProducts gl_FrontLightProduct[gl_MaxLights];
uniform gl_LightProducts gl_BackLightProduct[gl_MaxLights];
// 纹理环境和生成
unifrom vec4 gl_TextureEnvColor[gl_MaxTextureImageUnits];
unifrom vec4 gl_EyePlaneS[gl_MaxTextureCoords];
unifrom vec4 gl_EyePlaneT[gl_MaxTextureCoords];
unifrom vec4 gl_EyePlaneR[gl_MaxTextureCoords];
unifrom vec4 gl_EyePlaneQ[gl_MaxTextureCoords];
unifrom vec4 gl_ObjectPlaneS[gl_MaxTextureCoords];
unifrom vec4 gl_ObjectPlaneT[gl_MaxTextureCoords];
unifrom vec4 gl_ObjectPlaneR[gl_MaxTextureCoords];
unifrom vec4 gl_ObjectPlaneQ[gl_MaxTextureCoords];
// 雾参数,对应于OSG的Fog类,下述参数由该类的函数传入
struct gl_FogParameters
{
vec4 color;
float density;
float start;
float end;
float scale; // 1/(end-start)
};
uniform gl_FogParameters gl_Fog;
// 矩阵状态
uniform mat4 gl_ModelViewMatrix; // 模型视图变换矩阵
uniform mat4 gl_ProjectMatrix; // 投影矩阵
uniform mat4 gl_ModelViewProjectMatrix; // 模型视图投影变换矩阵(ftransform())
uniform mat3 gl_NormalMatrix; // 法向量变换到视空间矩阵
uniform mat4 gl_TextureMatrix[gl_MatTextureCoords]; // 各纹理变换矩阵
// 法线专用缩放因子
uniform float gl_NormalScale; //示例:normal = noraml * gl_NormalScale;
// 窗口坐标中深度范围
struct gl_DepthRangeParameters
{
float near; //*剪切*面
float far; //远剪切*面
float diff; //进剪切*面到远剪切*面的距离差
};
uniform gl_DepthRangeParameters gl_DepthRange;
// 裁剪*面
uniform vec4 gl_ClipPlane[gl_MaxClipPlanes];
// 点属性
struct gl_PointParameters
{
float size;
float sizeMin;
float sizeMax;
float fadeThresholdSize;
float distanceConstantAttenuation;
float distanceLinearAttenuation;
float distanceQuadraticAttenuation;
};
uniform gl_PointParameters gl_Point;
// 材质,对应于OSG中的Material类,下述参数由该类的函数传入
struct gl_MaterialParameters
{
vec4 emission; //自身发出的光
vec4 ambient; //对环境光的反射能力
vec4 diffuse; //对散射光的反射能力
vec4 specular; //对镜面光的反射能力
float shininess; //镜面指数,示例:float spec = pow(max(dot(eyeVec, reflectVec), 0.0), shininess);
//镜面指数越大,镜面反射光越强,散射程度越小,高光点就越集中。
};
// 正面材质
uniform gl_MaterialParameters gl_FrontMaterial;
// 反面材质
uniform gl_MaterialParameters gl_BackMaterial;
// 光源性质,对应于OSG中的Light类,下述参数由该类的函数传入
struct gl_LightSourceParameters
{
vec4 ambient; //环境光的颜色
vec4 diffuse; //散射光的颜色,反映了在场景中光源对RGBA各成分的散射能力
vec4 specular; //镜面反射光的颜色,它直接影响着材质上高光的颜色,通常为白色或灰色
vec4 position; //光源在场景中的放置位置
vec4 halfVector; //半角向量,示例:halfVector = normalize(单位入射向量 + 单位观察者向量);
vec3 spotDirection; //聚光灯方向,表示圆锥体的轴
float spotExponent; //聚光指数,表示从圆锥的中心轴向外表面变化时光强度的衰减
float spotCutoff; //聚光灯的切角,取值范围为[0.0, 90.0]和180,光锥的角度为为此角的2倍
float spotCosCutoff; //为上个量的cos值,取值范围为[1.0, 0.0]和-1.0
float constantAttenuation; //常量衰减因子
float linearAttenuation; //线性衰减因子
float quadraticAttenuation; //二次衰减因子
//示例:attenuation = 1.0 / (gl_LightSource[0].constantAttenuation +
//gl_LightSource[0].linearAttenuation * d + gl_LightSource[0].quadraticAttenuation * d * d);
};
uniform gl_LightSourceParameters gl_LightSource[gl_MaxLights];
struct gl_LightModelParameters
{
vec4 ambient; //整个场景的环境光的RGBA强度
};
uniform gl_LightModelParameters gl_LightModel;
// 光照和材质的派生状态
struct gl_LightModelProducts
{
vec4 sceneColor; //等于gl_FrontMaterial.emission + gl_FrontMaterial.ambient * gl_LightModel.ambient;
};
uniform gl_LightModelProducts gl_FrontLightModelProduct;
uniform gl_LightModelProducts gl_BackLightModelProduct;
struct gl_LightProducts
{
vec4 ambient; //等于gl_FrontMaterial.ambient * gl_LightSource[0].ambient
vec4 diffuse; //等于gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse
vec4 specular; //等于gl_FrontMaterial.specular * gl_LightSource[0].specular
};
uniform gl_LightProducts gl_FrontLightProduct[gl_MaxLights];
uniform gl_LightProducts gl_BackLightProduct[gl_MaxLights];
// 纹理环境和生成
unifrom vec4 gl_TextureEnvColor[gl_MaxTextureImageUnits];
unifrom vec4 gl_EyePlaneS[gl_MaxTextureCoords];
unifrom vec4 gl_EyePlaneT[gl_MaxTextureCoords];
unifrom vec4 gl_EyePlaneR[gl_MaxTextureCoords];
unifrom vec4 gl_EyePlaneQ[gl_MaxTextureCoords];
unifrom vec4 gl_ObjectPlaneS[gl_MaxTextureCoords];
unifrom vec4 gl_ObjectPlaneT[gl_MaxTextureCoords];
unifrom vec4 gl_ObjectPlaneR[gl_MaxTextureCoords];
unifrom vec4 gl_ObjectPlaneQ[gl_MaxTextureCoords];
// 雾参数,对应于OSG的Fog类,下述参数由该类的函数传入
struct gl_FogParameters
{
vec4 color;
float density;
float start;
float end;
float scale; // 1/(end-start)
};
uniform gl_FogParameters gl_Fog;