图形学入门学习-GAMES101课程(1)

GAMES简介

GAMES(graphics and mixed environment symposium)是2016年初计算机学会(CCF)计算机辅助设计与图形学专委会成立的,作为我国的计算机图形学与虚拟现实的研究和交流合作平台。之后扩展到了在线学术交流平台Webinar(Web Seminar)
http://games-cn.org/about-games/

第一次课:图形学概论

图形学不是openGL,图形学包括了光栅化rasteration、曲线与曲面curves and meshes、光线追踪 ray tracing、动画/仿真animation/simulation.

第二次课:线性代数基础知识

向量点乘、叉乘,矩阵相乘

第三次课: Transform

均匀缩放 uniform scale、非均匀缩放 non-uniform scale、反射/对称 reflection、旋转 rotate、切变 shear
这些变换都可以表示成下面的式子 linear map在这里插入图片描述
平移不再是线性变换,只能表示成下面的式子(abcd是单位矩阵)
affine map=linear map + translation
在这里插入图片描述
为了统一表示各种Transform,引入齐次坐标 homogeneous coordinate,其实就是多引入了一个维度
在这里插入图片描述
三维中(x,y,z,0)表示一个三维向量,(x,y,z,1)表示一个点,(x,y,z,1)和(2x,2y,2z,2)表示的是同一个点。
在这里插入图片描述
依次执行n个变换,变换矩阵依次左乘。
在这里插入图片描述

拿到变换结果可以分析出变换过程。例如:非原点发生的旋转可以平移到原点做旋转然后平移回去。
补充一下逆时针旋转 θ \theta θ,旋转矩阵是 R θ = [ c o s θ − s i n θ s i n θ c o s θ ] R_{\theta} = \begin{bmatrix}cos\theta & -sin\theta \\ sin\theta & cos\theta\end{bmatrix} Rθ=[cosθsinθsinθcosθ]
那么顺时针旋转 θ \theta θ就是上面的式子角度为 − θ -\theta θ
R − θ = [ c o s θ s i n θ − s i n θ c o s θ ] = R θ T R_{-\theta} = \begin{bmatrix}cos\theta & sin\theta \\ -sin\theta & cos\theta\end{bmatrix}=R_{\theta}^{T} Rθ=[cosθsinθsinθcosθ]=RθT
由于顺逆时针旋转 θ \theta θ是一种互逆操作, R − θ = R θ − R_{-\theta}=R_{\theta}^{-} Rθ=Rθ

第四次课 Transformation cont

主要讲了三维的旋转变换(roll滚动、yaw偏航、pitch俯仰倾斜)和Viewing transformation (包括视图变换和投影变换)。
产生一张照片的三步骤MVP

  1. model 在空间中摆放好物体
  2. view 选择视角,也就是相机的位置和朝向和向上方向
  3. projection 正交投影、透视投影
    第二步是将相机设置在原点,便于计算,朝向-z方向,向上方向为y方向,通常要经过一些变换。
    第三步,正交投影常用于工程制图,而透视投影有一种现象是近大远小,符合人眼视觉习惯。标准正交投影,得到的是一个(-1,1) 3 ^{3} 3的立方体。
    透视投影可以看成先压缩远景后正交投影,透视投影矩阵的推导
    公式之后补上。

第五次课 Rasterization

垂直可视角度,就是相机的广角,广角很大就可以拍近处的物体。
定义视锥:垂直可视角度和长宽比。
在这里插入图片描述
MVP操作之后得到的是一个标准立方体,然后需要进行屏幕坐标变换,即视口变换。

  • Irrelevant to z

  • Transform in xy plane: [-1, 1]2 to [0, width] x [0, height]

  • Viewport transform matrix M v i e w p o r t = [ w i d t h 2 0 0 w i d t h 2 0 h e i g h t 2 0 h e i g h t 2 0 0 1 0 0 0 0 1 ] M_{viewport}=\begin{bmatrix}\frac{width}2 & 0 & 0 & \frac{width}2 \\ 0 & \frac{height}2 & 0 & \frac{height}2\\ 0 & 0 & 1 &0\\ 0 & 0 & 0 &1\end{bmatrix} Mviewport=2width00002height0000102width2height01

  • Rasterizing Triangles into Pixels(为什么选择Triangle,如何判断像素中心是否在triangle内部)(抗锯齿、反走样)

  • 右边的图,绿色像素更多,为什么。在这里插入图片描述

  • 显示设备:CRT、平板显示屏LCD、电子墨水屏

