程序员

OpenGL ES 3.0编程指南:第七章. Primitive

2016-10-20  本文已影响74人  别卡机

3. Primitive Assembly

下图展示了图元装配阶段:


Coordinate Systems

Clipping

为了避免在可视体外处理图元,需要对图元进行裁剪处理:

一点说明:进行裁剪操作的代价可能很高。图元的一部分如果在近平面或远平面之外,需要进行裁剪操作,而如果是在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]
上一篇 下一篇

猜你喜欢

热点阅读