转载:http://blog.csdn.net/misol/article/details/7658949

 
GLSL语法跟C语言非常相似:

1.数据类型:

GLSL包含下面几种简单的数据类型

float

bool :false or ture

int

向量:

vec  
{2,3,4}    
长度为2, 3, 4的float向量

bvec
{2,3,4}    
长度为2, 3, 4的bool向量

ivec 
{2,3,4}    
长度为2, 3, 4的int向量

矩阵:

mat2   2*2的浮点矩阵

mat3   3*3的浮点矩阵

mat4   4*4的浮点矩阵

以上三种矩阵可以简写为mat2 mat3 mat4

矩阵的行和列并没有规定相等,因为可以使用mat2*3 mat 4*2等方法来声明行数和列数

一种特殊的数据类型:取样器--用于纹理采样

sampler1D    
访问一个一维纹理

sampler2D    
访问一个二维纹理

sampler3D    
访问一个三维纹理

samplerCube  访问一个立方体纹理

sampler1DShadow 访问一个带对比的一维深度纹理

sampler2DShadow 访问一个带对比的二维深度纹理

GLSL提供了类似C语言的用户定义结构:

struct dirlight{

vec3 direction;

vec3 color;

};

变量限定符:

限定符赋给变量特殊的含义:

const--    
用于声明非可写的编译时常量变量

attribute-- 用于经常更改的信息,只可以再顶点着色器中使用

uniform--  用于不经常更改的信息,用于顶点着色器和片元着色器

varying--   用于慈宁宫顶点着色器传递到片元着色器的插值信息

控制流:

GLSL的控制流  与C++非常类似,可以使用for
while以及do-while实现循环,也可以使用if和if-else进行选择,不过if语句中的变量声明,只是在最近的硬件中才提供

函数:

GLSL也提供了一些特殊的实现:

continue

break

discard --只可用于片元着色器,当控制流遇到这个关键字时,正在处理的片元就会被标记为将要丢弃

函数

main() 可以返回除了数组外的任何类型

对于函数的参数 可以使用下面几种限定符

in -- 复制进函数但不在返回时复制,在函数内部仍然是可写的

out--只在返回时复制,是可读的

inout  复制进函数并在返回时复制

如果没有指定限定符,默认情况下为in

函数可以通过参数类型重载,但是不能仅仅通过返回类型重载,同样,因为不会执行参数类型自动提升,所以调用函数时参数类型必须完全匹配

函数不能被递归调用

GLSL Vertex shader内置的输入变量,注意这些变量都是不可更改的

attribute vec4 
gl_Color;                              
顶点数据字段的Diffuse颜色

attribute vec4 
gl_SecondaryColor;                顶点数据字段的Specular颜色

attribute vec4 
gl_Normal;                            
顶点法线

attribute vec4 
gl_Vertex;                             顶点位置

attribute vec4 
gl_MultiTexCoord0;               
8组贴图坐标

attribute vec4 
gl_MultiTexCoord1;

attribute vec4 
gl_MultiTexCoord2;

attribute vec4 
gl_MultiTexCoord3;

attribute vec4 
gl_MultiTexCoord4;

attribute vec4 
gl_MultiTexCoord5;

attribute vec4 
gl_MultiTexCoord6;

attribute vec4 
gl_MultiTexCoord7;

attribute vec4 
gl_MultiTexCoord0;

attribute vec4 
gl_MultiTexCoord1;

attribute vec4 
gl_FogCoord;                        
使用雾效果的参考数值

在编写shader时,可以把这些输入数据所代表的功能重新定义,名称只是用来让传入数据时有个规则可循而已,C++调用glVertexPointer所指到的vetex
buffer数据,在GLSL中可以通过gl_Vertex变量来获得。

Vertex Shader的输出数据时使用的内置变量:

vec4
gl_posotion;               
用来设置顶点转换到屏幕坐标的位置,Vertex Shader一定要去更新这个数值

float
gl_pointSize;               
是启动PointSprite功能时,用来设置矩形大小的数值

vec4
gl_ClipVertex;             
如果启用了Clip Plane功能,gl_ClipVertex可以放入用来与Clip
Plane平面做测试用的位置

下面的输出数据在Vertex Shader中用来输出数据,在Fragment
Sahder也可以使用这些变量,但是是用来读取数据:

araying Vec4  
gl_FrontColor;                         
对正面做不同的光照计算 ,这两组颜色分主要颜色和次要颜色 代表的是固管的Diffuse值

varying vec4  
gl_BackColor;                           
背面

varying vec4  
gl_FrontSecondDaryColor;         
固管的Specular值

varying vec4  
gl_BackSecondaryColor;

varying vec4  
gl_TexCoord[gl_MaxTextureCoords];
glTextCoord[0]是指第0个贴图坐标

varying vec4  
gl_FogFragCoord;

Fragment Sahder除了可以从上面几个所列出的变量获得内插结果外,还可以从另外两个内置变量得到一些无法从Vertex
Shader获得的数值

vec4 gl_FragCoord; 
gl_FragCoorg.xy代表像素在Framebuffer画面的位置,gl_FragCoord.z代表这个店在做Z
Buffer测试时所用的Z值

bool gl_FrontFacing;
可用来查询目前正在画的像素是来自三角形的正面还是来自他的背面

Fragment Shader的内置输出变量:

