最近带薪学习的一些笔记

最近实习给留了一个图形学自学任务,正好借着这个机会把Games101的第一部分给刷了,也就是实时渲染管线这一部分,在这里总结一下,如有不对感谢指正。
搜了一些其他的资料,发现Games101真的只是一个入门orz,任重而道远啊。

实时渲染管线

大致分为点处理、三角形处理、光栅化、片元处理和帧缓冲操作这5个阶段。

点处理阶段

将三维空间中的点通过MVP矩阵(model view projection)变换到投影坐标下。

模型变换model transformation

自身坐标->世界坐标

物体的变换(仿射变换):旋转、缩放、平移。其中平移不是线性变换,为了把这几个变换搞到一个矩阵里,引入了齐次坐标,多存储了一个维度的信息,但是计算方便了一些。
物体的变换可以分解,即上述三种变换可以合成一个矩阵,一个变换矩阵也可以拆分成多个变换操作,但注意不满***换律,先线性变换再平移。注意列向量要左乘。

视口/相机变换View/Camera Transformation

定义相机
  • position
  • look-at direction
  • up direction
  • 为了方便,规定相机永远会变换到坐标原点,看向-z,向上方向朝向y(闫老师的课用的是右手系)
变换
  • 可以把相机变换拆分成平移和旋转两部分:
  • 先平移到原点
  • 再旋转到相应轴

投影变换Projection Transformation

分为两种,正交投影和透视投影

正交投影Orthographic Projection
  • 不严谨说就是将物体的z轴舍掉,将x,y坐标映射到区间内
  • 通常来说将一个方块变换成一个标准正方体
  • 先平移再缩放
透视投影Perspective Projection
  • 透视原物体可以视为一个四棱台,先通过“挤压”转换成方块(),然后再做正交变换
  • 上面公式的用括号括起来了,原因是计算出来的坐标最后是,与代表的点是一样的,但最后一维通常为1。

***面和远平面距离需要自己定义。
通常相机会有另外两个参数,一个是视角(field of view, fov),一般是垂直视角(fovY),另一个是宽高比(aspect),可以用这两个值对公式中的其他值进行换算。

  • 另外由于相机最后会变换到原点处,所以计算的时候有

最后MVP矩阵应为

三角形处理阶段

就是将所有的点按照原来的几何信息变成三角面。

光栅化阶段

将标准正方体投影到屏幕

  • 暂时忽略z
  • 变换为
  • 如何知道渲染哪个点(哪些点在三角形中):先找到三角形的包围盒,然后判断包围盒中所有的点是否在三角形中
  • 抗锯齿(MSAA等方法)

    Z-buffer

    想法:
  • 存储每个像素当前最小的z值
  • 需要额外信息存储深度值
    • frame buffer存储颜色值
    • depth buffer存储深度值

片元处理阶段

主要是讲着色问题。但是着色会发生在点处理和片元处理这两个阶段。

shading point定义

  • viewer direction,
  • surface normal,
  • light direction
  • surface parameters(color, shininess, ...)

shading is local(着色仅考虑自己,不会生成阴影)

Diffuse Reflection漫反射

  • Lambert 余弦定理

    每个单位区域的光与 成正比

已知一个点光源,光线传播能量与距离平方成反比
intensity:

  • Lambertian(Diffuse) Shading

    与观测方向无关

Specular Term(Blinn-Phong)

  • 镜面反射光的强度取决于观测方向

  • 观测方向接近于镜面反射方向 <=> 半程向量(half vector)接近于法向量

  • 半程向量

    一般被认为是白色

    引入$p$来减少反射波瓣(reflection lobe)

Ambient Term

环境光是一个常数

Blinn-Phong Reflection Model

Shading Frequncies着色频率

Shade each triangle(flat shading)

  • 三角面片是平的,只有一个法向量

    Shade each vertex(Gouraud shading)

  • 每个顶点有一个法向量
  • 每个三角形的颜色通过内部插值的方法计算出来

    Shade each pixel(Phong shading)

  • 每个像素插值出一个法向量,计算shading

定义每个点的法向量

  • 最好的方法是从已有的规则图形获取(比如一个球)
  • 否则需要从三角面来进行推断
    • 简单的方法:计算该点所在的所有平面的法向量的平均值(还可以跟据面积做加权平均)

定义逐像素的法向量

