转:https://www.zhihu.com/question/58595055/answer/157756410

关于MSAA可参考官方规格说明文档 对于OpenGL是Khronos维护的:https://khronos.org/registry/OpenGL/index_gl.php...,其实里面很多内容在红蓝宝书都有。 DX由微软维护,但只通过DX的SDK文档或Rasterization Rules公开了较上层的那部分

先贴出OpenGL官方描述:

First, each fragment includes a coverage value with the value of SAMPLES bits Second, each fragment includes SAMPLES depth values and sets of associated data, instead of the single depth value and set of associated data that is maintained in single-sample rendering mode. An implementation may choose to assign the same associated data to more than one sample. The location for evaluating such associated data can be anywhere within the pixel including the fragment center or any of the sample locations. The different associated data values need not all be evaluated at the same location. Each pixel fragment thus consists of integer x and y grid coordinates, SAMPLES depth values and sets of associated data, and a coverage value with a maximum of SAMPLES bits.

整个回答以MSAA4x为例,官方描述是说,每个像素有4bit的coverage mask,以及4个深度值(每个sample各一个),另外还有其他attribute(最简单的就是color),并且是可以拿一份color copy给所有sample(准确地说是只copy给那些mask非0的sample),而这份color可以来自像素中心或者某个sample。

一,多重采样执行的时间点。书中说的是 光栅化>片段着色器>裁剪测试>msaa 这个顺序,我就奇怪了,msaa不就是为了在片段着色器取样的时候多取样几个点再合成一个颜色输出吗?放在片段着色器完了裁剪也完了之后才执行是几个意思?还有什么用?

1)PS(Pixel Shader,片段着色器)只负责算出每个像素/sample的color,它并不知道每个像素各自有多少个sample被覆盖、是有效的,其实PS自身都可能把sample给discard。

2)裁剪(scissor reject)完再执行是必须的,要得到coverage mask,不仅仅看4个sample中是否被三角形覆盖到(光栅化),还要看是否在scissor内部。比如某个像素4个sample都被triangle覆盖,但可能只有2个sample在scissor里,所以“合成”这个操作是不可能在PS做的,PS不具备需要的信息。

3)至少不可能在第一个pass的PS完成resolve,一般底层也很难一个pass到位,因为4x本质上是中间数据的4x,一个pass得到4x的深度、color,但最终展现的是1x的Image,到了Output Merger这个阶段一般不会为了DownSample去加一些资源。所以通常把4x的color写到buffer上,再一个pass(对于上层而言是不可见的)的PS来做Down Sampling,得到每个像素的,即仍然是1x的color。

二,开启了msaa,到底在片段着色器阶段是逐个sample执行还是一个片段只执行一次?比如4x msaa,是一个片段代码跑4次还是1次?不同的资料来源说法不一。 四,每个sample是分别在所在的位置采样不同的颜色,还是都一致等于中心点(片段本身)的颜色?有些资料说比如4x msaa是四个不同的颜色混合,有些资料又说都是等于同一个颜色(片段的颜色)

默认每个pixel只执行1次,即Pixel Frequency,也就是说PS只执行算出每个像素中心的color,然后copy给4个sample。当然前面说了,这份copy不一定来自像素中心,也可以是像素的其他位置,例如DX中如果把color的插值方式声明为Centroid,那么当像素中心不在三角形内部(但有Sample在三角形内),则会选择三角形内的Sample,避免“Outerpolate”。

Pixel Frequency的好处是PS仍然是1x的,降低消耗,但有时候视觉效果不太好,所以也可以开启Sample Frequency,要求一个pixel的4个sample分别由4个PS负责执行,每个sample计算各自的color。可以参考ARB_sample_shading的说明:https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_sample_shading.txt...

三,msaa如4x是将每个sample所在位置采样得到的颜色加起来除以4吗?(默认算法)

  默认是。

五,深度和模板值同上,是四个不同的值还是同一个值?(有些地方说是同一个值,只是当没有一个sample通过的时候才抛弃这个片段,心想这还有什么用?) 六,深度和模板值,到底有什么用?怎么影响到msaa是只对边缘处理?(具体原理)

无论Pixel Frequency还是Sample Frequncy,深度始终是4x,即每个sample有自己的深度。还是回到“有效”sample的概念上,深度测试fail的sample是无效的,PS输出的color不会copy给它。如果4个sample的深度测试都fail,那么pixel被discard。

七,以上跟alpha to coverage有什么关系?是不是开启了a2c,以上问题的结果会不一样? 八,a2c为什么可以实现顺序无关透明?(详细点具体原理解释)(只要关键点即可,我知道覆盖率什么的,不明白为什么可以顺序无关)

Alpha to Coverage是在MSAA Enable是才能起作用的,因为它是通过改变coverage mask来改变color的(通过与操作),A2C是要利用MSAA,不会对影响以上问题的结果。  

将AlphaTest,Alpha to Coverage和Alpha Blend一起比较:

Alpha Test顺序无关,但边沿效果差。

Alpha Blend边沿效果较好,但要求严格顺序。

在一定程度上,Alpha to Coverage可以理解为基于sample级别的Alpha Test,把Alpha转成mask来实现平滑过渡。理解了Alpha Test顺序无关,就理解了Alpha to Coverge顺序无关。

-------------------------------------一些补充----------------------------------------------------------------------

1)关于supersample和MSAA