第六次课 反走样

采样频率跟不上信息变化频率就会出现各种问题,例如锯齿、摩尔纹、车轮效应等。
抗锯齿方法:两倍原信号频率;先模糊后采样 filter then sample。MSAA、FXAA、TAA
超采样

第七次课 深度缓存Z-buffering、着色Illumination and Shading

  为了解决把不同远近的Triangle投影到平面上,借用油画的绘画方法就有了画家算法(先画远处的物体,后画近处的物体,有一个覆盖的过程),但是所有的物体需要按照远近排序,并且不同的三角形可能会由于深度交叉而无法排序,如下图。
在这里插入图片描述
  目前广泛采用的是Z-Buffering算法,记录距离最近的像素的深度。算法设计:frame buffer负责记录每个像素的颜色值;depth buffer负责记录每个像素的深度;遍历每个Triangle更新color和depth。

  着色模型Blinn-Phong Reflectance Model。shading需要考虑的三个部分:高光Specular highlights、漫反射Diffuse reflection、环境光照Ambient lighting。(Shading是局部的,所以shading的结果不会产生影子)
  (1)Diffuse Reflection 光会反射到各个方向,不论从哪里看都是一样的效果,所以计算公式和view角度无关(Shading independent of view direction)。
L d = k d ( I / r 2 ) m a x ( 0 , n ⋅ l ) L_d= k_d(I/r^2) max(0,n · l) Ld=kd(I/r2)max(0,nl)
k d k_d kd是漫反射系数, I I I是光源的光强度, r r r是光源到着色点的距离, n n n是单位法向量, l l l是光线向量(光源到着色点的单位向量); I / r 2 I/r^2 I/r2表示到达 shading point的能量, m a x ( 0 , n ⋅ l ) max(0,n · l) max(0,nl)( n ⋅ l n·l nl如果是负数那就没有意义)表示被吸收的能量。
  (2)Specular Highlights指的是光源经过物体反射进入人眼时,物体上最亮的那个点。
L s = k s ( I / r 2 ) [ m a x ( 0 , n ⋅ h ) ] p L_s= k_s(I/r^2) [max(0,n · h)]^p Ls=ks(I/r2)[max(0,nh)]p
半程向量 h = b i s e c t o r ( V , l ) = V + l ∣ ∣ V + l ∣ ∣ h=bisector(V,l)=\frac{V+l}{||V+l||} h=bisector(V,l)=V+lV+l,(注意 V , l , h V,l,h V,l,h都是单位向量); k s k_s ks表示高光系数,近似认为反射之后的能量 I / r 2 I/r^2 I/r2全部吸收了, n ⋅ h n · h nh表示了高光的程度,为了更精确地表示高光使用了指数 p p p( p p p越大,高光范围越小)。
在这里插入图片描述
  (3)Ambient Lisht 环境光和光源方向、视线方向都无关。
L a = k a I a L_a=k_aI_a La=kaIa
k a k_a ka是环境光系数, I a I_a Ia是环境光的强度,近似为一个常数。
  (4)Diffuse、Specular、Ambient相加就得到了物体的shading。
