【笔记】LOL图形管线之旅读后感

| 发布     | 分类 游戏技术  | 标签 游戏技术 

阴影

  1. 通过灯光角度去渲染,每个像素存储rgb(灯光到阴影的投射距离)、a(阴影区域)

  2. 对阴影进行模糊处理,使表现有柔和的边缘

  3. 猜测1:渲染地图表面时,通过灯光视角生成屏幕UV,采用这张渲染好的贴图控制在阴影区域的地图颜色为黑色。

  4. 猜测2:有一个屏幕这么大的平面mesh贴在地图表面之上,用把这张贴图给到这个平面

    img

    img

img

img

轮廓

通过获取上一阶段的缩放深度并使用Sobel滤镜对其进行处理以提取边缘,然后在蒙皮网格上渲染回来,从而生成轮廓。

猜测:

  1. 先用摄像机角度渲染一张小的屏幕缓冲,只渲染单位类型的模型
  2. 将这张贴图放大
  3. 对这张图进行边缘检测,提取边缘
  4. 可以将处理好的用于屏幕后期处理,叠加以显示描边轮廓

后期处理效果–抗锯齿

FXAA(Fast Approximate Anti-Aliasing):

  1. 找出图像中的所有边缘
  2. 平滑边缘

SSAA(Super Sampling AA):

拿4xSSAA举例子

  1. 假设最终屏幕输出的分辨率是800x600
  2. 4xSSAA就会先渲染到一个分辨率1600x1200的buffer上
  3. 然后再直接把这个放大4倍的buffer下采样致800x600

这种做法在数学上是最完美的抗锯齿。但是劣势也很明显,光栅化和着色的计算负荷都比原来多了4倍,render target的大小也涨了4倍。

MSAA(Multi-Sampling AA):

只是在光栅化阶段,判断一个三角形是否被像素覆盖的时候会计算多个覆盖样本(Coverage sample),但是在pixel shader着色阶段计算像素颜色的时候每个像素还是只计算一次。

例如下图是4xMSAA,三角形只覆盖了4个coverage sample中的2个。所以这个三角形需要生成一个fragment在pixel shader里着色,只不过生成的fragment还是在像素中央(位置,法线等信息插值到像素中央)然后只运行一次pixel shader,最后得到的结果在resolve阶段会乘以0.5,因为这个三角形只cover了一半的sample。现代所有GPU都在硬件上实现了这个算法,而且在shading的运算量远大于光栅化的今天,这个方法远比SSAA快很多。顺便提一下之前NV的CSAA,它就是更进一步的把coverage sample和depth,stencil test分开了。

  1. 只是在光栅化阶段
  2. 判断一个三角形是否被像素覆盖的时候会计算多个覆盖样本(Coverage sample
  3. pixel shader着色阶段计算像素颜色的时候每个像素还是只计算一次

img

HUD 三角形数量

名称 三角形数量
HUD总的 1000
小地图 300
其余 700

所有 三角形数量

名称 三角形数量
整个场景 20万
粒子 9万
绘图调用可渲染2800万像素 695

相关文档

《英雄联盟》战争迷雾 https://technology.riotgames.com/news/story-fog-and-war

索贝尔算子 Sobel, 边缘检测技术

边缘检测

快速近似抗锯齿 FXAA

快速近似抗锯齿 (FXAA)

快速近似抗锯齿 FXAA 白皮书

请问FXAA、FSAA与MSAA有什么区别?效果和性能上哪个好?

上一篇: 【笔记】《英雄联盟》战争迷雾