GLSL 基础量定义
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_FrData填入画面颜色
vec4 gl_FragDepth;
用来指定Z Buffer测试时所使用的Z值,这样就可以不通过顶点内插得到的Z值
对于Vertex Shader来说,除了可通过内置变量来内插数值给Fragment
Shader之外,也可以不通过内置变量,
只要在Vertex Shader和Fragment
Shader中声明相同名称的全局变量,GLSL就可以自动的把这两个数值连接起来
GLSL 基础量定义的更多相关文章
- GLSL 基础量定义 【转】
转载:http://blog.csdn.net/misol/article/details/7658949 GLSL语法跟C语言非常相似: 1.数据类型: GLSL包含下面几种简单的数据类型 fl ...
- GLSL基础
GLSL基础 OpenGL Shading Language GLSL作为一种着色语言是纯粹的和GPU打交道的计算机语言.因为GPU是多线程并行处理器,所以GLSL直接面向SIMD模型的多线程计算.G ...
- Javascript的函数直接量定义
在Javascript中允许函数通过直接量来定义.一般情况下,我们定义函数时,最常见的方式是通过function语句进行定义,例如: function sum(a,b){ return a+b ...
- python基础学习1-变量定义赋值,屏幕输入输出
一.变量定义赋值 输入输出屏幕显示 : name = input("input is your name") age =int( input("input is your ...
- 在Android中使用OpenGL ES开发第(五)节:GLSL基础语法
一.前期基础储备笔者之前的四篇文综述了Android中使用OpenGL ES绘制基本图形和实现了简单的相机预览,初次接触OpenGL ES开发的读者可能对其中新的概念比较迷惑,尤其是其中的顶点着色器( ...
- pl/sql基础知识—定义并使用变量
n 介绍 在编写pl/sql程序是,可以定义变量和常量:在pl/sql程序中包括有: ①标量类型(scalar) ②复合类型(composite) ③参照类型(reference) ④lob(lar ...
- shell基础——变量定义
快速参考: 变量定义格式: 变量名=值 str1="hello world" # define a string var str2=hello # define a string ...
- Python基础-变量定义-输出输入
一.变量的定义 字母.数字.下划线组成,不能以数字开头,同时区分大小写 二.输出 print() print(,) 输出空格 input() 读取键盘输入
- js-变量定义关键字const,var,let
1.var定义的变量可以修改,如果不初始化会输出undefined,不会报错. js中最常用的关键字:基本大多数据学js时都只看到使用过var.从没相关还有其他定义 var a = 1; // var ...
随机推荐
- [转]Android调用so文件(C代码库)方法详解
一.为什么调用c的dll要用源码编译成so库 Android系统是基于linux内核的移动终端系统,而dll是在windows环境下生成和调用的c库,所以不可以直接为android系统调用. 二.安装 ...
- GitHub上README.md教程
最近对它的README.md文件颇为感兴趣.便写下这贴,帮助更多的还不会编写README文件的同学们. README文件后缀名为md.md是markdown的缩写,markdown是一种编辑博客的语言 ...
- 为在MyEclipse中配置Tomcat服务器郁闷的朋友们解决郁闷
是不是很郁闷!为了在MyEclipse配置Tomcat 服务器,竟然弄了你几乎一个上午,最后也没弄成功,也许你本该早注意到Tomcat 5.x要有这个JDK的支持,配置才能成功. 一上午辛辛苦苦也没解 ...
- 【转】简单内存泄漏检测方法 解决 Detected memory leaks! 问题
我的环境是: XP SP2 . VS2003 最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} n ...
- SQL Server缺省约束、列约束和表约束
SQL Server缺省约束是SQL Server数据库中的一种约束,下面就为您介绍SQL Server缺省约束.列约束和表约束的定义方法啊,供您参考. SQL Server缺省约束 SQL Serv ...
- jenkins 命令行 CLI jenkins-cli.jar
部署好jenkins后,一般都是通过jenkins提供的web界面来操作jenkins. 而有些场景则需要通过命令来操作jenkins,例如通过脚本操作jenkins. 在jenkins提供的web界 ...
- DateTime.ToString格式化日期,使用DateDiff方法获取日期时间的间隔数
一:DateTime.ToString格式化日期 二:代码 using System; using System.Collections.Generic; using System.Component ...
- ASP.NET 日期 时间 年 月 日 时 分 秒 格式及转换
在平时编码中,经常要把日期转换成各种各样的形式输出或保持,今天专门做了个测试,发现DateTime的ToString()方法居然有这么多的表现形式,和大家一起分享. DateTime time=Dat ...
- [git] 更新到某个指定版本
[git] 更新到某个指定版本 - Vanquisher - 博客频道 - CSDN.NET [git] 更新到某个指定版本 2015-09-06 09:30 527人阅读 评论(0) ...
- 【转】Maven实战(二)---多模块开发---缺少Jar包
原博文出于:http://blog.csdn.net/liutengteng130/article/details/41611755 感谢! Maven里面的Jar包经常出现Missing的情况 ...