关于光栅化和MSAA的一些讨论

问:比如GT200,我听人说显卡光栅化小于5像素(好像是这个数)的三角形时,效率会很低下,请问这是何顾?我对全屏抗锯齿(MSAA)的内部运作方式一直不太清楚,据说带全屏抗锯齿的RT跟普通的完全不一样,哪位朋友有相关资料能帮忙解释下?

答:为什么是5个? LOD的计算是依照Quad的粒度来做的吧。所以GPU中PS启动都是依照Quad的粒度来启动的,而一个Screen spaces下,Quad都是偶数像素位置对齐的,并且是固定位置的。那么如果你在一个Quad的粒度内之覆盖了一个Pixel,那就会浪费其他三个Pixel的位置。从而造成光栅化效率是原来的1/4。更进一步在PS启动的时候,有的比较傻的设计只会按照Quad的粒度来启动PS,从而在PS执行效率上造成同样的效率退化。当然,这话题就扯远了,时下我们讨论的是光栅化效率。

在这种情况下,MSAA能解决一部份问题,实际上MSAA就是在对应边界的像素被进一步作更加细分的Subsampling,从而更多的开发Rast的效率。

至于MSAA的RTset,的确和普通的RTset不一样,这一点在DX10中也有反映。DX10提供特殊的API可以让你按照SUbsampling的粒度去访问每个Subpixle,从而实现K-buffer等图形效果。至于具体GPU是怎么实现MSAA RTset的,这一般来说是对程序员透明的,实现的方式方法有很多种了~~一般来说原则就是最大限度的节约Bandwidth,只要不偏离这个方向,就可以灵活发挥 :〉

1# effulgent
关于MSAA,这篇叙述不错。
Antialiasing today
http://www.nvworld.ru/docs/fsaa2-e.html
有关RT实现的细节
可以参考OpenGL spec MSAA相关部分,或者
ARB_multisample extension spec

DX10的光栅化Rule我贴过来了,里面说道“When Multisampling Pixel shaders always run using a minimum 2x2 pixel area to support derivative calculations”,所以对于小的Triangle来说,MSAA还是可以获得额外的效率的。另外,里面还说道“This means that shader invocations occur more than is shown to fill out the minimum 2x2 quanta (which is independent of multisampling). The shader result is written out for each covered sample that passes the per-sample depth-stencil test. ”,所以PS效率阿,Rast效率阿,都和这个有关系。但是我不明白5个Pixel是怎么回事?

问:我记不得确切像素数字,但在NV的卡上至少有这样一说。我不太懂硬件,正是因为不清楚现在显卡(GT200)使用什么样的算法来进行光栅化(扫描线还是TILE?)如果是基于TILE,管理员刚提到最小TILE粒度是2x2像素大小,我稍微看过LARRABEE基于TILE的软件光栅化,因为光栅化是递归进行的,所以过小的三角形确实会导致递归很深,而实际像素贡献又很少造成效率损失,但具体像素数字肯定跟硬件实现有关,我确实不知道。DX文档也提到因为MSAA的质心采样需要导数,所以PS的运行需要2x2个像素值,普通渲染也是这样吗?
关于mutilsample我提问太粗糙,不好意思,对于mutilsample算法提到一个被覆盖像素只进行一次pixel caculation,我不清楚是否是每三角形一次,因为如果一个像素完全被同一三角形覆盖,应该是只进行一次PS运行,而如果一个像素被N个不同三角形部分覆盖,是否要执行N次PS?而抗锯齿我以为是基于一个完整的帧,而不是单个draw call,所以一个像素还可能牵涉到不同ps运行,不知道是不是这么回事?如果单像素ps的执行次数跟覆盖三角形数目N有关,那就动态的就牵涉到动态内存分配,否则如某些显卡只能保存有限个结果可能会有错误,不知GT200是否有颜色数目限制?

答:关于质心采样问题。在DX10中,是否Centroid Interpolation和MSAA是没有关系的,只需要在PS Input的时候声名插值方式就可以了。
关于2*2的问题。这“自古”就是如此,从SGI在20年前开始设计OGL规范的时候就是2*2了。DX一直继承了这一点。和是否MSAA没有耦合的关系。
关于MSAA时候的PS问题。在Primitive边缘处的Pixel可能会包含好几个Primitive的Framgnet,每个Fragment当然都要算自己的PS阿,不然怎么出来颜色,不然怎么混合出来柔和的边缘效果 :〉所以你说的是对的,但是不会动态分配存储器空间,都一上来是按照最大的尺寸分配存储器空间的。你做一个Render to Texture应该也能感觉的出来~~

