• Geometry Stage in Rendering pipeline (读书笔记2 --- Real-Time rendering)


    Geometry Stage一般包含下面几个阶段

    1. Model & View Transform(模型和视图变换) --- 模型空间--> 世界空间

    模型变换:每个模型经过模型变换来定位,一个模型可能有多个模型变换,譬如一个模型存在于不同的地方,以不同大小存在于同一个场景等。模型变换改变的是模型的顶点和法线
    模型坐标:一个物体的坐标
    世界坐标:模型坐标经过模型变换得到世界坐标
    世界空间:独一无二,当所有模型经过各自的模型变换,它们都存在于同一个空间,相机(观察者)在世界空间中也有自己的位置和方向
    相机空间:将相机放到原点,让它看向-z轴方向(x轴指向右,y轴指向上)

    2. Vertex Shading(顶点着色)

    shading: 决定光在一种材料上的效果的操作。包含计算在物体上很多点的shading方程。有些计算是在geometry stage进行的,有些是在光栅化阶段进行的

    顶点着色需要的数据:每个点的位置,法线,颜色,或者其他需要用来计算着色方程的数字信息

    顶点着色通常发生在世界空间,但有时候为了方便,会变换相机和光源到其他空间(模型空间)

    vertex shading result: 颜色,向量,纹理坐标,等等

    3. 投影(Projection) --- 从三维变为二维的过程

    投影:将视景体(view volume)转换为CCV(规范立方体,Canonical view volume),CCV的极值为(−1,−1,−1)和(1, 1, 1).

    通常有两种投影方法:正投影和透视投影

    正投影:平行线投影后依然平行

    透视投影:离相机远的物体会越小,平行线可能会相交,透视投影的view volume叫视锥体,是一个底部为方形的被截断的金字塔形

    正投影和透视投影变换都由4X4矩阵构成,模型经过这两个变换会被称为归一化设备坐标

    4.clipping(裁剪)

    只有完全或者部分在view volume(视景体)里面的primitives才需要被画到屏幕上,完全在view volume之外的primitives不需要被render,部分在view volume里面的primitivies需要clipping。被clip之后会生成交界点处的新的顶点数据

    primitives总是在unit cube中被裁剪的。

    除了view volume的六个clipping plane外,用户可以自己定义额外的clipping plane来去除可见物体。  

    clipping stage和screen mapping stage是硬件中的固定功能,不能编程,前面的其他stage都是可编程的

    5. screen mapping(屏幕映射,OpenGL中的视口变换)
    只有在view volume里面被裁剪过的primitives才会传到screen mapping阶段,坐标仍然是三维的。

    x和y坐标被转换为屏幕坐标。屏幕坐标和z坐标合起来叫做窗口坐标。z坐标的值(-1<=z<=1)不受screen mapping的影响。

    举个例子,比如上个阶段中得到了一个顶点的坐标为(0,0,0.5,1),根据这个坐标,该顶点位于投影平面的正中间。如果将该点映射到大小为50*50的窗口上时,那么它应该位于屏幕的中间,坐标为(25,25,0.5,1)。当然这里深度值0.5是不会改变的。有的同学肯定有疑问了,既然投影到了窗口上,那么还要深度值0.5干什么?这里要注意的是,虽然在窗口上显示时只需要x,y坐标就够了,但是要在2D窗口上显示3D图形时深度值是不可少的。这里的深度值不是用于显示,而是用于在光栅化的时候进行深度测试

    注意不同点:OpenGL以左下角为最小值(笛卡尔坐标系),DirectX以左上角为最小值

  • 相关阅读:
    VBS控制鼠标移动和点击(附源代码下载)
    用VBS控制鼠标的实现代码(获取鼠标坐标、鼠标移动、鼠标单击、鼠标双击)
    vbs鼠标方法——模拟鼠标按键
    vbs 获取当前目录的实现代码
    如何在VBS脚本中显示“选择文件对话框”或“选择目录对话框”
    loadrunner使用socket协议来实现客户端对服务器产生压力实例。(通过发送心跳包,达到连接多个客户端的目的)
    loadunner使用socket协议来实现多客户端连接同一服务器脚本(使用到IP欺骗技术)
    Loadrunner中参数和变量的使用
    LoadRunner学习知多少--IP欺骗使用
    Linux下tar bz gz等压缩包的压缩和解压
  • 原文地址:https://www.cnblogs.com/lxb0478/p/6197691.html
Copyright © 2020-2023  润新知