在程序中为顶点着色器中的变量传递分为三种种,attribute变量、uniform变量、uniform块
1、attibute变量
const char* vs = "attribute vec3 _position;\n\
attribute vec3 _color;\n\
varying vec3 _outColor;\n\
void main()\n\
{\n\
_outColor = _color;\n\
gl_Position = gl_ModelViewProjectionMatrix * vec4(_position,1.0);\n\
}";
const char* ps = "uniform vec4 _color;\n\
varying vec3 _outColor;\n\
void main()\n\
{\n\
gl_FragColor = vec4(_outColor,1);\n\
}";
对着色器中的_position、_color、_outColor三个变量传值:
求索引号
_position = glGetAttribLocation(_program, "_position");
_color = glGetAttribLocation(_program, "_color");
根据索引号赋值
glEnableVertexAttribArray(_shader._position);
glVertexAttribPointer(_shader._position,3,GL_FLOAT,GL_FALSE,sizeof(Vertex),rect);
glEnableVertexAttribArray(_shader._color);
glVertexAttribPointer(_shader._color,3,GL_UNSIGNED_BYTE,GL_TRUE,sizeof(Vertex),&rect[0].r);
2、uniform变量
struct MVP\n\
{ \n\
mat4 _mat;\n\
float _scaler;\n\
};\n\
uniform MVP _mvp;\n\
_mvp、与1中的_color都属于uniform变量
求索引号
_mvp = glGetUniformLocation(_program,"_mvp._mat");
根据索引号赋值
glUniform4f(_shader._ucolor,0,1,0,1);
3、uniform块
uniform MVP\n\
{ \n\
mat4 _mat;\n\
}mvp;\n\
索引
_mvp = glGetUniformBlockIndex(_program,"MVP");
为缓冲区赋值,并且放到编号为1的绑定点
glBindBuffer(GL_UNIFORM_BUFFER,_ubo);
glBufferSubData(GL_UNIFORM_BUFFER,0,sizeof(CELL::matrix4),prj.data());
glBindBufferBase(GL_UNIFORM_BUFFER,1,_ubo);
从编号为1的绑定点处取数据
glUniformBlockBinding(_shader._program,_shader._mvp,1);