答:尽我所知,来解答下
而如果一个像素被N个不同三角形部分覆盖,是否要执行N次PS?
是的
而抗锯齿我以为是基于一个完整的帧,而不是单个draw call,所以一个像素还可能牵涉到不同ps运行,不知道是不是这么回事?
是的
如果单像素ps的执行次数跟覆盖三角形数目N有关,那就动态的就牵涉到动态内存分配,否则如某些显卡只能保存有限个结果可能会有错误,
msaa后,分配显存的大小改变如下
Vid_mem = sizeof(Front_buffer) + sizeof(Back_buffer) + num_samples
        * (sizeof(Front_buffer) +sizeof(ZS_buffer))
每次draw的时候,根据fragment的coverage value更新multisample buffer中该fragment对应的samples。
需要绘制结果时,对multisample buffer做一次downsample,更新到真正的draw buffer。

Centroid Interpolation 好像在msaa情形下才比较有意义。下面这篇文章可以参考下。
http://www.opengpu.org/bbs/viewt ... &extra=page%3D1

所谓Centroid无非就是调整一下自己的属性位置,这样在MSAA后进行Dispaly的时候方便更加柔和的Blending颜色效果。所以如果没有Multisampling/Supersampling,其实Centroid Sampling意义就没有了。不过这话有点绝对,其实在渲染Transparent的物体时候,Centroid Sampling还是可能带来更好的效果的,尽管此时可能没有Multisampling/Supersampling :〉

Centroid是和Multisampling绑在一起的,是为了避免采样跑到triangle外面去。supper sampling是绝对不需要centroid的。
另外“其实在渲染Transparent的物体时候,Centroid Sampling还是可能带来更好的效果的”具体是咋回事?

“但是不会动态分配存储器空间,都一上来是按照最大的尺寸分配存储器空间的”
-----------------------------------------------------
MSAA的render target不是有压缩算法吗?貌似这上面不少专利呢,应该不需要按最大空间分配。

恩。那主要是针对Z buffer和Color Buffer的压缩,其实就是按照Tile进行压缩的。但是并不会节约空间开销把?我的理解是,所谓的压缩可以让我们节约Memory Traffic,但是并不能节约RTset存储器空间。因为要保证按照Tile的压缩算法中,在访问的时候地址空间一定是按照Tile对齐,不然存储器动态分配就麻烦了。如何管理存储器空间呢?

所以,即便不开启MSAA,一样会有压缩的。不知道我的理解是否正确

其实这里有一个潜在的问题,可能是我没搞清楚,大家都说按最大尺寸分配缓冲的前提是像素中同一采样点处只可能有一个颜色,ALPHA被忽略,比如每子像素进行4点采样,如果被像素被8个半透的三角形部分覆盖,如果MSAA处理半透的话,这个像素点处的片段可就可能大于4个了,不知道我理解有没有问题?
请问管理员有硬件光栅化的资料吗?MA说光栅化是一切罪恶的根源,果不其然
对了,IC专家前面贴的 《Rasterization Rules (Direct3D 10)》
我看见有很多像素的中心完全落在三角形内部,但为什么是light grey呢(比如3,3处的像素)?

从编程模型的角度来说,正式应为有大尺寸的Triangle,和高速的Rasterizer,才有过去15年GPU的高速发展……,不然从哪里开发并性能?

关于HW Implement,好像ACM有很多类似的Paper?不过Rasterizer这东西概念上模糊,应该包括了Primitive Setup/Rast/Interpolation三个模块,单独拽出来任何一个模块都不能理解这东西的要点。总的来说算法分两大类,一个是重心坐标算法,以另一个是Edge Function。粗浅的东西可以看看这个,其实这文章粗到不能再粗了,具体可以查阅别的论文,这方面文章不胜枚举。
 L4 [Edge functions and interpolation].pdf (1.63 MB) 下载次数: 7
关于RT尺寸,你这个可以在看一下D3D手册,Alpha会马上和对应Pixel内的颜色Blending掉,可不管保存。所以MSAA是4X,那么就只能存4个颜色。

题外话一句,Micropolygon的Rast Hardware和Traditional Polygon的Rast Hardware是完全不一样的。本贴到目前为止说的还是Traditional Polygon的光栅化。
 
Efficient Design of Graphic Rasterization Module.pdf (167.48 KB) 下载次数: 1
这篇文章给出了一种Rast Unit的实现~ 一般来说Rast的设计必须考虑到纹理地址的局部性,但是本文中没有提及。

原文地址:https://www.cnblogs.com/effulgent/p/1626478.html