opengles渲染流程

来源:互联网 发布:学厨艺软件 编辑:程序博客网 时间:2024/06/01 09:32
一个三角形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里面设置了。


之后的各种测试混合抖动等这里不说了。