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

{

vec4gl_Position;

floatgl_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[];

当采用多重采样渲染时,它会被写入。

GLSL预定义变量的更多相关文章

  1. openGL 预定义变量04

    OpenGL4.0 GLSL预定义变量 GLSL为不同的渲染阶段定义了一些特定的变量.这些预定义(也叫做内置变量)有特定的属性. 所有的预定义变量都以gl_开头.用户定义的变量不能以此开头. 下面分类 ...

  2. PHP预定义变量

    * PHP预定义 * 预定义变量 * $_GET - 接收客户端以请求类型为GET方法发送的数据内容 * $_POST - 接收客户端以请求类型为POST方法发送的数据内容 * $_REQUEST - ...

  3. linux中位置参数变量和预定义变量

    位置参数变量   预定义变量

  4. 深入理解PHP内核(八)变量及数据类型-预定义变量

    原文链接:http://www.orlion.ga/249/ PHP脚本在执行的时候用户全局变量(在用户空间显示定义的变量)会保存在一个HashTable数据类型的符号表中(symbol_table) ...

  5. Paip.最佳实践-- Buildin variale 内建变量 ,魔术变量,预定义变量,系统常量,系统变量 1

    Paip.最佳实践-- Buildin variale 内建变量 ,魔术变量,预定义变量,系统常量,系统变量 1.1.1       C++内建变量(__LINE__).... 1.1.2       ...

  6. PHP学习笔记1.2——预定义变量参考

    预定义变量和用户自定义变量在使用上没有区别,大多数预定义变量的执行结果都是服务器的相关信息(如:版本号.路径.错误参数等),所以我们很少将其用于网站前台开发,如果被别有用心得人知道了后,会严重威胁服务 ...

  7. 预定义变量 - PHP手册笔记

    预定义变量将所有的外部变量表示成内建环境变量,并且将错误信息表示成返回头.超全局变量是在全部作用域中始终可用的内置变量.在函数或方法中无需执行global $variable,就可以访问它们. $GO ...

  8. PHP预定义变量$_SERVER

    PHP预定义变量$_SERVER $_SERVER 是一个包含诸如头部(headers).路径(paths)和脚本位置(script locations)的数组.数组的实体由 web 服务器创建,不能 ...

  9. Shell 变量详解教程之位置变量与预定义变量。

    Shell 变量分为3部分,分别是用户自定义变量.位置变量和预定义变量. 一.   自定义变量 那么,什么是变量呢?简单的说,就是让某一个特定字符串代表不固定的内容,用户定义的变量是最普通的Shell ...

随机推荐

  1. UVa 1452 递推 Jump

    约瑟夫变形,先计算出3个数时,最后三个数字的编号. 然后以这三个数为起点,就可以递推出n个数对应的最后三个数字的编号. 递推公式都是一样的. #include <iostream> #in ...

  2. Freemaker模板指令

    ${...}:Freemaker将会输出真实的值来替换大括号内的表达式.这样的表达式被称为interpolation(插值). FTL标签(Freemaker模板的语言标签):FTL标签和HTML标签 ...

  3. 使用 Scene 类在 XNA 中创建不同的场景(八)

    平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...

  4. python常用方法总结

    1.os模块的路径拼接: import os now_path=os.path.abspath(__file__)#当前运行文件的路径 print(now_path) uppeer_path=os.p ...

  5. 《机器学习实战》笔记——regression

    本章介绍了不同场景下使用的线性回归方法 一般情况:简单的线性回归 欠拟合:局部加权线性回归 特征数大于样本数:岭回归 或 lasso法 最后引出交叉验证,用来定量地找到最佳参数值 # _*_ codi ...

  6. 2018天梯赛第一次训练题解和ac代码

    随着评讲的进行代码和题解会逐步放上来 2018天梯赛第一次训练 1001 : 进制转换 Time Limit(Common/Java):1000MS/10000MS     Memory Limit: ...

  7. ICCID

     ICCID:Integrate circuit card identity 集成电路卡识别码(固化在手机SIM卡中) ICCID为IC卡的唯一识别号码,共有20位数字+英文组成,其编码格式为:XXX ...

  8. 九度oj 题目1482:玛雅人的密码 清华大学机试

    题目描述: 玛雅人有一种密码,如果字符串中出现连续的2012四个数字就能解开密码.给一个长度为N的字符串,(2=<N<=13)该字符串中只含有0,1,2三种数字,问这个字符串要移位几次才能 ...

  9. Python3 的异常处理

    Python3 的异常处理,在官方文档的 tutorial 中有说明. 这里把常用的异常处理方法都列出来,方便平时查找. 捕获异常基类 Python3 要求我们的异常必须继承 Exception 类. ...

  10. 零基础自学用Python 3开发网络爬虫

    原文出处: Jecvay Notes (@Jecvay) 由于本学期好多神都选了Cisco网络课, 而我这等弱渣没选, 去蹭了一节发现讲的内容虽然我不懂但是还是无爱. 我想既然都本科就出来工作还是按照 ...