【GAMES101 课程小结】:Lecture 07/08/09 Shading

内容目录

1. Z_buffering 深度测试
2. 光照模型
3. 着色频率
4. 使用纹理贴图

一. Z_buffering

每个图形会对应一个深度值,而每个像素点只会存储深度值最小的图形的信息,从而保证离摄像机更近的点不会被远的的物体遮挡住。

下面是深度测试处理的一个例子。
在这里插入图片描述

在这里插入图片描述地面的描画在箱子之后,第二张图片因为没有做深度测试的处理,导致原本应该在箱子之后的地面被画在了前面。

二. 光照模型

Blinn-Phong 模型
在这里插入图片描述
最简单的一种光照着色模型。

在这里插入图片描述模型输入

  1. 光线入射方向的反方向 l
  2. 着色点的表面法相量 n
  3. 输入观察者眼中的观察方向 v
  4. 光的颜色,高光的衰减系数

效果由三部分叠加构成:

  1. 高光(Specular)
    在这里插入图片描述

  2. 漫反射光(Diffuse)
    在这里插入图片描述

  3. 环境光(Ambient)
    在这里插入图片描述

三. 着色频率

在这里插入图片描述
Flat shading
直接对每一个面片赋予同一种颜色。

Gouraud shading
先对每一个顶点赋予颜色值,而后通过插值的方法,决定每个三角形面片的颜色。
假设构成三角形三个顶点被赋予的颜色值分别是红绿蓝,则该三角形的插值效果大致如下。

类似的,三角形中任意一点的表面法向量属性也可以通过这种方式插值而得。
在这里插入图片描述
Phong shading
沿每个像素点进行着色。
三角形面片上的每个点,通过插值的方法获取到每个点对应的法向量。
而后通过着色模型计算每个像素点的颜色。

这里有个问题,顶点是一个点,顶点对应的表面法向量如何获得?
在这里插入图片描述
在这里插入图片描述

课程中提到的方法是将与该顶点相邻的所有面的法向量取平均值。

四. 纹理贴图

纹理贴图的应用可能会遇到两方面的问题
1. 当纹理贴图的尺寸远小于应用场景的分辨率。
如要将80 * 80 的图片,贴到分辨率为 800 * 800 的屏幕上,则可能出现多个屏幕上多个像素点会在贴图的同一个像素点上取值(Nearest方法),最终呈现的效果会由较明显的锯齿。
在这里插入图片描述

Bilinear插值
在这里插入图片描述
屏幕上的像素点映射到纹理图片上的时候,不直接选取贴图中整数坐标位置上最近的像素点的值,而是取了临近的4个像素做插值。

mix(
    mix(u01, u11, x - u01.x),
    mix(u00, u10, x - u00.x),
    y - u00.y
)

Bicubic插值
理解起来是Bilinear插值的推广,
选取的是临近16个像素做插值。

2.当纹理贴图的尺寸大于屏幕大小的时候也可能出现问题。
屏幕上的一个像素点可能会覆盖纹理贴图上多个像素点。

例如下面这个三维场景中,区域A离我们较近,屏幕上一个像素点区域在纹理贴图上对应的区域较小;而区域B,一个像素在纹理贴图上对应的区域就比较大
在这里插入图片描述

然而选取的时候,如果只选取其中一个像素点来代表其他像素点,返回的效果也会出现偏差(采样的频率低于信号实际的频率)。 在这里插入图片描述
可能出现摩尔纹,锯齿等问题。
在这里插入图片描述
应对的方法
由原始的贴图生成多级Mipmap贴图,不同的像素点到适合层级的贴图做映射。
在这里插入图片描述

多使用1/3的内存空间。
那么如何确定一个像素点应该到那个层级的Mipmap贴图上找对应。
在这里插入图片描述
将一个像素点以及它x方向,y方向的相邻的点映射到纹理贴图上,求出该像素点在贴图上和它相邻像素点的距离,继而用公式可求出大致应该在那个层级的Mipmap上找对应。

但又出现一个问题
算出的D不是整数,如果直接采用向下取整的方法,可能出现这样一种情况,相邻两个像素点,一个在L0层找对应的值,一个在L1层找对应值,如此一来便可能出现较为明显的边界。
在这里插入图片描述
解决方法:
在相邻层级Mipmap之间再做一次插值。
在这里插入图片描述

应用Mipmap的方法,在一些较远区域,x方向出现模糊的现象。
在这里插入图片描述
原因:理解起来是因为生成高一级的mipmap,x,y方向同时都缩小了,但是有些场景中需要的贴图,x, y方向的缩小比例不是同步的
在这里插入图片描述
引入Anisotropic Filtering 的方法。
在这里插入图片描述
也是生成多级贴图,多考虑了x,y方向缩放不同步的因素。
多使用3倍的内存空间。

更进一步还有EWA Filtering方法。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值