opengles渲染流程

一个三角形v1(x,y,z),v2(x,y,z),v3(x,y,z)的渲染流程是这样的: vertex shader——Clipping——Perspective Division——视口转换——光栅化阶段——片断shader ——片断测试和操做(剪刀测试,模板测试,深度测试,混合,抖动,多重采样反锯齿等。 1 每一个顶点先被传到顶点shader里面,通常在顶点shader里面,顶点要乘以modeviewproj矩阵,获得homogeneous 坐标(x,y,z,w); 这个坐标经过顶点shader内建的变量gl_Position输出,进入Clipping阶段 2 在Clipping阶段,根据primitive的类型(GL_TRIANGLE, GL_LINES,GL_POINTS),和视见体作裁剪,下面说一下三角形的裁剪: 若是三角形所有在视见体里面,不需裁剪,若是所有在外面则丢弃,不渲染这个三角形了。 若是只是部分在视见体里面,须要裁剪,这个过程可能丢弃一些点和产生新的点,新的点和剩下的点 组成三角形扇,进入下一个阶段:透视除。 3 透视除阶段,就是对每一个点(x/w,y/w,z/w),获得新的(x,y,z).新的x,y,z范围都在-1.0到1.0之间。 这样的坐标叫作归一化坐标(normalized device coordinate)。 新的x,y最终根据视口的尺寸转换为屏幕坐标,而z值,根据glDepthRange设置的near和far值 最终转换为屏幕Z值。屏幕z=(f-n)*Z/2 + (n+f)/2 。 void glViewport(x,y,w,h); void glDepthRange(GLclampf n, GLclampf f); n和f的值0.0--1.0。 归一化坐标就是根据上面这两个函数设置的值转换到屏幕坐标的。 4 接下来就是光栅化阶段了,在对三角形,直线,点等primitive作光栅化以前,还有个 cull(剔除)和多边形偏移, cull就是根据当前的三角形是frontfacing仍是backfacing的,来作cull。由这几个函数来控制 void glFrontFace(GLenum dir);GL_CW, GL_CCW. void glCullFace(GLenum mode); GL_FRONT,GL_BACK,GL_FRONT_AND_BACK。指定剔除那种面。 void glEnable(GL_CULL_FACE); void glDisable(GL_CULL_FACE);   多边形偏移不想说了。 而后为每一个primitive生成合适的片断,片断就是在屏幕某个位置的像素点。至于片断的颜色等值, 就在片断shader里面设置了。 以后的各类测试混合抖动等这里不说了。