Pipeline渲染管线和Texture Mapping纹理映射

  • Graphics Pipeline渲染管线
    在这里插入图片描述
  1. 输入空间中的点
  2. 投影到屏幕
  3. 形成三角形
  4. 光栅化(包含深度缓存)
  5. 着色
  6. 输出
  • shader
    shader在上图中可操作的部分是Vertex ProcessingFragment Processing

shader中大都只管一个点的属性

  • 纹理映射
    在这里插入图片描述
    k_d:定义任何一个点的基本属性
    纹理映射:
    在这里插入图片描述
    这个用uv坐标系来定位贴图位置,是美术的工作

  • 重心坐标
    目的是:在三角形内部进行插值
    在这里插入图片描述
    上图中α,β,γ为该点相对于三个顶点的重心位置;
    A,B,C为顶点坐标
    例:
    在这里插入图片描述
    如何求?
    在这里插入图片描述
    三角形的重心:
    在这里插入图片描述

  • 如何将纹理应用在渲染中?
    屏幕上任意一个采样点,找到其在纹理上的UV是哪一点,并用插值的方法查出改点在纹理上的颜色,可以认为该纹理定义的是漫反射的系数(布林冯模型中的Kd)
    在这里插入图片描述
    关于上面这种做法可能出现的问题:

  1. 低像素图像在高像素显示是出现的像素块该如何解决?
    在这里插入图片描述
    解决方案:双线性插值
    在这里插入图片描述
    共三部:
  • 计算U01和U11插值
  • 计算U00和U10插值
  • 计算前两步计算结果的插值
    高像素图像在低像素显示时出现的走样问题如何解决
    解决方案1. mipmap(范围查询)
    只能做近似的,正方形的查询
    每M个像素块做平均值,并逐层保存起来方便查询
    在这里插入图片描述
    只占O(N / 3)额外空间,查询速度logN
    查询层数为Log2 L层,其中L为像素覆盖长度
    在这里插入图片描述
    如果需要查询层数为小数值,则在两层查询中分别查询并引入插值计算即可(三线性插值)
    但是mipmap会模糊远处的细节,如何解决?
  1. 各向异性过滤
    在这里插入图片描述
    各向异性过滤允许我们对长条状做相对而言更精准的查询
    各向异性过滤中的:x2、x3… 指的是存储N层
  • Environment Map(环境光照)
    可以用来表示环境光
    犹他茶壶
    环境光默认来自无限远处,只记录方向即可;
    环境光可以记录在球面上;且该纹理可以展开,但是在展开后,在接近极点时会发生扭曲‘
    天空盒:记录在盒面上
  • 纹理应用 - 凹凸贴图 - 法线贴图
    在不把几何形体变复杂的情况下,可以应用一个复杂的纹理,从而定义任意一个点相对的高度和角度(法线)
    实际上是人为的做一个假的视觉效果
    在这里插入图片描述
    上图中,先根据定义的法线(p)相对高度找到对应点位(n),再计算该法线该如何变化
    在这里插入图片描述
    先求出该点的切线,通过相邻两个点的坐标差,计算单位中dp的长度,则可以得到向量n的矢量信息为(-dp,1)
    但是凹凸贴图会露馅,比如在看向球体切面的时候
  • 位移贴图:用完全相同的贴图
    但是是进行真实的位置移动,而不是做法线的变换
    所以它相对法线贴图而言不会存在露馅的情况
    但要求三角形本身的细化间隔频率要高于纹理的定义频率
  • DirectX 提供了动态曲面区分方法,结合了上面两种方法的优点
    只在需要的时候进行位移贴图

猜你喜欢

转载自blog.csdn.net/KamikazePilot/article/details/129678417