Lecture 05 Rasterization(Triangles)

a). Perspective Projection

  • 如何定义一个frustum

    Frustum

    • 近平面宽度、高度(得到宽高比)
    • FOV(Field of View)

b). Viewport transformation

  • 经过MVP后,模型空间中点变换到标准立方体(canonical cube, x,y,z[-1, 1])中。之后就需要进行视口变换(Viewport transformation)

  • 定义屏幕空间

    Difine_the_screen_space

    • OpenGL屏幕空间坐标原点为左下(上图),DX坐标原点为左上
    • 像素位置该像素(方块)左下角的坐标,如左下角像素坐标为$(0, 0)$,但像素中心为$(0.5, 0.5)$
  • Viewport transformation

    ScreenSpace_transformation

c). Rasterization

  • Frame Buffer: Memory for a Raster Display

    • 显存中的一块区域

    • 补充:Render texture(详情见Other/Note)

      • 以下以Unity为例:

        渲染过程中,贴图最开始在CPU内存,这时的贴图被称为client-side的texture,最后被送到GPU,这时叫server-side的texture;

        Render texture是将FrameBufferObject连接到一个server-side的texture;

        • 注意:FrameBufferObject不一定只有一个,也不一定连接屏幕;

        详情:http://t.csdn.cn/3JHqA

  • Triangles - Fundamental Shape Primitives

    • 无法分割为其他多边形
    • 保证是一个平面
    • 容易区分内部和外部
    • 内部插值方便
    • Triangles
  • Fundament: What Pixel Values Approximate a Triangle?T2PV

    • Sampling(采样):逐像素中心采样,判断像素是否在三角形内

      • for (int x = 0; x < xmax; ++x)
         output[x] = f(x);
        
      • if_PinT

    • 判断$(x,y)$是否在三角形内:做三次叉乘,看正负符号是否相同,相同则在三角形内;

    • Edge Cases:要么不做处理,要么特殊处理(OpenGL,DX里规定落于左边和上边算三角形中的点,而落于右边和下边的不算Top-Left RuleTop_left_rule

  • 光栅化加速

    • 光栅化中,对每一个像素都判断是否在三角形中性能浪费过大。因此,加入Bounding Box(包围盒)来限定需要进行判断的区域BoundingBox
    • Incremental Triangle Traversal(找到三角形中每一行最左和最右的像素,但实际上没那么容易,是用于细长并旋转的三角形)Incremental_Triangle_Traversal
阅读全文 »

Lecture 02 Review of Linear Algebra

a). Cross Product

cross

  • 判断相对的左右、前后、内外

    cross

  • 判断左右:如$ \vec{a} \cdot \vec{b} > 0$那 $\vec{b}$ 就在 $\vec{a}$ 的左侧(按图中的右手坐标系)

  • 判断内外:判断 $\vec{AB}$ 和 $\vec{AP}$ 的关系,可判断$P$ 点的在 $\vec{AB}$ 的左侧,同理可判断$P$ 在 $\vec{BC}$ 和 $\vec{CA}$ 的左侧,即均在向量同侧。由此,可判断$P$ 点的在 $ABC$ 的内部

b). Orthonormal Coordinate Frames(正交直角坐标系)

OCF

阅读全文 »