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

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

------------------------------------------------------

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

  1. GLSL预定义变量

    GLSL为不同的渲染阶段定义了一些特定的变量.这些预定义(也叫做内置变量)有特定的属性.所有的预定义变量都以gl_开头.用户定义的变量不能以此开头. 下面分类进行介绍. (1)顶点着色器输入 in i ...

  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. Mac下git安装(使用Xcode)

    (不使用Xcode的出门右转百度其他方法:比如直接安装git软件包.) 一.AppStore 最安全途径:搜索下载Xcode,(需要AppleID). 其他:直接百度Xcode下载. 二.Xcode ...

  2. The tag handler class for "home.jsp" (org.apache.taglibs.standard.tag.rt.core.ForEachTag) was not found on the Java Build Path

    web.xml中 listener,filter,servlet需按顺序. <listener> <listener-class>listener.VisitCountList ...

  3. CodeForces 444C 线段树

    想分块想了很久一点思路都没有,结果一看都是写的线段树= = ...完全忘记了还有线段树这种操作 题意:给一个数组,一种操作是改变l到r为c,还有一种操作是查询l到r的总和差 线段树记得+lazy标记 ...

  4. javascript ArrayBuffer类型化数组和视图的操作

    个人理解类型化数据就是内存分配区域,不同数据的存储就是视图DataView咯 var buffers = []; var json = {"id":100, "name& ...

  5. Java_脚本引擎_01_用法入门

    一.前言 最近有个需求,需要在js中调用java,这样能避免更新java,从而实现代码的热更新. 于是想到用 Nashorn JavaScript 引擎. 二.概述 通过 JDK 8 的 Nashor ...

  6. LeetCode OJ:Sort Colors(排序颜色)

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  7. 【SQL查询】查询的值为空时,给出默认值_NVL函数

    格式为: NVL( string1, replace_with) 功能:如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值. 引申一下,此NVL的作 ...

  8. 幸运数字(数位dp)

    个人心得:数位dp处理起来是真的麻烦,本来动态规划就够头疼的了,菜的一批. 来看这个题目吧,题目在下面. 把题目变成可以求得就是求前n个数中1-n*9的情况的总和,所以用dp[i][j],表示前i个数 ...

  9. BZOJ3262:陌上花开

    浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...

  10. Centos下安装禅道

    1.下载禅道安装包:http://dl.cnezsoft.com/zentao/9.7/ZenTaoPMS.9.7.stable.zbox_64.tar.gz 2.将下载的压缩包解压到/opt目录下: ...