美文网首页程序员
OpenGL ES 3.0编程指南:第七章. Primitive

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

作者: 别卡机 | 来源:发表于2016-10-20 15:06 被阅读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]

    相关文章

      网友评论

        本文标题:OpenGL ES 3.0编程指南:第七章. Primitive

        本文链接:https://www.haomeiwen.com/subject/xcifuttx.html