本节主要介绍GLSL数据类型与限定符的作用,最后会有一个RGB Cube的案例。
作为计算机语言,肯定少不了数据类型啊,不然怎么编程,GLSL主要有基本数据类型(float,bool,int,unit)、向量(vec)、矩阵(mat)、数组、结构体(Struct)和sampler类型(贴图采样),限定符是指变量前的修饰符,类似public、private以及const之类的修饰符,主要是告诉编译器变量的特定访问范围和功能。好了,下面我们就一一列出来。
一、数据类型与限定符
1.基本数据类型
名称 | 类型 |
---|---|
float | 浮点型 |
int | 整型 |
uint | 无符号整型 |
bool | 布尔型 |
2.矢量
名称 | 类型 | 说明 |
---|---|---|
vec2 | 2维浮点型矢量 | 支持vec2.xy或vec2.rg访问 |
vec3 | 3维浮点型矢量 | 支持vec3.xyz或vec3.rgb访问 |
vec4 | 4维浮点型矢量 | 支持vec4.xyzw或vec4.rgba访问 |
ivec2 | 2维整型矢量 | |
ivec3 | 3维整型矢量 | |
ivec4 | 4维整型矢量 | |
uvec2 | 2维无符号整型矢量 | |
uvec3 | 3维无符号整型矢量 | |
uvec4 | 4维无符号整型矢量 | |
bvec2 | 2维布尔型矢量 | |
bvec3 | 3维布尔型矢量 | |
bvec4 | 4维布尔型矢量 |
3.矩阵
名称 | 类型 | 说明 |
---|---|---|
mat2 | 2x2矩阵 | mat(1.0,2.0,3.0,4.0); |
mat3 | 3x3矩阵 | mat3(1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0); |
mat4 | 4x4矩阵 | matrix[2,2],访问第二行第二列 |
4.数组
只支持一维数组,下标不能为负
float a[10];或float[10] a;
5.结构体
struct dirlight
{
vec3 direction;
vec3 color;
};
dirlight light;
6.sampler类型
名称 | 类型 |
---|---|
sampler1D | for 1D textures |
sampler2D | for 2D textures |
sampler3D | for 3D textures |
samplerCube | for cube map textures |
sampler1DShadow | for shadow maps |
sampler2DShadow | for shadow maps |
sampler类型的使用
uniform sampler2D brickTex;
vec4 texel = texture2D(brickTex,gl_TexCoord[0].st);
7.限定符
名称 | 类型 | 说明 |
---|---|---|
属性变量 | attribute | 1)只在顶点着色器中使用。2)一般用于表示顶点坐标、纹理坐标等。3)使用bindAttributeLocation来设置变量在着色器程序中参数列表的索引。4)使用glVertexAttribPointer来设置attribute的数值。 |
一致变量 | uniform | 1)uniform是由外部程序传递给顶点着色器和片元着色器的变量。2)当顶点着色器和片元着色器声明了一个完全一样的unifrom变量,则两者都可以访问到数据,但不能修改,相当于只读全局变量。3)一般情况下用于表示材质数据。 |
易变变量 | varing | 1)用于顶点着色器和片元着色器之间传递的变量。2)由顶点着色器赋值,片元着色器只读。3)二者的声明必须完全一致,外部程序不能使用该变量。 |
常量 | const | 限定为const的变量是编译时常量。这些变量在声明它们的着色器外部是不可见的。 |
输入形参 | in | VS中为输入的顶点属性 |
输出形参 | out | VS中输出的顶点属性 |
二、RGB Cube
RGB CubeGLSL 代码:
Shader "GLSL/GLSL RGB Cube"
{
SubShader
{
Pass
{
GLSLPROGRAM
#ifdef VERTEX // here begins the vertex shader
//varying变量是vertex和fragment shader之间做数据传递用的
varying vec4 color;
// this is a varying variable in the vertex shader
void main()
{
//cube是以1为边长的正方体,所以顶点的xyz取值范围为[-0.5,0.5],
//分别加上0.5,将取值范围转换到[0,1],正好是颜色RGB每个通道的取值范围
color = gl_Vertex + vec4(0.5, 0.5, 0.5, 0.0);
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
#endif // here ends the vertex shader
#ifdef FRAGMENT // here begins the fragment shader
varying vec4 color;
// this is a varying variable in the fragment shader
void main()
{
//使用cube对象空间的顶点坐标的xyz值作为颜色rgb输出
gl_FragColor = color;
}
#endif // here ends the fragment shader
ENDGLSL
}
}
}
网友评论