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. Linux学习-Linux的账号与群组

    使用者识别码: UID 与 GID Linux 主机并不会直接认识 你的"帐号名称"的,他仅认识 ID 啊 (ID 就是一组号码啦). 由于计算机仅认识 0 与 1,所 以主机对于 ...

  2. Windows下新建多级文件夹

    使用system函数调用系统命令"md" 注意:字符串变量的话赋值时要使用双斜杠"\\": system("md C:\\newfolder\\&qu ...

  3. alex 推荐的书

     这两本书不错, 追风筝的人<白鹿原>~~~反天不错~~~可以看下.14:27:22AndyZhang 2018-1-29 14:27:22 改变人的东西  读书.看电影.旅行.经历各种事 ...

  4. 换一种思维看待PHP VS Node.js

    php和javascript都是非常流行的编程语言,刚刚开始一个服务于服务端,一个服务于前端,长久以来,它们都能够和睦相处,直到有一天,一个叫做node.js的JavaScript运行环境诞生后,再加 ...

  5. 项目报错 java lang illegalargumentexception error at 0 can t find referenced pointcut

    出现error at ::0 can't find referenced pointcut...这样的错误原因是:如果你用的JDK版本是1.6的话,而引用的aspectjrt.jar是spring-2 ...

  6. iOS学习笔记25-录音和网络流媒体

    .录音 AVFoundation框架还有一个AVAudioRecorder类专门处理录音操作,它同样支持多种音频格式. 先来了解下AVAudioRecorder的常用属性: @property (re ...

  7. python调用C/C++动态链接库和jython

    总结(非原创) Python调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可. 1. C语言文件:pycall.c #include <stdio.h> ...

  8. HDU——1596find the safest road(邻接矩阵+优先队列SPFA)

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  9. [LOJ#114]k 大异或和

    [LOJ#114]k 大异或和 试题描述 这是一道模板题. 给由 n 个数组成的一个可重集 S,每次给定一个数 k,求一个集合 T⊆S,使得集合 T 在 S 的所有非空子集的不同的异或和中,其异或和  ...

  10. iOS-多线程(2)

    多线程之NSOperation: 多线程的优点: 使用线程可以把占据时间长的程序中的任务呀放到后台去处理 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显 ...