L = k d ( I / r 2 ) m a x ( 0 , n ⋅ l ) + k s ( I / r 2 ) [ m a x ( 0 , n ⋅ h ) ] p + k a I a L=k_d(I/r^2) max(0,n · l)+k_s(I/r^2) [max(0,n · h)]^p+k_aI_a L=kd(I/r2)max(0,nl)+ks(I/r2)[max(0,nh)]p+kaIa
在这里插入图片描述
下一步就是Shading Frequencies
在这里插入图片描述
(1)Flat shading 片元着色:对每个Triangle计算 n n n,对每个Triangle进行着色。
(2)Gouraud shading 顶点着色:对三角形的每个Vertex计算 n n n,对每个Vertex着色,对Triangle进行渐变着色。
(3)Phong shading:对三角形的每个Vertex计算 n n n,对每个Pixel计算渐变 n n n,然后对每个Pixel进行着色。
从上图可以看出更小的Triangle和更小的Shading unit可以达到类似的效果。
如何计算每个Vertex的 n n n?对Vertex所在的每个Triangle计算法向量(Normal Vectors),然后取平均(一般用面积做加权平均)。

Graphics Pipeline (Real-time Rendering)

图形渲染管线,将之前的这些操作搞成一套完整的流程,主要功能是根据给定的虚拟相机、三维物体和光源等,生成(或渲染)一个二维图像。
GLSL(OpenGL Shading Language)是 OpenGL 的着色器语言,使用C语言编写,运行在 GPU上,代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程性。
可以在https://www.shadertoy.com/view/ld3Gz2练习编写shader code。
游戏中真实的三维场景。

Texture Mapping 纹理映射

为什么需要 Texture呢?https://learnopengl-cn.readthedocs.io/zh/latest/01%20Getting%20started/06%20Textures/

第八次课

第九次课

如果贴图较小,生成FrameBuffer时需要使用插值算法。点查询。利用重心坐标做差值,最邻近插值、双线性差值、三次差值。
如果贴图较大,或者视距较大,就是范围查询,即一个像素对应了贴图中的多个元素。此时会出现摩尔纹现象,因为一个像素对应纹理坐标中的一块更大的区域,解决方法:超采样;使用区域查询mipmap,层与层之间查询的结果不连续,需要做三线性插值使其连续,缺点是只能做近似的正方形查询,远处模糊;各向异性过滤Anisotropic Filtering,可以做轴方向的矩形查询,但是斜着的矩形不可以;EWA filtering ;

问题 (x,y,w) 为什么w不等于0就表示一个点,否则表示一个向量。
采样为什么不直接使用像素点呢?为什么是三角形
每个像素有深度值和颜色值,为什么还需要纹理属性值?

在这部分的课程中,我们将专注于使用光线追踪来渲染图像。在光线追踪中 最重要的操作之一就是找到光线与物体的交点。一旦找到光线与物体的交点,就 可以执行着色并返回像素颜色。在这次作业中,我们需要实现两个部分:光线的 生成和光线与三角的相交。本次代码框架的工作流程为: 1. 从 main 函数开始。我们定义场景的参数,添加物体(球体或三角形)到场景 中,并设置其材质,然后将光源添加到场景中。 2. 调用 Render(scene) 函数。在遍历所有像素的循环里,生成对应的光线并将 返回的颜色保存在帧缓冲区(framebuffer)中。在渲染过程结束后,帧缓冲 区中的信息将被保存为图像。 3. 在生成像素对应的光线后,我们调用 CastRay 函数,该函数调用 trace 来 查询光线与场景中最近的对象的交点。 4. 然后,我们在此交点执行着色。我们设置了三种不同的着色情况,并且已经 为你提供了代码。 你需要修改的函数是: • Renderer.cpp 中的 Render():这里你需要为每个像素生成一条对应的光 线,然后调用函数 castRay() 来得到颜色,最后将颜色存储在帧缓冲区的相 应像素中。 • Triangle.hpp 中的 rayTriangleIntersect(): v0, v1, v2 是三角形的三个 顶点, orig 是光线的起点, dir 是光线单位化的方向向量。 tnear, u, v 是你需 要使用我们课上推导的 Moller-Trumbore 算法来更新的参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值