OpenGL4.0 GLSL预定义变量
GLSL为不同的渲染阶段定义了一些特定的变量。这些预定义(也叫做内置变量)有特定的属性。
所有的预定义变量都以gl_开头。用户定义的变量不能以此开头。
下面分类进行介绍。
(1)顶点着色器输入
in int gl_VertexID; in int gl_InstanceID;
gl_VertexID是当前被处理的顶点的索引。对于array rendering,它是当前顶点在数组中的索引;对于indexed rendering,它是从element buffer中获取的索引值。
gl_InstanceID指出了当前被渲染的instance,当使用instancedrendering的时候。
(2)顶点着色器输出
out gl_PerVertex { vec4 gl_Position; float gl_PointSize; float gl_ClipDistance[]; }
为输出定义了一个block接口。
gl_Position是当前顶点的输出坐标(如果没有几何着色器,是在clip-space)。指定这个值并不是必须的。但是不指定可能会导致意想不到的结果。如果你使用转换反馈或者是关闭了光栅化,或者是使用采用用户定义输出产生坐标的几何着色器,则可以忽略指定这个值。
gl_PointSize指定了点的宽度和高度。只有在绘制点的时候指定它的值才是必须的。
gl_ClipDistance允许着色器设置一个顶点到每个剪切平面的距离。正值表示顶点在剪切平面的里面(后面),而负值表示在剪切平面的外面(前面)。
(3)几何着色器输入
in gl_PerVertex { vec4 gl_Position; float gl_PointSize; float gl_ClipDistance[]; } gl_in[]; in int gl_PrimitiveIDIn;
gl_PerVertex包含了从前面的顶点着色器传送过来的值。
注意:在几何着色器中,他们有前缀gl_in,是一个block的数组。这个数组的大小依赖于用于这个几何着色器的输入的layout关键词。用户不用以一个特定的大小重新声明这个block,系统会自动完成。可以用函数length()获得其大小。
gl_PrimitiveIDIn是在这次渲染过程中的图元数量,即先前被glDraw()调用所处理的图元数量。
GLSL4.00及其以上版本还有以下定义:
in int gl_InvocationID;
几何着色器可以被调用多次,这个值指定了当前调用。
(4)几何着色器输出
out gl_PerVertex { vec4 gl_Position; float gl_PointSize; float gl_ClipDistance[]; }; out int gl_PrimitiveID; out int gl_Layer;
gl_PerVertex和顶点着色器阶段有相同的意义。
gl_PrimitiveID是图元的用户定义标识符。它直接被传送到片断着色器。如果片断着色器使用了它的相关输入但是几何着色器又没有指定它的值,那么它的值就是预定义的(如果没有几何着色器OpenGL会自动生成)。
gl_Layer用于渲染到layeredframebuffer objects,指定了特定图元要被渲染到的layer。
GLSL4.10还定义了如下输出:
out int gl_ViewportIndex;
它代表了当前图元要被采用得视口变换了裁剪测试。使用和gl_Layer类似。
(5)片断着色器输入
in vec4 gl_FragCoord; in bool gl_FrontFacing; in float gl_ClipDistance[]; in vec2 gl_PointCoord; in int gl_PrimitiveID;
gl_FragCoord包含了当前片断的window-space坐标。如果入户没重载它,其Z分量是要写入到深度缓冲区的。其W分量是1/Wclip(Wclip是顶点或几何着色器的输出gl_Position的W分量)
gl_FrontFacing:如果图元从其前面观看,则为真,否则为假。
gl_ClipDistance包含了顶点着色器的输出,不过是依据图元进行线性插值后的。
gl_PointCoord:点内部的位置,指定了片断的位置。它是被归一化了的值,位于[0,1]。(0,0)原点位置依赖于OpenGL的点坐标设置,默认是在左下角。
gl_PrimitiveID是几何着色器的输出,如果没有使用几何着色器,由OpenGL产生。代表了被光栅化的图元索引。
GLSL4.00增加了一下输入:
in int gl_SampleID; in vec2 gl_SamplePosition; in int gl_SampleMaskIn[];
指定了像素区域sample的一些属性。
(6)片断着色器全局变量
struct gl_DepthRangeParameters { float near; float far; float diff; }; uniform gl_DepthRangeParameters gl_DepthRange;
这个struct提供了对glDepthRange近、远值的访问。diff等于far和near的差。
(7)片断着色器输出
out float gl_FragDepth;
它是要被写入到深度缓冲区的值。也将被用于深度测试。片断着色器不一定要指定它的值。它可能被gl_FragCoord.z.自动填充。需要注意的是:如果在某处指定,在其他地方也必须要进行指定。
GLSL4.00增加了如下输出:
out int gl_SampleMask[];
当采用多重采样渲染时,它会被写入。
------------------------------------------------------