7 变量类型
着色程序中常用的变量是uniform,attribute变量。
uniform的值只能被图元修改,不能在glBegin / glEnd 间被修改。这意味着uniform不能用作顶点属性,uniform适用于在图元, 桢, 或整个scene都不变的量。uniform变量能在顶点和片断着色器中读。
attribute可以为顶点赋值。attribute在任何时候都可以被更新。只能用于用于顶点着色器,不能用于片断着色器。
7.1 uniform变量的应用:
下面是着色器中的定义的变量:
uniform float specIntensity;
uniform vec4 specColor;
uniform float t[2];
uniform vec4 colors[3];
下面是opengl中的代码部分:
GLint loc1,loc2,loc3,loc4;
float specIntensity = 0.98;
float sc[4] = {0.8,0.8,0.8,1.0};
float threshold[2] = {0.5,0.25};
float colors[12] = {0.4,0.4,0.8,1.0,
0.2,0.2,0.4,1.0,
0.1,0.1,0.1,1.0};
loc1 = glGetUniformLocation(p,"specIntensity");/*给着色程序传值*/
glUniform1f(loc1,specIntensity);
loc2 = glGetUniformLocation(p,"specColor");
glUniform4fv(loc2,1,sc);/*1*4=4,1必须是着色器中声明的值*/
/*或者是:
loc2 = glGetUniformLocation(p,"specColor");
glUniform4f(loc2,sc[0],sc[1],sc[2],sc[3]);
*/
loc3 = glGetUniformLocation(p,"t");
glUniform1fv(loc3,2,threshold);/*2必须是着色器中声明的值*/
loc4 = glGetUniformLocation(p,"colors");
glUniform4fv(loc4,3,colors);/*3*4=12,3必须是着色器中声明的值*/
注意:
GLint glUniform{1,2,3,4}f(GLint location, GLsizei count, GLfloat *v); 是用浮点数赋值
GLint glUniform{1,2,3,4}fv(GLint location, GLsizei count, GLfloat *v); 用浮点数组赋值
7.2 attribute变量的应用:
glBegin(GL_TRIANGLE_STRIP);
glVertexAttrib1f(loc,2.0);
glVertex2f(-1,1);
glVertexAttrib1f(loc,2.0);
glVertex2f(1,1);
glVertexAttrib1f(loc,-2.0);
glVertex2f(-1,-1);
glVertexAttrib1f(loc,-2.0);
glVertex2f(1,-1);
glEnd();
下面是着色器中的定义的变量:
attribute float height;
下面是opengl中的代码部分:
loc = glGetAttribLocation(p,"height");
..........................
glBegin(GL_TRIANGLE_STRIP);
glVertexAttrib1f(loc,2.0);
glVertex2f(-1,1);
glVertexAttrib1f(loc,2.0);
glVertex2f(1,1);
glVertexAttrib1f(loc,-2.0);
glVertex2f(-1,-1);
glVertexAttrib1f(loc,-2.0);
glVertex2f(1,-1);
glEnd();
使用数组:
float vertices[8] = {-1,1, 1,1, -1,-1, 1,-1};
float heights[4] = {2,2,-2,-2};
...
loc = glGetAttribLocationARB(p,"height");
glEnableClientState(GL_VERTEX_ARRAY);
glEnableVertexAttribArrayARB(loc);
glVertexPointer(2,GL_FLOAT,0,vertices);
glVertexAttribPointerARB(loc,1,GL_FLOAT,0,0,heights);
8 数据类型
GLSL支持下面数据类型:
Float bool int
vec{2,3,4} 拥有 2,3,或 4 个浮点数的向量
bvec{2,3,4}
ivec{2,3,4} 整型矩阵
mat2 2*2维矩阵
mat3
mat4
sampler1D - 1D纹理使用(含sample的变量均为纹理使用)
sampler2D
sampler3D
samplerCube
sampler1DShadow
sampler2DShadow
下面是变量使用时应注意的问题:
float a,b; // two vector (yes, the comments are like in C)
int c = 2; // c is initialized with 2
bool d = true; // d is true
.
float b = 2; // incorrect, there is no automatic type casting
float e = (float)2;// incorrect, requires constructors for type casting
int a = 2;
float c = float(a); // correct. c is 2.0
vec3 f; // declaring f as a vec3
vec3 g = vec3(1.0,2.0,3.0); // declaring and initializing g
以下为允许的使用方法
vec2 a = vec2(1.0,2.0);
vec2 b = vec2(3.0,4.0);
vec4 c = vec4(a,b) // c = vec4(1.0,2.0,3.0,4.0);
vec2 g = vec2(1.0,2.0);
float h = 3.0;
vec3 j = vec3(g,h);
mat4 m = mat4(1.0) // initializing the diagonal of the matrix with 1.0
vec2 a = vec2(1.0,2.0);
vec2 b = vec2(3.0,4.0);
mat2 n = mat2(a,b); // matrices are assigned in column major order
mat2 k = mat2(1.0,0.0,1.0,0.0); // all elements are specified
The declaration and initialization of structures is demonstrated below:
struct dirlight { // type definition
vec3 direction;
vec3 color;
};
dirlight d1;
dirlight d2 = dirlight(vec3(1.0,1.0,0.0),vec3(0.8,0.8,0.4));
vec4 a = vec4(1.0,2.0,3.0,4.0);
float posX = a.x;
float posY = a[1];
vec2 posXY = a.xy;
float depth = a.w