GLSL语言内置的变量详解
GLSL语言内置的变量,包括内置的顶点属性(attribute)、一致变量(uniform)、易变变量(varying)以及常量(const),一方面加深印象,另一方面今天的文章可以为以后的编程做查询之用。
顶点属性—— 指顶点的信息,OpenGL据此绘制各个图元,对于传统的顶点属性包括坐标、纹理坐标、颜色等GLSL都会设置一个内置变量与之对应,以便在需要时可以在 顶点或片元着色器中直接引用,这也体现了GLSL与HLSL的一个最大的不同,HLSL里顶点的属性是通过语义来定义的,而GLSL充分考虑了 OpenGL是个状态机这一事实,将顶点属性设为一个状态变量。GLSL中内置的顶点属性包括以下几个:
// 顶点属性
attribute vec4 gl_Color; // 顶点颜色
attribute vec4 gl_SecondaryColor; // 辅助顶点颜色
attribute vec3 gl_Normal; // 顶点法线
attribute vec4 gl_Vertex; // 顶点物体空间坐标(未变换)
attribute vec4 gl_MultiTexCoord[0-N]; // 顶点纹理坐标(N = gl_MaxTextureCoords)
attribute float gl_FogCoord; // 顶点雾坐标
值得一提的是用户可以调用glVertexAttrib设置自己的顶点属性(当然个数是有限制的)函数参见:http://blog.csdn.net/yuanjingjiang/article/details/13511657
一致变量—— 就是常说的Uniform,这是用户向GLSL传递自己数据的最常用方法,比如光源位置等等。之所以称为一致变量,是为了与易变变量相区别。不同于顶点属 性在每个顶点有其自己的值,也不同于易变变量由顶点程序向片元程序插值传递,一致变量在一个图元的绘制过程中是不会改变的,而且可以在顶点shader和 片元shader间共享。这部分变量主要用来描述OpenGL的状态,可以看作OpenGL状态机的复制。GLSL内置的一致变量包括:
// 矩阵状态
uniform mat4 gl_ModelViewMatrix; // 模型视图变换矩阵
uniform mat4 gl_ProjectMatrix; // 投影矩阵
uniform mat4 gl_ModelViewProjectMatrix; // 模型视图投影变换矩阵(ftransform())
uniform mat3 gl_NormalMatrix; // 法向量变换到视空间矩阵
uniform mat4 gl_TextureMatrix[gl_MatTextureCoords]; // 各纹理变换矩阵
// 普通缩放因子
uniform float gl_NormalScale;
// 窗口坐标深度范围
struct gl_DepthRangeParameters
{
float near;
float far;
float diff; // far-near
};
uniform gl_DepthRangeParameters gl_DepthRange;
// 裁剪平面
uniform vec4 gl_ClipPlane[gl_MaxClipPlanes];
// 点属性
struct gl_PointParameters
{
float size;
float sizeMin;
float sizeMax;
float fadeThresholdSize;
float distanceConstantAttenuation;
float distanceLinearAttenuation;
float distanceQuadraticAttenuation;
};
uniform gl_PointParameters gl_Point;
// 材质
struct gl_MaterialParameters
{
vec4 emission; // 自身光照Ecm
vec4 ambient; // 环境光吸收系数Acm
vec4 diffuse; // 漫反射吸收系数Dcm
vec4 specular; // 镜面反射吸收系数Scm
float shininess; // Srm
};
uniform gl_MaterialParameters gl_FrontMaterial; // 正面材质
uniform gl_MaterialParameters gl_BackMaterial; // 反面材质
// 光源性质,参数性质就不解释了,和OpenGL的三种光源性质是一样的
struct gl_LightSourceParameters
{
vec4 ambient; // Acii
vec4 diffuse; // Dcii
vec4 specular; // Scii
vec4 position; // Ppii
vec4 halfVector; // Hi
vec3 spotDirection; // Sdli
float spotExponent; // Srli
float spotCutoff; // Crli
float spotCosCutoff; // cos(Crli)
float constantAttenuation; // K0
float linearAttenuation; // K1
float quadraticAttenuation; // K2
};
uniform gl_LightSourceParameters gl_LightSource[gl_MaxLights];
struct gl_LightModelParameters
{
vec4 ambient; // Acs
};
uniform gl_LightModelParameters gl_LightModel;
// 光照和材质的派生状态
struct gl_LightModelProducts
{
vec4 sceneColor; // Ecm+Acm*Acs
};
uniform gl_LightModelProducts gl_FrontLightModelProduct;
uniform gl_LightModelProducts gl_BackLightModelProduct;
struct gl_LightProducts
{
vec4 ambient; // Acm * Acli
vec4 diffuse; // Dcm * Dcli
vec4 specular; // Scm * Scli
};
uniform gl_LightProducts gl_FrontLightProduct[gl_MaxLights];
uniform gl_LightProducts gl_BackLightProduct[gl_MaxLights];
// 纹理环境和生成
unifrom vec4 gl_TextureEnvColor[gl_MaxTextureImageUnits];
unifrom vec4 gl_EyePlaneS[gl_MaxTextureCoords];
unifrom vec4 gl_EyePlaneT[gl_MaxTextureCoords];
unifrom vec4 gl_EyePlaneR[gl_MaxTextureCoords];
unifrom vec4 gl_EyePlaneQ[gl_MaxTextureCoords];
unifrom vec4 gl_ObjectPlaneS[gl_MaxTextureCoords];
unifrom vec4 gl_ObjectPlaneT[gl_MaxTextureCoords];
unifrom vec4 gl_ObjectPlaneR[gl_MaxTextureCoords];
unifrom vec4 gl_ObjectPlaneQ[gl_MaxTextureCoords];
// 雾参数
struct gl_FogParameters
{
vec4 color;
float density;
float start;
float end;
float scale; // 1/(end-start)
};
uniform gl_FogParameters gl_Fog;
易变变量——易变变量只能在顶点shader和片元shader间传递,这期间实际上经过了一个光栅化的过程。内置的易变变量比较少,如下:
varying vec4 gl_Color;
varying vec4 gl_SecondaryColor;
varying vec4 gl_TexCoord[gl_MaxTextureCoords];
varying float gl_FogFragCoord;
熟悉图形管线的话可以自己描绘出这些易变变量是如何在顶点和片元程序间进行传递的。
内置常量——内置常量描述了显卡的渲染能力,依据各个显卡而定,这里就不一一列举了,如果想要查询的话可以用OpenGL的glGet函数获取MAX/MIN一族的常量值,这些值和内置变量的值是一致的。
GLSL语言内置的变量详解的更多相关文章
- Spark2.1.0——内置RPC框架详解
Spark2.1.0——内置RPC框架详解 在Spark中很多地方都涉及网络通信,比如Spark各个组件间的消息互通.用户文件与Jar包的上传.节点间的Shuffle过程.Block数据的复制与备份等 ...
- Spark2.1.0——内置Web框架详解
Spark2.1.0——内置Web框架详解 任何系统都需要提供监控功能,否则在运行期间发生一些异常时,我们将会束手无策.也许有人说,可以增加日志来解决这个问题.日志只能解决你的程序逻辑在运行期的监控, ...
- C# 内置 DateTime类详解
C# 内置 DateTime类详解 摘抄自微软官方文档,用来方便自己查阅:网址:https://msdn.microsoft.com/zh-cn/library/system.datetime(v=v ...
- 【Python】Python内置函数dir详解
1.命令介绍 最近学习并使用了一个python的内置函数dir,首先help一下: 复制代码代码如下: >>> help(dir)Help on built-in function ...
- 第8.13节 Python类中内置方法__repr__详解
当我们在交互环境下输入对象时会直接显示对象的信息,交互环境下输入print(对象)或代码中print(对象)也会输出对象的信息,这些输出信息与两个内置方法:__str__方法和__repr__方法有关 ...
- day14内置函数作业详解
day14题目 day14作业及默写 1,整理今天所学内容,整理知识点,整理博客. 2,画好流程图. 3,都完成的做一下作业(下面题都是用内置函数或者和匿名函数结合做出): 4,用map来处理字符串列 ...
- 第8.14节 Python类中内置方法__str__详解
一. object类内置方法__str__和函数str 类的内置方法__str__和内置函数str实际上实现的是同一功能,实际上str调用的就是__str__方法,只是调用方式不同,二者的调用语法如下 ...
- Python3内置字符串方法详解
官网文档地址:https://docs.python.org/3/library/stdtypes.html#string-methods基于 Python 3.X 版本 str.capitalize ...
- shell-变量输入内置read命令详解
1. shell变量的输入 shell变量除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入得. [语法格式] read [参数] [变量名] [常用参数] -p:指定读取值时的提示符: ...
随机推荐
- pygame系列_pygame的各模块叙述
在pygame中,有很多模块,每个模块对应着不同的功能,如果我们知道这些模块是做什么的,那么,对我们的游戏开发会起到关键性的作用. 我们就说说pygame中的各个模块吧!!! #pygame modu ...
- 使用命令行编译和运行 c、Java和python程序
集成开发环境已经非常方便,从编写程序到执行程序看到结果,让我们不用关心中间的过程.但是使用原始的.命令的方式来将程序编译运行有的时候可能有些用,比如写个简答的程序,或者是身边没有集成工具的时候. C语 ...
- centos7 下出现 yum list 报错 还有yum groupolist 查询软件组列表报错
之前学到yum在线安装 不晓得那里出错了 跟着老师的教程走的 配置文件也看了 没有错误的 但还报错 这下面是报错的图 在这里说明一下带“#”的都是注释 可以不写的 这个 ...
- 说说最小生成树(Minimum Spanning Tree)
minimum spanning tree(MST) 最小生成树是连通无向带权图的一个子图,要求 能够连接图中的所有顶点.无环.路径的权重和为所有路径中最小的. graph-cut 对图的一个切割或者 ...
- MultCloud – 支持数据互传的网盘管理
MultCloud https://www.multcloud.com/ 是一款在线服务,可以在一个地方管理众多网盘,支持国产百度盘, 最具有特色的地方是你可以直接在 MultCloud 里操作将 D ...
- mysql-debug
http://www1.huachu.com.cn/read/readbookinfo.asp?sectionid=1000002778 http://hedengcheng.com/?p=238 h ...
- java 入门书籍(java7)
一.Java从入门到精通 <Java从入门到精通(第3版)>从刚開始学习的人角度出发,通过通俗易懂的语言.丰富多彩的实例.具体介绍了使用Java语言进行程序开发须要掌握的知识. <J ...
- ajax访问遇到Session失效问题
最近由于一个项目,模块切换为ajax请求数据,当Session失效后,ajax请 求后没有返回值,只有响应的html:<html><script type='text/javascr ...
- python接口自动化24-有token的接口项目使用unittest框架设计
获取token 在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了. 一般token只需要获取一次就行了,然后其它使用unittest框架的测试用例全部 ...
- 玩转kafka
http://zookeeper.apache.org/releases.html#download http://kafka.apache.org/downloads.html(下载最新 二进制版本 ...