Skip to content

内置变量

顶点着色器内置常量

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_Colorvec4输入属性,表示顶点的主颜色
gl_SecondaryColorvec4输入属性,表示顶点的辅助颜色
gl_Normalvec3输入属性,表示顶点的法线值
gl_Vertexvec4输入属性,表示物体空间的顶点位置
gl_MultiTexCoordnvec4输入属性,表示顶点的第n个纹理的坐标
gl_FogCoordvec4输入属性,表示顶点的雾坐标
gl_Positionvec4输出属性,变换后的顶点位置,用于后面的固定的裁剪等操作。所有的顶点着色器都必须写这个值
gl_ClipVertexvec4输出坐标,用于用户裁剪平面的裁剪
gl_PointSizefloat点的大小(默认值1,通常设置绘图为点绘制才有意义)
gl_FrontColorvec4正面主颜色的 varing 输出
gl_BackColorvec4背面主演色的 varing 输出
gl_FrontSecondaryColorvec4正面辅助颜色的 varing 输出
gl_BackSecondaryColorvec4背面辅助颜色的 varing 输出
gl_TextCoord[]vec4纹理坐标的数组 varing 输出
gl_FogFragCoordfloat雾坐标的 varing 输出
gl_ModelViewProjectMatrixMat4模型视图变换矩阵
gl_ProjectMatrixMat4投影矩阵
gl_ModelViewProjectMatrixMat4模型视图投影变换矩阵
gl_NormalMatrixMat4法向量变换到视空间矩阵
gl_TextureMatrix[gl_MatTextureCoords]Mat4各纹理变换矩阵

片元着色器内置变量

名称类型描述
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输出的深度用于随后的像素操作,如果这个值没有被写,则使用固定功能管线的深度值代替

示例1

GLSL
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

GLSL
// 矩阵状态
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;

Open GL内置变量

传送门