GAMES101课程学习笔记—Lec 07~09:Shading 定义、着色模型、着色频率、图形渲染管线、纹理

0 回顾

在之前的课程中,我们讲了光栅化,这次要开始讲着色。
回顾一下我们学过的东西
在这里插入图片描述

  • 我们有了一个模型,空间中有了一个摄像机 Model
  • 通过变换可以让摄像机放在原点 View
  • 三维空间的模型变换到屏幕上 Projection
  • 通过采样进行光栅化 Rasterization

我们把这些三角形画在屏幕上后,不禁要问,这些像素的颜色是什么呢,这便是接下来要讲的着色。

1 Shading: Definition 着色定义

  • 引入明暗与不同颜色的过程称为着色
    在本课中定义是给物体应用材质的过程
    在这里插入图片描述

2 Blinn-Phong Reflectance Model 一种简单的着色模型

关于Blinn-Phong的着色模型
先前我在 LearnOpenGL学习笔记—光照02:Lighting Basis/Advanced Lighting 中对其概念进行过阐述
当时也是用了闫老师的PPT和视频作为讲解材料,并做了简单实现(点光源为例)
所以此处不再赘述

3 Shading Frequencies 着色频率

  • 着色频率
    在这里插入图片描述

3.1 平面着色

  • 平面着色
    在这里插入图片描述

3.2 顶点着色

  • 顶点着色
    每个顶点做一次Shading,对颜色值插值
    在这里插入图片描述

3.3 像素着色

  • 像素着色
    这里的Phong Shading指的是一种着色频率,之前说的Blinn-Phong是一种着色模型
    三角形三个顶点求出法线,在三角形内部的像素,对法线值做插值,对每个像素做Shading
    在这里插入图片描述

3.4 对比

  • 几何形体足够复杂的情况下,用简单的Shading方法也可以达到好的效果
    在这里插入图片描述

3.5 顶点法线求法

  • 顶点法线求法
    在这里插入图片描述
    内部平滑过渡的法线做法——Barycentric interpolation 重心插值
    法线记得归一化
    在这里插入图片描述

4 Graphics (Real-time Rendering)Pipeline 实时渲染管线

关于这一部分
我在 LearnOpenGL学习笔记—入门03:Hello Triangle 中对图形渲染管线的知识做了简单描述,并做了非常简单的实现(未用到材质以及光照)
LearnOpenGL学习笔记 这个系列也可以说是对实时渲染管线的一个探索和应用

  • 下图为PPT中的示意图
    在这里插入图片描述在这里插入图片描述

到现在的知识的学习已经可以让我们去学习API了(如OpenGL, DirectX)
在这里推荐:ShaderToy,在这个网站,我们只需要关注着色器怎么写
在这里插入图片描述

  • 当下的实时渲染
    在这里插入图片描述在这里插入图片描述

5 Texture Mapping 纹理映射

关于纹理映射的内容
我在 LearnOpenGL学习笔记—入门05:Texture 做过阐述

  • PPT中的示意图很好表示这个映射过程
    在这里插入图片描述
    纹理本身设计可以无缝衔接:tilable,一种设计无缝衔接纹理的方法:Wang Tiling

6 Barycentric Coordinates 重心坐标插值

  • 重心坐标插值
    在这里插入图片描述
    在这里插入图片描述
  • 利用面积的计算确定系数
    在这里插入图片描述
  • 利用坐标的计算确定系数
    在这里插入图片描述
  • 利用中心坐标插值的方法,投影前后的重心坐标可能会变化,所以需要在对应的阶段计算对应的重心坐标来做插值,不能随意复用
  • 进行插值
    在这里插入图片描述

7 Applying Textures 纹理应用

  • 点上计算得到插值出来的UV坐标,然后在纹理上查询,之后根据需要应用(图中为简单应用,直接赋值)
    在这里插入图片描述

8 Texture Magnification 纹理放大

纹理分辨率太小,多个pixel(像素)映射到了同一个texel(纹理像素)

  • 解决方法→插值
    在这里插入图片描述

8.1 Bilinear Interpolation 双线性插值

双线性插值:水平插值+竖直插值
lerp为linear Interpolation的缩写
下图为最近的四个点插值

  • 找到目标点周围四点
    在这里插入图片描述
  • 红点离四个点左下角的垂直与水平距离
    在这里插入图片描述
  • u 0 1 u_01 u01 u 1 1 u_11 u11之间线性插值得到 u 1 u_1 u1,同理得到 u 0 u_0 u0
    然后在 u 0 u_0 u0 u 1 u_1 u1间再次线性插值得到红点
    在这里插入图片描述

8.2 Bicubic Interpolation 双三次插值

取周围16个点也是做竖直和水平的插值
每次用4个,做三次的插值,不是用线性的差值
双向三次插值运算量大,但是效果好
关于这个方法可以看看这位大神的介绍
双三次插值算法(bicubic interpolation)与图形学和计算方法的关系
双三次插值(BiCubic插值)

