版权声明:本文为flycatdeng原创文章或译文,转载请加上链接和作者名 https://blog.csdn.net/flycatdeng
目录
7 内建变量
一些OpenGL ES操作仍然在顶点处理器和片段处理器之间的固定功能中继续发生。在片段处理器之后,其他OpenGL ES操作继续以固定功能发生。 着色器通过使用内置变量与OpenGL ES的固定功能进行通信。
在OpenGL ES中,内置的特殊变量构成了顶点着色器输出的一部分,片段着色器输入的一部分和片段着色器的输出。与用户定义的易变变量不同的是,内置特殊变量在顶点语言和片段语言之间没有严格的一对一对应关系。 相反,提供了两组,每种语言一组。
7.1 顶点着色器特殊变量
变量gl_Position仅在顶点语言中可用,用于写入齐次顶点位置。格式良好的顶点着色器的所有执行都应该将值写入此变量。它可以在着色器执行期间随时写入。在写入之后,着色器也可以回读它。该值将由图元装配,剪切,剔除以及在发生顶点处理后对基元进行操作的其他固定功能操作使用。如果编译器未检测到gl_Position,或者在写入之前读取,则编译器可能会生成诊断消息,但并非所有此类情况都可检测到。如果执行顶点着色器并且不写gl_Position,则gl_Position的值是未定义的(如果为未定义,则不同的芯片会有不同的处理方式,这里需要注意,那在不同的芯片上可能就表现不同了)。
变量gl_PointSize仅在顶点语言中可用,并且仅用于顶点着色器以写入要光栅化的点的大小。它以像素为单位进行测量。
用于与固定功能通信的这些内置顶点着色器变量本质上使用以下类型声明:
highp vec4 gl_Position; // 应该被写入
mediump float gl_PointSize; // 可能被写入
如果未写入任何这些变量,则其值未定义。在写入之后,着色器可以回读它们,以检索写入的内容。在写入它们之前读取它们会导致返回未定义的值。如果它们被写入多次,则它是后续操作所使用的最后写入的值。
这些内置变量具有全局范围。
7.2 片段着色器特殊变量
片段着色器的输出由OpenGL ES管道后端的固定功能操作处理。除非执行discard关键字,否则片段着色器使用内置变量gl_FragColor和gl_FragData将值输出到OpenGL ES管道。
片段着色器不需要写入gl_FragColor或gl_FragData。 有许多算法,例如阴影卷,包括不写入颜色值的渲染过程。
这些变量可以在片段着色器中多次写入。如果是,则分配的最后一个值是在后续固定功能管道中使用的值。写入这些变量的值可以在写入后回读。 在写入这些变量之前从这些变量中读取会导致未定义的值。
写入gl_FragColor指定将由后续固定功能管道使用的片段颜色。如果后续的固定功能使用片段颜色并且片段着色器的执行没有向gl_FragColor写入值,则消耗的片段颜色未定义的。
变量gl_FragData是一个数组。 写入gl_FragData [n]指定将由后续固定功能管道用于数据n的片段数据。如果后续固定功能使用片段数据并且片段着色器的执行不向其写入值,则消耗的片段数据是未定义的。
如果着色器静态为gl_FragColor赋值,则它可能不会为gl_FragData的任何元素赋值。如果着色器静态地将值写入gl_FragData的任何元素,则它可能不会为gl_FragColor赋值。也就是说,着色器可以将值分配给gl_FragColor或gl_FragData,但不能同时分配两者。
(着色器包含对变量x的静态赋值,如果在预处理之后,着色器包含将写入x的语句,则运行时控制流是否会导致执行该语句。)
如果着色器执行discard关键字,则丢弃该片段,并且gl_FragColor和gl_FragData的值变得无关紧要。
变量gl_FragCoord可用作片段着色器中的只读变量,它保存片段的窗口相对坐标x,y,z和1 / w值。此值是固定功能的结果,该功能在顶点处理之后插入基元以生成片段。 z分量是将用于片段深度的深度值。
片段着色器可以访问只读内置变量gl_FrontFacing,如果片段属于前向基元,则其值为true。其中一个用途是通过选择由顶点着色器计算的两种颜色中的一种来模拟双面照明。
片段着色器可以访问只读内置变量gl_PointCoord。gl_PointCoord中的值是二维坐标,指示当前片段位于点基元内的位置。它们的范围从0.0到1.0。 这在OpenGL规范2.0版的3.3.1基本点光栅化中有更详细的描述,其中讨论了点精灵。如果当前基元不是一个点,那么从gl_PointCoord读取的值是未定义的。
可以从片段着色器访问的内置变量本质上是给定的类型,如下所示:
mediump vec4 gl_FragCoord;
bool gl_FrontFacing;
mediump vec4 gl_FragColor;
mediump vec4 gl_FragData[gl_MaxDrawBuffers];
mediump vec2 gl_PointCoord;
但是,它们的行为不像没有存储限定符的变量; 他们的行为如上所述。
这些内置变量具有全局范围。
7.3 顶点着色器内置属性
OpenGL ES中没有内置属性名称。
7.4 内建常量
以下内置常量提供给顶点和片段着色器。
//
// 依赖于实现的常量。 以下示例值是这些最大值们所允许的最小值。
//
const mediump int gl_MaxVertexAttribs = 8;
const mediump int gl_MaxVertexUniformVectors = 128;
const mediump int gl_MaxVaryingVectors = 8;
const mediump int gl_MaxVertexTextureImageUnits = 0;
const mediump int gl_MaxCombinedTextureImageUnits = 8;
const mediump int gl_MaxTextureImageUnits = 8;
const mediump int gl_MaxFragmentUniformVectors = 16;
const mediump int gl_MaxDrawBuffers = 1;
7.5 内置统一状态
作为访问OpenGL ES处理状态的辅助手段,OpenGL ES着色语言中内置了以下统一变量。 所有符号都是对2.0规范的引用。如果实现不支持片段语言中的highp精度,但是状态列为highp,则该状态将仅作为片段语言中的mediump提供。
//
// 窗口坐标的深度范围
//
struct gl_DepthRangeParameters {
highp float near; // n
highp float far; // f
highp float diff; // f - n
};
uniform gl_DepthRangeParameters gl_DepthRange;