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);