OpenGL ES 3.0编程指南:第七章. Primitive
2016-10-20 本文已影响74人
别卡机
3. Primitive Assembly
下图展示了图元装配阶段:
Coordinate Systems
Clipping
为了避免在可视体外处理图元,需要对图元进行裁剪处理:
- 裁剪三角形:
如果三角形完全在可视体之内,不进行裁剪;
如果三角形完全在可视体之外,丢弃该三角形;
如果三角形有部分在可视体之内,则进行裁剪,裁剪操作将产生新的顶点,裁剪称为一个triangle fan。 - 裁剪线段:
如果线段完全在可视体之内,不进行裁剪;
如果线段完全在可视体之外,丢弃该线段;
如果线段有部分在可视体之内,则进行裁剪,裁剪操作将产生新的顶点。 - 裁剪点精灵:
如果点精灵的位置在近或远裁剪平面之外,或者点精灵的正方形在裁剪体之外,则丢弃该点精灵。否则,点精灵不会被改变。
一点说明:进行裁剪操作的代价可能很高。图元的一部分如果在近平面或远平面之外,需要进行裁剪操作,而如果是在x或者y平面之外则不一定需要裁剪。通常做法是,通过渲染到一个大于当前视口尺寸的视口,然后在x和y平面多行的裁剪就变成了剪裁(scissoring),而剪裁操作是很高效的。这个更大的视口叫做“guard-band”,尽管OpenGL ES不允许这种操作,但是大部分实现都实现了这个。
Perspective Division (透视分割)
透视分割将裁剪坐标(x, y, z, w)投影到视口上,过程是将x, y, z分别除以w,这样就得到了规范化设备坐标(Xd, Yd, Zd),范围是[-1, 1](裁剪坐标中,-w <= x, y, z <= w )。其中Xd,Yd用于之后的坐标转换,Zd会转换为深度值。
Viewport Transformation
视口是一个2D矩形区域,是所有OpenGL ES渲染操作最终显示的地方:
void glViewport (GLint x, GLint y, GLsizei w, GLsizei h)
- x,y : 指明视口左下角的窗口坐标,以像素表示
- w,h : 指定视口的宽度和高度,以像素表示,必须大于0
从规范化设备坐标(Xd,Yd,Zd)到窗口坐标(Xw,Yw,Zw)的转换如下:
Xw = (w/2) * Xd + Ox
Yw = (h/2)* Yd + Oy
Zw = ((f-n)/2) * Zd + (n + f) / 2
其中,Ox = x + w/2,Oy = y + h/2, n和f 代表深度范围
n 和 f 可以通过下面方法进行设置:
void glDepthRangef (GLclampf n, GLclampf f)
- n和f的默认值是0.0和1.0,他们的取值范围是 [0.0, 1.0]