OpenGL ES 2.0就开始使用可编程管线,代替了过去的固定管线,管线就好像一条生产流水线一样,一步一步的生成绚丽多彩的图形。
在管线中可编程的部件为顶点着色器和片元着色器(在GPU上运行的程序),要进行任何渲染必须包含至少一个顶点着色器和一个片元着色器。
顶点着色器:(默认精度为H)
1.把每个顶点在空间中的虚拟三维座标转化为可以在屏幕上显示的二维座标
2.根据光照公式计算给个点的color值
3.生成或转换纹理座标。
片元着色器:(需设置精度)
通过光照值,阴影等计算每个像素的颜色及其他属性(只对像素进行操作)
图元:可以编辑的最小图形单位
光栅化:就是将图转化成一个个栅格组成的图像
一个实例:
1.使用OpenGL ES 3.0框架
int esMain(ESContext *esContext)
2.创建简单的顶点和片元着色器
char vShaderStr[]= //顶点着色器
“#version 300 es \n” //版本号
“layout(location=0) in vec4 vPosition; \n”
“void main(){ \n”
“ gl_Position=vPosition;} \n”
char fShaderStr[]= //片元着色器
“#version 300 es \n”
“precision mediump float; \n”//着色器精度
“out vec4 fragColor; \n”
“void main(){ \n”
“fragColor=vect4(1.0,0.0,0.0,1.0);} \n”
3.编译和加载着色器
GLuint LoadShader(GLenum type,const char *shaderSrc){
//创建着色器
GLuint shader;
Glint compiled;
Shader=glCreateShader(type);
if(shader==0){
return 0;}
//加载并编译着色器
glShaderSource(shader,1,&shaderSrc,NULL);
glCompileShader(shader);
//打印并输出生成的错误
...
4.创建一个程序对象并链接着色器
programObject=glCreateProgram();
if(programObject==0)
return 0;
glAttachShader(programObject,vertexShader);
glAttachShader(programObject,fragmentShader);
//打印并生成错误
...
5.设置视口和清除颜色缓冲区
Glviewport(0,0,esContext->width,esContext->height);
glClear(GL_COLOR_BUFFER_BIT);
6.加载几何形状和绘制图元
GLfloat vVertices[]={0.0f,0.5f,0.0f,
-0.5f,-0.5f,0.0f
0.5f,-0.5f,0.0f};
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,vVertices);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES,0,3);
7.显示后台缓冲区
现在使用的双缓冲技术(如果我们直接绘制到帧缓冲区会有伪像产生)
eglSwapBuffers(esContext->eglDisplay,esContext->eglSurface);