vec4
gl_FragColor;                              
代表画面所要填入的颜色

vec4 gl_FragData[gl_MaxDrawBuffers]; 
用来填入画面的颜色,用在启用多个FrameBuffer时,调用gl_FragData填入画面颜色

vec4 gl_FragDepth;                            
用来指定Z Buffer测试时所使用的Z值,这样就可以不通过顶点内插得到的Z值

对于Vertex Shader来说,除了可通过内置变量来内插数值给Fragment
Shader之外,也可以不通过内置变量,只要在Vertex Shader和Fragment
Shader中声明相同名称的全局变量,GLSL就可以自动的把这两个数值连接起来

分享到:

 

GLSL 基础量定义 【转】的更多相关文章

  1. GLSL 基础量定义

    GLSL语法跟C语言非常相似: 1.数据类型: GLSL包含下面几种简单的数据类型 float bool :false or ture int 向量: vec   {2,3,4}     长度为2, ...

  2. GLSL基础

    GLSL基础 OpenGL Shading Language GLSL作为一种着色语言是纯粹的和GPU打交道的计算机语言.因为GPU是多线程并行处理器,所以GLSL直接面向SIMD模型的多线程计算.G ...

  3. Javascript的函数直接量定义

    在Javascript中允许函数通过直接量来定义.一般情况下,我们定义函数时,最常见的方式是通过function语句进行定义,例如: function sum(a,b){     return a+b ...

  4. python基础学习1-变量定义赋值,屏幕输入输出

    一.变量定义赋值 输入输出屏幕显示 : name = input("input is your name") age =int( input("input is your ...

  5. 在Android中使用OpenGL ES开发第(五)节:GLSL基础语法

    一.前期基础储备笔者之前的四篇文综述了Android中使用OpenGL ES绘制基本图形和实现了简单的相机预览,初次接触OpenGL ES开发的读者可能对其中新的概念比较迷惑,尤其是其中的顶点着色器( ...

  6. pl/sql基础知识—定义并使用变量

    n  介绍 在编写pl/sql程序是,可以定义变量和常量:在pl/sql程序中包括有: ①标量类型(scalar) ②复合类型(composite) ③参照类型(reference) ④lob(lar ...

  7. shell基础——变量定义

    快速参考: 变量定义格式: 变量名=值 str1="hello world" # define a string var str2=hello # define a string ...

  8. Python基础-变量定义-输出输入

    一.变量的定义 字母.数字.下划线组成,不能以数字开头,同时区分大小写 二.输出 print() print(,) 输出空格 input() 读取键盘输入

  9. js-变量定义关键字const,var,let

    1.var定义的变量可以修改,如果不初始化会输出undefined,不会报错. js中最常用的关键字:基本大多数据学js时都只看到使用过var.从没相关还有其他定义 var a = 1; // var ...

随机推荐

  1. 如何过滤adb logcat输出

    简介: 本文介绍如何在 shell 命令行中过滤 adb logcat 输出的几个小技巧. 开发当中经常看到别人的 log 如洪水般瞬间刷满了屏幕,对自己有用的信息都被淹没了,影响心情也影响效率.下面 ...

  2. 【LoadRunner】对摘要认证的处理

    近期项目中,进行http协议的接口性能测试过程中,需要进行登录接口的摘要认证,分享一下测试经验. 测试准备 测试工具:LoadRunner11 测试类型:接口测试--某系统登录接口 步骤 根据系统接口 ...

  3. Android TextWatcher的使用方法(监听ExitText的方法)

    我做了一个查询单词的简单app, 当在EditText中输入单词的时候,点击lookup,则在TextView区域显示出该单词的意思,当EditText中没有任何字符时,显示"word de ...

  4. mysql数据库增、删、改、查等基本命令

    测试环境:windows7 64位 mysql.exe.Navicat Lite for MySQL.mysql 5.0.18 mysql数据库的基本结构: 数据库(database)包含多个表(ta ...

  5. sqlserver 取时间段重复或者不重复的数据

    declare @str datetime, @end datetime select @str='2013-04-05',@end='2013-04-10'select * from arp_hbs ...

  6. winform DataGridView添加合计行

    使用方法 /* DataTable dt= DBUtility.DB.FromSql(sql).ToDataTable(); DataGridViewAddSumRow sumRow = new Da ...

  7. [错误解决]paramiko.ssh_exception.SSHException: Error reading SSH protocol banner 设置

    报错信息 上午的时候数据组的同事跟我说有几个程序报错,经过查看log发现找到报错信息: paramiko.ssh_exception.SSHException: Error reading SSH p ...

  8. 谈谈Python中元类Metaclass(一):什么是元类

    简单的讲,元类创建了Python中所有的对象. 我们说Python是一种动态语言,而动态语言和静态语言最大的不同,就是函数和类不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个HelloW ...

  9. JZOJ 5281 钦点

    样例输入: 4 4 2 a a b b a a b b c c d d c c d d 1 1 3 3 2 2 3 1 1 3 2 2 样例输出: d d c c  d d c c  b b a a  ...

  10. ALICTF2014 EvilAPK4脱壳分析

    相关文件可以在下面链接中下载: http://pan.baidu.com/s/1sjpvFy9 1 简述 该apk使用libmobisec.so函数实现对dex的解密还原.真正的dex为assets目 ...