使用Barycetric interpolation进行插值求出

Shader

  • 对点处理和片元处理阶段编程
  • 描述了在一个点/片元上的操作

Texture mapping

  • 三维物体的表面其实是二维的(texture)
  • 每个三角形顶点有一个纹理坐标(u,v)
  • u、v范围都为[0,1]

Barycentric Coordinates(重心坐标)

引入目的:

  • 为了求点的特定值
  • 为了平滑跨三角形的数值

如果三个值都是非负的,那么该点在三角形内

- 投影之后重心坐标会改变

应用纹理

简单纹理映射:Diffuse Color

对每个光栅化后的屏幕采样(x,y):

  • (u,v) = evaluate texture coordinate at (x,y)
  • texcolor = texture.sample(u,v);
  • set sample's color to texcolor;
Bilinear 双线性插值
Mipmap

允许做范围查询(fast快, approx.近似的, square正方形)

  • 存储仅多了1/3

计算 Mipmap层D

用Trilinear插值计算连续的D值

limitations:

  • Overblur,过分模糊(Mipmap只能应用于正方形区域)
  • 屏幕像素映射到纹理像素后并不一定都是正方形

Solution:
Anisotropic Filtering各向异性过滤

  • 可以查询轴向矩形区域
  • 存储开销多了3倍
Spherical Environment Map

将环境光记录在球上

缺点:两端会被拉伸

->Cube Map
将环境光记录在六张图上

缺点:需要额外的计算

凹凸贴图 Bump/Normal mapping
  • 纹理可以不只表示颜色,可以存储高度
  • 这样可以做一些细节几何的效果(fake the detailed geometry)
  • 通过凹凸贴图定义切线,然后再计算法线
  • 局部坐标系stn,n的方向永远是(0,0,1)
位移贴图 Displacement mapping
  • 与凹凸贴图输入相同
  • 会真的改变点的位置
  • 模型要足够细致

帧缓冲操作

这部分就是将最终的像素信息输出到屏幕上,一些alpha测试、zbuffer的东西在这里执行。

#学习#
全部评论
想问一下游戏开发对高等数学的要求高吗,还是只用到线代
点赞 回复 分享
发布于 2023-01-13 17:33 广东
开头部分可以结合实习内容,再多展开讲讲呀👂
点赞 回复 分享
发布于 2022-06-20 12:11

相关推荐

昨天 11:26
清华大学 Java
打开电脑,思绪又回到了7月份刚开始的时候,感觉这个月过的如梦如幻,发生了太多事,也算是丰富了我本就是平淡的人生吧太早独立的我习惯了一切都是自己做决定,拥有绝对的决定权,而且永远不会听取别人的建议。我就是那个恋爱四年出轨的男主啦,感觉既然在牛客开了这个头,那我就要做个有始有终的人。从我出轨到结束再到和女朋友和好如初真的太像一场梦了,短短的一个月我经历了太多,也成长了很多,放下了那些本就不属于我的,找回了那些我不该放弃的。我的人生丰富且多彩,但人不能一直顺,上天总会让你的生活中出点乱子,有好有坏,让你学会一些东西,让你有成长。我和女朋友的恋爱四年太过于平淡,日常除了会制造一些小浪漫之外,我们的生活...
段哥亡命职场:不得不说,我是理解你的,你能发出来足见你是个坦诚的人,至少敢于直面自己的内心和过往的过错。 这个世界没有想象中那样非黑即白,无论是农村还是城市,在看不见的阴影里,多的是这样的事。 更多的人选择站在制高点去谩骂,一方面是社会的道德是需要制高点的,另一方面,很多人不经他人苦,却劝他人善。 大部分的我们,连自己生命的意义尚且不能明晰,道德、法律、困境,众多因果交织,人会迷失在其中,只有真的走出来之后才能看明白,可是没走出来的时候呢?谁又能保证自己能走的好,走的对呢? 可是这种问题有些人是遇不到的,不去追寻,不去探寻,也就没了这些烦恼,我总说人生的意义在过程里,没了目标也就没了过程。 限于篇幅,没法完全言明,总之,这世界是个巨大的草台班子,没什么过不去了,勇敢面对,革故鼎新才是正确,祝你早日走出来。查看图片
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-11 13:34
offe从四面八方来:我真的没时间陪你闹了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 17:13
点赞 评论 收藏
分享
评论
2
22
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务