找回密码
 立即注册
查看: 289|回复: 0

GAMES 101计算机图形学笔记[1]

[复制链接]
发表于 2022-6-30 20:26 | 显示全部楼层 |阅读模式
课程地址:

  • https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html
渲染(Rendering)流程

Vertex -> Pixel

  • Vertex Processing:输入三维空间中的顶点(Vertex)
  • Triangle Processing:对顶点进行处理,构成三角形、四边形
  • Rasterization:光栅化处理,将三维三角形描述变为二维像素描述,可以打印在屏幕上
  • Z-buffering:深度缓存处理,比较不同物体的遮挡关系
  • Shaded fragment:着色,利用二维纹理图、纹理坐标数据进行着色,根据法向量进行插值、光线追踪等
  • Framebuffe操作
  • 显示二维图片(Pixels)
空间变换

作用:三维顶点、相机位置、相机取景投影等过程,涉及较多关于空间坐标变换的知识
齐次坐标(Homogeneous Coordinates)


  • 在原本坐标维度上增加一维,方便描述位移变换
  • 2D点定义:
  • 2D向量定义:
  • 3D点定义:
  • 3D向量定义:
  • 齐次坐标下的位移变换:

叉乘运算


2D仿射变换(Affine Transform)



  • 尺度变换


  • 旋转变换


  • 位移变换

3D放射变换



  • 沿  轴旋转


  • 沿  轴旋转


  • 沿 轴旋转


  • 使用沿三个轴的旋转描述复杂的空间旋转(三个Euler角):



  • Rodrigues旋转公式:描述沿  轴旋转

MVP变换(模型变换->视图变换->投影变换)


  • MVP变换:model、view、projection transform
  • 相机参数:

    • 位置
    • 视线方向
    • 向上方向  :表示相机自己的转角、镜头的顺时针/逆时针旋转

视图变换(View Transformation)

  • 将整个空间变换到以相机位置为原点, 轴方向为相机向上  方向,  轴方向为视线方向  ,  轴方向为 方向
  • 视图变换
  • 其中,位移变换将相机移动到坐标原点:


  • 旋转变换将  变换到  轴,将 变换到  轴,考虑将 变换到相机坐标,得到逆变换:

转置得到旋转变换:


  • 其他物体跟着相机一起变换
投影变换(Projection Transformation)



  • 投影变换的目标是将空间中的物体投影到一个成像平面,如上左图所示,采用的方法如下:

    • 透视投影(Perspective Projection):将左图所示多面体变换为长方体
    • 正交投影(Orthographic Projection):将该长方体通过平移、尺度缩放变成以原点为中心立方体,再去掉z坐标,压到二维平面

透视投影(Perspective Projection)



  • 成像平面 到原点的距离为  ,最远平面 到原点的距离为
  • 对于成像空间内任意一点  ,将其与原点 相连,得到其在成像平面的投影点
  • 采用相似三角形对投影点坐标进行分析:



  • 由此得到变换矩阵:

上式最后一个步骤保证坐标第四维度为1

  • 考虑到  经过变换后得到  ,考虑到  经过变换后得到 ,代入确定透视投影矩阵:

正交投影(Orthographic Projection)

  • 将立方体进行平移,归一化:



  • 将一个 的方块平移、尺度缩放为  的方块


  • 得到最终的投影变换矩阵:



  • 将得到的  方块转换到屏幕坐标

光栅化(Rasterization)


  • 将空间中的点、图像转换为二维屏幕上的点:转化为像素点
  • 依次判断像素点是否在三角形中:
for(int x=0; x<xmax; x++)
  for(int y=0; y<ymax; y++)
    image[x][y]=inside(tri, x+0.5, y+0.5);

  • 应用叉乘判断
  • 可以只对bouding box里面的像素进行判断,进行提速
抗锯齿(Anti-aliasing)光栅化


  • 先滤波再采样



  • 具体实施时,考虑根据像素三角形的覆盖率,确定灰度值



  • 对像素进行再次划分,分为 ,分别判断每个点是否在三角形内,计算点在三角形内的占比(MSAA方法)


深度缓存(Z-Buffering)


  • 区分物体的远近、遮挡关系
  • 采用深度缓存的方式,存储当前像素点的最近深度,一旦遇到更近的点,则更新该深度缓存

    • frame buffer:保存当前渲染图像的像素值
    • depth buffer(z-buffer):保存当前图像每个像素位置的深度值





着色模型(Shading)

Blinn-Phong Reflection Model


  • 考虑环境光照(Ambient)、漫反射(Diffuse)、高光(Specular)



  • 输入变量:面片法线 、观测方向 、光线方向 、平面参数(颜色)



  • 漫反射(Diffuse Reflection)


  • 根据光线与法线的夹角确定反射强度:
  • 能量辐射:呈球形往外扩展,越往外,单位面积的能量越弱



  • 得到漫反射强度计算式:


其中, 表示像素点纹理/颜色(rgb), 表示光源颜色(rgb)
2. 高光(Specular)

  • 镜面反射:观察方向与镜面反射方向足够接近时,可以看到高光,即法线方向与半程向量方向接近



  • 其中, 为高光颜色(rgb),通常为白色
  • 指数 用于控制反射光强对夹角的敏感度


3. 环境光照(Ambient)

  • 所有点接收到的环境光相同


其中, 为环境光系数(rgb), 为环境光强度(rgb)
着色频率(Shading Frequencies)


  • 考虑着色应用于哪些点?

    • 直接应用于平面
    • 先应用于顶点,再对顶点插值得到平面内每个像素点的着色
    • 对法线插值,得到平面内每个像素点的法线值,再根据着色模型和每个像素点的法线得到着色结果

平面着色(Flat Shading)

  • 着色频率:面


顶点着色(Gouraoud Shading)

  • 着色频率:顶点
  • 先对顶点着色,根据顶点颜色对平面上的像素值进行插值



  • 顶点法线的计算方法:对相邻面的法线进行加权平均:




法线着色(Phong Shading)

  • 着色频率:像素
  • 先对法线进行插值,再根据着色模型着色
  • 像素点法线计算方法:Barycentric插值




纹理映射

每个3D顶点  对应2D纹理图上的坐标点  

  • 三角形内部点的纹理坐标采用重心坐标(Barycentric coordinate)插值:











  • 纹理图过小时,需要处理非整数点坐标  ,采用Bilinear interpolation
  • 纹理图过大时,可以使用超采样方法,将像素扩展为方格,取方格内的均值(范围查询、Mipmap查询、各向异性查询
凹凸贴图(Bump Mapping)


  • 纹理可以用于定义点的相对高度,根据相对高度,改变每个点的切线方向,影响后续的着色过程,制造出凹凸不平的假象



  • 对于二维纹理图上的点,其原始法线方向为
  • 先求两个方向的切线:




  • 得到扰动后的法线方向:
位移贴图(Displacement Mapping)


  • 根据纹理,对顶点位置做移动



相关代码

GitHub - kiyoxi2020/computer-graphics

  • 对应Assignment0~4

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-26 02:28 , Processed in 0.093599 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表