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设置自己的顶点属性(当然个数是有限制的)
一致变量――就是常说的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一族的常量值,这些值和内置变量的值是一致的。
1.texture2D
//texture2D对纹理进行采样(得到一个纹素(texel),这是一个纹理图片中的像素。函数参数分别为simpler2D以及纹理坐标)
     gl_FragColor = texture2D(inputImageTexture, textureCoordinate);
2.dot
  它实质是计算光的强度,由于dot实质是计算两向量的夹角余弦,所以当角度〉90度时为负值。0-90度时为正值
3.pow(x,y)
   计算x的y次方。两个值都为float。

GLSL语言变量的更多相关文章

  1. GLSL语言内置的变量详解

    GLSL语言内置的变量,包括内置的顶点属性(attribute).一致变量(uniform).易变变量(varying)以及常量(const),一方面加深印象,另一方面今天的文章可以为以后的编程做查询 ...

  2. GLSL语言基础

    from http://www.kankanews.com/ICkengine/archives/120870.shtml 变量 GLSL的变量命名方式与C语言类似.变量的名称可以使用字母,数字以及下 ...

  3. 【转载】OpenGL超级宝典笔记——GLSL语言基础

    变量 GLSL的变量命名方式与C语言类似.变量的名称可以使用字母,数字以及下划线,但变量名不能以数字开头,还有变量名不能以gl_作为前缀,这个是GLSL保留的前缀,用于GLSL的内部变量.当然还有一些 ...

  4. [C语言 - 2] C语言变量

    A.变量的作用域: 1.局部变量:在函数或者代码块内部定义的变量 作用域:从定义处到代码块结束 生命周期:从定义处分配控件,代码块结束后被回收 局部变量没有默认值,要自己初始化   2.全局变量:在函 ...

  5. 黑马程序员-- C语言变量作用域与代码块

    这里通过变量作用域的两种错误用法来介绍一下C语言变量作用域 其次对代码块的使用进行了简单说明: #include <stdio.h> 1.变量的作用域(作用范围) 变量定义的那一行开始,直 ...

  6. 模板语言变量,js变量,js自执行函数之前嵌套调用

    1.模板语言变量 前端html页面中展示 {{ nodeIp }} 2.js变量引用模板语言变量 把模板语言变量传递给js,js去执行页面操作(变量的转换,只适用于字符串) var IP = &quo ...

  7. Go 语言变量

    变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念.变量可以通过变量名访问. Go 语言变量名由字母.数字.下划线组成,其中首个字母不能为数字. 声明变量的一般形式是使用 var 关键字: ...

  8. go语言变量

    变量可以通过变量名访问 Go 语言变量名由字母.数字.下划线组成,其中首个字符不能为数字 声明变量的一般形式是使用 var 关键字: var identifier type 变量声明 1. 指定变量类 ...

  9. C语言变量声明内存分配

    转载: C语言变量声明内存分配   一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等.其操作方式类似于数据结 ...

随机推荐

  1. codeforces 719A:Vitya in the Countryside

    Description Every summer Vitya comes to visit his grandmother in the countryside. This summer, he go ...

  2. 优秀大数据GitHub项目一览

    http://blog.csdn.net/yaoxtao/article/details/50540485 优秀大数据GitHub项目一览 VMware CEO Pat Gelsinger曾说: 数据 ...

  3. 微型 ORM-FluentData 温故知新系列

    http://www.cnblogs.com/_popc/archive/2012/12/26/2834726.html 引言:FluentData 是微型 ORM(micro-ORM)家族的一名新成 ...

  4. xml转成数组,原来这么简单!

    function xml2arr($xml){ $obj  = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); $js ...

  5. Python socket编程之一:

    soket 编程步骤 # -*- coding: utf-8 -*- ################################################################# ...

  6. 锋利的jQuery-4--动画方法总结简表

  7. Android Studio-AndroidStudio目录结构

    最近,Google已经打算废弃Eclipse,而要大力支持他的亲生儿子AndroidStudio了,已经不在维护Eclipse了,也就是说在Eclipse上面出了什么问题,Google已经不在会管了, ...

  8. glibc 简介:

    glibc 编辑 glibc是GNU发布的libc库,即c运行库.glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc.glibc除了封装linux操作系统所提供的系统服 ...

  9. Linux无法使用userdel删除用户和组的解决办法

    转自:http://www.linuxidc.com/Linux/2013-07/87371.htm 简述: 今天在看书的时候,看到有个实例,手痒痒的跟着做了起来...但是,出现问题了..测试的用户和 ...

  10. SpringMvc 相关,bean map转换,百度天气,base64.js,jsBase64.java;

    1. Map<String, Object>与JavaBean[POJO, Model]转换; //model public class model{ private int id; pr ...