Math 数学计算一个简单的图形管道

Math 数学计算一个简单的图形管道,math,graphics,3d,Math,Graphics,3d,我正在尝试做/理解图形管道中所需的所有基本数学计算,以从3D场景描述(如VRML)渲染简单的2D图像。是否有所需步骤的良好示例,如模型变换(对象坐标到世界坐标),视图变换(从世界坐标到视图坐标),计算照明的顶点法线,剪裁,计算视锥体内物体的屏幕坐标,并创建2D投影以计算带有颜色的单个像素。您可以从Hughes等人的《计算机图形学:原理与实践-第三版》一书中查看该章 导出光线投射和光栅化算法,然后构建 软件光线跟踪器的完整源代码,软件 光栅化器和硬件加速光栅化渲染器 我习惯于使用OpenGL样式渲

我正在尝试做/理解图形管道中所需的所有基本数学计算,以从3D场景描述(如VRML)渲染简单的2D图像。是否有所需步骤的良好示例,如模型变换(对象坐标到世界坐标),视图变换(从世界坐标到视图坐标),计算照明的顶点法线,剪裁计算视锥体内物体的屏幕坐标,并创建2D投影以计算带有颜色的单个像素。

您可以从Hughes等人的《计算机图形学:原理与实践-第三版》一书中查看该章

导出光线投射和光栅化算法,然后构建 软件光线跟踪器的完整源代码,软件 光栅化器和硬件加速光栅化渲染器


我习惯于使用OpenGL
样式渲染数学,因此我坚持使用它(所有渲染使用几乎相同的数学)

首先要解释的是:

  • 变换矩阵
  • 表示三维空间中的坐标系

        double m[16]; // it is 4x4 matrix stored as 1 dimensional array for speed
        m[0]=xx; m[4]=yx; m[ 8]=zx; m[12]=x0;
        m[1]=xy; m[5]=yy; m[ 9]=zy; m[13]=y0;
        m[2]=xz; m[6]=yz; m[10]=zz; m[14]=z0;
        m[3]= 0; m[7]= 0; m[11]= 0; m[15]= 1;
    
    其中:

    • X(xx,xy,xz)
      X
      轴在GCS中的单位矢量(全球坐标系)
    • Y(yx,yy,yz)
      Y
      轴在GCS中的单位向量
    • Z(zx,zy,zz)
      Z
      轴在GCS中的单位向量
    • P(x0,y0,z0)
      是在GCS中表示的坐标系的原点
    变换矩阵用于变换GCSLCS(本地坐标系)之间的坐标

    • GCS
      ->
      LCS:
      Al=Ag*m
    • GCS
      2D
      转换通过投影(正交或透视)和Z缓冲区或Z排序完成

      • Z-buffer对于现在的gfx硬件来说非常简单和自然
      • Z排序CPU执行,因此速度较慢,需要额外内存,但这对于正确的透明曲面渲染是必需的
      因此管道如下所示:

    • 从模型中获取实际渲染数据
      • 顶点
        v
      • 正常
        n
      • 纹理coord
        t
      • 颜色、雾坐标等
    • 将其转换为适当的空间
      • v=投影*视图*模型*v
        。。。相机空间+投影
      • n=正常*n
        。。。全局空间
      • t=texture*t
        。。。纹理空间
    • 将数据剪辑到屏幕上
    • 这一步不是必需的,但为了提高速度,防止渲染屏幕内容,而且通常在这里进行面剔除。如果渲染的“三角形”的法向量相反,则多边形缠绕规则集将忽略“三角形”

    • 渲染三维/二维数据
    • 仅使用
      v.x,v.y
      坐标进行屏幕渲染,使用v.z进行z缓冲区测试/值。这里还有透视投影的透视分割

      • v.x/=v.z,vy/=v.z
      Z-buffer的工作原理如下:Z-buffer
      zed
      )是2D阵列,其大小(分辨率)与屏幕相同(
      scr
      )。任何像素
      scr[y][x]
      仅当(zed[y][x]>=z)
      在这种情况下
      scr[y][x]=颜色时才渲染
      ;zed[y][x]=zif条件可以不同(可以更改)

      在使用三角形或更高的基本体进行渲染的情况下,生成的2D基本体将在称为光栅化的过程中转换为像素,例如:

      为了更清楚,这里是它的样子:

      [Notes]

      变换矩阵是乘法矩阵,因此,如果需要将
      N
      点变换为
      M
      矩阵,则可以创建单个
      matrix=m1*m2*…mM
      ,并仅通过由此产生的
      matrix
      转换
      N
      点(用于速度)。有时使用
      3x3
      transform matrix+
      shift vector
      代替
      4x4
      矩阵。在某些情况下,它的速度更快,但您无法如此轻松地将更多的变换相乘在一起。对于变换矩阵操作,请查看诸如旋转或平移之类的基本操作。LCS中也有旋转矩阵,它们更适合于人工控制输入,但它们不是像OpenGLDirectX这样的渲染所固有的。(因为它们使用逆矩阵)

      现在,以上所有内容都是用于标准多边形渲染(对象的曲面边界表示)。还有其他渲染器,如体积渲染或(背面)光线跟踪器和混合方法。此外,场景可以具有任何维度,而不仅仅是3D。以下是一些相关的QA,涵盖以下主题:


      您想要什么样的例子?为显式场景执行所有这些步骤的人?还是一个明确的编程框架?或者哪一个给出了一个类似于你发布的步骤的列表?我正在寻找一个显示所有计算并解释数学的显式场景的示例。我想了解渲染的数学步骤:-)是开源的。@FelixCastor-谢谢你的回答,但我要找的是数学计算和示例,不是软件:-)这是机器人的,但它使用的是相同的