MSAA默认是pixel frequency的,开启了sample frequncy时我觉得该算作supersampling了,Stack Overflow有个类似的问题也提到了:Multisampling in pipeline。supersampling和MSAA的区别是PS对每个像素是per-pixel执行还是per-sample执行,MSAA也是对所有位置处理的,并不只是边沿,只是因为三角形内部像素coverage mask为1111,所以最终颜色仍等于像素中心颜色。

2)MSAA最终图像的由来

MSAA开启时,分辨率x4,即100*100的屏幕,要准备200*200的数据buffer,每个像素的4个sample有各自的color,深度,一口气把整一帧所有的triangle画完,按照sample级别去做Z test(当前像素的Z比buffer里的Z小则测试通过),最终像素的颜色是4个sample的均值,通过Bilinear resolve得到100*100。

每个sample的颜色可能来自不同三角形,如下图左边(最终颜色应该是(红+绿)/2)。有多个三角形覆盖同一个sample,当然选择最终Z test pass即离眼睛最近的,如下图右边(最终颜色应该是(红+背景色)/2)。总之就是4个sample color的均值,没被任何三角形覆盖的sample取的自然就是背景色。

对多重采样(MSAA)原理的一些疑问相关推荐

  1. DirectX12初始化二——利用DirectX3D进行多重采样MSAA

    DirectX12初始化二--利用DirectX3D进行多重采样 填写结构体 typedef struct DXGI_SAMPLE_DESC {UINT Count; //每个像素的多重采样数UINT ...

  2. OpenGL MSAA多重采样抗锯齿的实例

    OpenGL MSAA多重采样抗锯齿 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> #include & ...

  3. cesium1.91新特性——MSAA(多重采样抗锯齿)

    文章目录 1.Cesium1.91更新 2.MSAA介绍 3.开启MSAA Cesium实战系列文章总目录: 传送门 1.Cesium1.91更新 3月Cesium更新了新版本Cesium 1.91. ...

  4. 【OpenGL】多重采样案例MSAA

    示例图暂缺(目前运行exe失败,后期补充) 本文比较难,个人来说还不是完全弄懂. #version 150 // hdr_bloom.vs // outputs MVP transformed pos ...

  5. Godot Engine:多重采样抗锯齿(MultiSampling Anti-Aliasing)设置

    Godot Engine 3.2.2 默认状态下Godot渲染的锯齿很严重 解决办法:开启MSAA MSAA是MultiSampling Anti-Aliasing的英文缩写,指多重采样抗锯齿,原理是 ...

  6. 多重采样和超级采样哪个流畅_测试之前你需要做这些功课

    本文约3568字,需6分钟阅读(全文浏览) 如果让你在脑海里以进化的视野回望过去历史的长河中游戏的画面是如何从拙劣慢慢进化到目前的精细,相信大家都有自己的一套历史观,首先当然是随着分辨率的提高.硬件的 ...

  7. Unity3D学习(七):Unity多重采样抗锯齿设置无效的解决办法

    前言 学习Shader的过程中发现模型锯齿严重,于是去Edit--Project Settings--Quality选项下将反锯齿设置为了8X Multi Sampling.结果没有任何改变,如图: ...

  8. 反走样和OpenGL多重采样

    1. 反走样 在计算机图形学中,在屏幕上显示对象时,可能会出现许多的"锯齿",这些锯齿是由顶点数据像素化之后成为片段的方式所引起的,由于将数学意义上的坐标转换到物理的显示器硬件上进 ...

  9. 深入理解多重采样(Multisampling)

    转载请标明出处:http://blog.csdn.net/yunchao_he/article/details/78354528 Multi-sampling或者说Multi-sample Anti- ...

最新文章

  1. Maven向本地仓库导入官方仓库没有的jar包
  2. TCP/IP详解--学习笔记(7)-广播和多播,IGMP协议
  3. homework-03
  4. W5100使用中的常见问题
  5. 5-Error:failed to find Build Tools revision 28.0.0 rc1解决方案
  6. 今日代码(200924)--缺失值处理
  7. ASP.NET事件顺序
  8. 实用教程丨官方下载Oracle各版本安装软件及补丁包
  9. 流程图动画效果html,jQuery创意线条步骤流程图动画特效
  10. CentOs7 安装Hadoop-3.1.0集群环境
  11. 解决win10 1903 系统盘占用100%造成系统假死
  12. android模拟器用户比例,海马玩发布模拟器报告:学生人群与IT从业者占64%
  13. xp iis连接数破解
  14. 1867. 最大数量高于平均水平的订单
  15. Moto Z2F 使用体验 刷机经验分享
  16. 基本算法4.1堆积木详细题解
  17. 机器学习笔记(一) KNN K-最近邻
  18. 聊天记录:李维、左轻侯、周爱民谈Diamondback
  19. 数据分析案例-对某宝用户评论做情感分析
  20. GBase 8s HAC集群简介

热门文章

  1. CentOS7搭建DNS服务器
  2. Ubuntu无法远程连接
  3. Android Activity与Service的交互方式
  4. 关于P3P协议与跨域
  5. 苹果AirPods遭连续起诉,真无线蓝牙耳机的专利之争
  6. 记一篇工作中遇到的问题及解决问题的经验感受.
  7. 抵御Webshell入侵
  8. 应急管理部下属重点实验室介绍
  9. 利用机器学习探索食物配方 通过Word2Vec模型进行菜谱分析
  10. 如何设计一个敏感词匹配系统?