9 纹理过大的问题

  • 纹理过大时,一个pixel对应了多个texel → 采样频率不足导致 摩尔纹+锯齿(走样)
    远处地平面的一个像素,对应一个大块的纹理,简单的点采样不行
    在这里插入图片描述
    在这里插入图片描述
  • 解决:
    超采样,提高采样频率,可是太浪费
    在这里插入图片描述

采样会引起走样,那么我们不采样,只得到一定范围的平均值。

这是点查询与范围查询的问题

  • 点查询,给出一个点,得到一个点的值
  • 范围查询,不采样,给出一个区域,得到区域的(平均)值

9.1 Mipmap 多级渐远纹理

Mipmap 多级渐远纹理
可以进行快速的范围查询,但是是近似的,并且只有方形
关于Mipmap的内容
我在 LearnOpenGL学习笔记—入门05:Texture 中的 纹理环绕方式/纹理过滤 这一部分做过阐述

  • 以下为PPT中的示意图
    在这里插入图片描述

关于计算Mipmap的示意图
首先我们要把像素覆盖的区域找出来,进行近似

  • 考虑一个像素时,也考虑上周围的点
    然后把它们的中心一起映射到UV上计算距离
    于是可以用距离为边长的 虚线的正方形框 来近似 映射过来不规则的四边形
    层数D约为相邻pixel的映射uv之间的距离取2的对数
    D的作用举例
    如果区域的大小是1×1 D=0 那么在最原始的等级的Mipmap上找
    如果区域的大小是4×4 D=2 那么在第二等级的Mipmap上找,也就是在第二等级上,这个4×4会变成1×1,然后去第二等级上去查这个像素的值,那就是这个区域的平均值
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 单纯只是整数层之间,会有不连续的缝隙
    所以如果不是整数层,那么查前后两层,进行双线性插值,然后再进行一次插值
    也就是三线性插值,得到结果
    在这里插入图片描述

9.2 Anisotropic Filtering 各向异性过滤

Mipmap会把远处的细节都模糊掉
因为它只能查询方块的区域内,以及插值毕竟只是近似

  • 解决三线性插值的方法就是各向异性过滤
    在这里插入图片描述

  • 方块的近似有时候太过勉强,如下图纹理映射后奇形怪状的
    在这里插入图片描述

  • Mipmap做的是方块的 也就是下图左上角的图,但是不方正的压缩做不了
    在这里插入图片描述

  • 各向异性过滤允许我们对长条的区域进行范围查询,但是对于斜着的区域,不行
    生成各向异性过滤的图(Ripmaps)的开销是原本的三倍
    各向异性的意思是,在不同的方向上它的表现各不相同
    各向异性的几X是压缩几倍,也就是从左上角往右下角多几层

  • EWA过滤,把任意不规则的形状拆成很多不同的圆形,去覆盖这个形状
    多次查询自然可以覆盖,但是耗时大

10 Application of Texture 各种纹理贴图

之前的内容中,我们可以得到,给出一个网格,然后做各种shading
在这里插入图片描述
接下来在shading的基础上,我们可以贴上各种贴图
在这里插入图片描述

  • 有许多种类的纹理贴图
    在这里插入图片描述

10.1 Environment Map 环境光贴图

把来自各个方向的光照记录下来,假设环境光来自无限远,只记录方向
也就是说纹理可以用来表示环境光
在这里插入图片描述

  • Spherical Environment Map 球面环境映射
    可以类比成地球仪
    存在拉伸和扭曲问题
    在这里插入图片描述
  • Cube Map 立方体贴图
    把环境光记录在立方体的表面上
    问题也有,之前球面可以很方便得到某一方向的光照,但是现在还要判断这个方向记在立方体的哪一个面上
    在这里插入图片描述

10.2 Bump Mapping 凹凸贴图

Bump Mapping的Texture记录了高度移动,不改变几何信息
贴图作出人为的假的法线,由此得到假的着色效果,产生凹凸效果
通过自定义的高度差,逐像素地扰动法线方向,法线方向一改,着色结果就会发生变化

  • 计算法线方向:求出切线以后找到垂直方向
    在这里插入图片描述
  • UV情况下的法线算法
    在这里插入图片描述

10.3 Displacement mapping 位移贴图

与凹凸贴图的输入相同,但是位移贴图真正改变几何信息,对顶点做位移
相比上更逼真,因为凹凸贴图在边界上会露馅
位移贴图要求模型的三角形足够细致,且运算量更高
DirectX有Dynamic的插值法,根据需要对模型做插值,看情况把模型变得细致
在这里插入图片描述

10.4 Procedural textures 程序纹理

三维的纹理,定义了空间中任意一点的值
对于这种纹理,并没有真正生成这个纹理的图
它们定义了三维空间的噪声函数,函数经过各种处理,可以变成需要的样子
在这里插入图片描述

10.5 Precomputed Shading 预计算着色

用空间算时间,先计算好环境光遮蔽贴图,然后再把纹理贴上
在这里插入图片描述

10.6 Solid modeling & Volume rendering

三维纹理广泛应用到体渲染之中
比如核磁共振等扫描后,得到体积的信息,通过这些信息进行渲染,得到结果
在这里插入图片描述

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值