--- 准备工作
typedef int uniform;
typedef int attribute;
typedef int location;
class ShaderId{
public:
ShaderId(){id=-1;};
public:
int id;
};
class ShaderVeual{//编译vs和fs后保存的id
public:
ShaderVeual(){_programId=-1;}
public:
int _programId;
ShaderId _vertex;
ShaderId _fragment;
};
成员属性
ShaderVeual shaderveual;
attribute _position;
uniform _color;
uniform _MVP;
成员函数
void shaderInit(){
const char* vs = {
"precision lowp float;"//制定float的精度(lowp低精度)
"uniform mat4 _MVP;"
"attribute vec2 _position;"
"void main()"
"{"
" vec4 pos = vec4(_position,0,1);"
" gl_Position = _MVP * pos;"
"}"
};
const char* ps = {
"precision lowp float;"
"uniform vec4 _color;"
"void main()"
"{"
" gl_FragColor = _color;"
"}"
};
shaderveual=createProgram(vs,ps);
//获取属性的位置
_position = glGetAttribLocation(shaderveual._programId, "_position");
_color = glGetUniformLocation(shaderveual._programId,"_color");
_MVP = glGetUniformLocation(shaderveual._programId,"_MVP");
}
void begin(){
glUseProgram(shaderveual._programId);//使用程序
glEnableVertexAttribArray(_position);//启用顶点数组
}
void end(){
glDisableVertexAttribArray(_position);//禁用顶点数组
glUseProgram(0);// 使用完成
}
调用
bool ini(){
shader.shaderInit();
return true;
}
void renderer() {
//清楚缓冲
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//设置视口的大小
glViewport(0,0,_width,_height);
CELL::matrix4 project=CELL::ortho<float>(0,(float)_width,(float)_height,0,-100,100);
//CELL::matrix4 project=CELL::lookAt(CELL::float3(0,0,5),CELL::float3(0,0,0),CELL::float3(0,1,0));
shader.begin();
float x=100,y=200,w=50,h=50;
CELL::float2 pos[]={//逆时针给坐标点,顺时针会出问题
CELL::float2(x,y),
CELL::float2(x,y+h),
CELL::float2(x+w,y),
CELL::float2(x+w,y+h)
};
/** 给Uniform变量赋值
* @param location 变量
* @param count 数据类型个数
* @param transpose 是否转置(true,false)
* @param value 赋值数据
*/
glUniformMatrix4fv(shader._MVP,1,false,project.data());
//给Uniform变量赋值
glUniform4f(shader._color,1,0,0,1);
/** 设置顶点属性
* @param indx 属性id
* @param size 值数量(2,3,4)
* @param type 数据类型 (GL_UNSIGNED_BYTE,GL_FLOAT...)
* @param normalized 规格化(false,true)
* @param stride 偏移量(数据的偏移量)
* @param ptr 数据
*/
glVertexAttribPointer(shader._position,2,GL_FLOAT,false,sizeof(CELL::float2),pos);
glDrawArrays(GL_TRIANGLE_STRIP,0,4);
shader.end();
eglSwapBuffers(_display,_surface);
}
OpenGLES---Shader初始化
最新推荐文章于 2020-08-09 15:15:26 发布