[译]CSAA (覆盖取样抗锯齿)

来源:互联网 发布:阿里云和腾讯云服务器 编辑:程序博客网 时间:2024/05/22 03:32

转载于:http://getix.blog.163.com/blog/static/116992306200962510481030/

原文于:https://developer.nvidia.com/csaa-coverage-sampling-antialiasing

声明:本文原文由Peter Young撰写,由GeTiX翻译。本文仅供学习交流之用。
如需转载,请注明作者及出处。

本文旨在让更多的人了解CSAA这一新的抗锯齿处理方法。
如果翻译有错漏,也敬请指正和谅解,因为这毕竟是本人第一次翻译文章。
如果你的英文水平不错,建议直接阅读原文:点击这里

导言

CSAACoverage Sampling Antialiasing,覆盖取样抗锯齿)是精视GeForce)8系列GPU的关键新特征。

总的来说,CSAA生成比得上8x或16x MSAA质量的抗锯齿图像,但只产生比标准(通常是4x)MSAA多一点的性能损失。它通过引入一个新的采样类型概念来工作:一种表示覆盖的取样。这不同于先前总是把覆盖固定地绑定到另一个取样类型的抗锯齿技术。例如在超级取样中,每个取样表示了着色颜色、储存的颜色/Z/模板、和覆盖,这样本质上增加了渲染到一个过大的缓存并向下取样。MSAA通过从储存的颜色和覆盖中分离出着色取样,减少了这项操作的着色器开销;这允许应用程序使用抗锯齿来处理更少的着色取样同时维持同样质量的颜色/Z/模板和覆盖取样。CSAA通过从颜色/Z/模板分离出覆盖进一步优化了这个过程,从而减少带宽和存储开销。

精视8800支持下列CSAA模式:

CSAA模式颜色/Z/模板
取样数量
覆盖取样数量8x488xQ(质量)8816x41616xQ(质量)816

 

图1:16x CSAA的颜色和覆盖存储/布局
[译]CSAA (覆盖取样抗锯齿) - GeTiX - GTX工作室

CSAA在下列两种情况下会开启:

  • 当应用程序指定开启CSAA。
  • 当最终用户在控制面板中打开了CSAA。控制面板给用户提供两个选项:
    1. “增强”模式:所有应用程序创建的MSAA表面将转换成使用控制面板指定的CSAA模式的CSAA表面。
    2. “覆盖”模式:控制面板强制一个CSAA可用的后台缓存。注意这个选项只适用于直接渲染到后台缓存的应用程序。

推荐应用程序直接指定开启CSAA。实现CSAA的过程非常简单(几乎和实现MSAA一摸一样),而且对你的用户来说好处是巨大的;他们在性能损失几乎为零的情况下获得高得多的图像质量,且没用操作控制面板的麻烦和困难。

 

实现——DirectX 10

创建CSAA兼容的表面

通过使用多重取样描述结构中的Quality域可以启用CSAA:

typedef struct DXGI_SAMPLE_DESC { 
UINT Count; 
UINT Quality; 
} DXGI_SAMPLE_DESC, *LPDXGI_SAMPLE_DESC;

由于这个结构已经提供了通过Count域指定存储的颜色/Z/模板取样数量的机制,并且在多重取样缓存中着色颜色取样数目总是1,我们可以通过设定Quality域为期望的值来指定覆盖取样数量。下面的表格列举了不同的CSAA模式,和用来开启它们的合适Count/Quality值。

表1:DX10的CSAA模式和对应的取样/覆盖数量

期望的CSAA模式Count(颜色/Z/模板 
取样)
Quality值8x488xQ(质量)8816x41616xQ(质量)816

 

确定CSAA的硬件支持

检查CSAA支持是简单的:

  • 检查当前设备的生产商ID来确认它是英伟达NVIDIA)硬件。
  • 使用CheckMultisampleQualityLevels()来检查最大质量级别。传入期望的颜色/Z/模板数目作为SampleCount,而如果pNumQualityLevels大于期望的Quality值,则支持CSAA。
    例如,你传入SampleCount为4,一个9或更大的pNumQualityLevels值表明8x和8xQ CSAA模式是可用的。一个17或更大的pNumQualityLevels值表明16x和16xQ CSAA模式是可用的。

实现——DirectX 9

实现——OpenGL

在OpenGL中CSAA是通过一个新扩展实现的:

GL_NV_framebuffer_multisample_coverage

当这个扩展的支持被验证,你就可以使用下列函数来创建CSAA渲染缓存:

void RenderbufferStorageMultisampleCoverageNV( enum target, sizei coverageSamples, sizei colorSamples, enum internalformat, sizei width, sizei height);

这个函数的使用与旧的RenderbufferStorageMultisampleEXT()是相同的;唯一的区别就是指定分开的颜色/Z/模板取样数目和覆盖取样数目的能力。正如DX10,OpenGL函数指定颜色取样和覆盖取样与参数一样。

参考下面的表格:

CSAA模式colorSamples值coverageSamples值8x488xQ(质量)8816x41616xQ(质量)816

 

CSAA指导

性能

CSAA的性能通常和典型的、给定相同的颜色/Z/模板取样数目的MSAA的性能很相似。例如,8x和16x CSAA模式 (使用4个颜色/Z/模板取样)执行起来与4x MSAA相似或相同。

同时CSAA在存储方面是非常高效的,因为覆盖取样只需非常小的内存。

透明抗锯齿

透明抗锯齿和CSAA100%兼容。然而,记住透明抗锯齿工作在一个更低的分辨率;它工作在颜色/模板/Z分辨率而不是覆盖分辨率,因为透明抗锯齿需要颜色/Z/模板取样信息来工作。

开发考虑

为了最好的图像质量结果,当实现CSAA时尽量避免下列情况:

  • 避免在不同的多重渲染目标之间共享Z缓存。这会影响覆盖信息并可能导致抗锯齿质量的损失。如果你的应用程序渲染到多重渲染目标,在CSAA中下列循环对每个渲染目标是安全的:
    • 清除深度和颜色
    • 渲染到多重取样目标
    • 复制Blit)到非多重取样目标
  • 避免部分深度清除,因为它们会影响覆盖信息。如果一个三角形的边与清除的区域的边有交叉,在这个交叉点抗锯齿质量会下降。
  • 尽量避免独立地更新颜色和Z,因为CSAA覆盖信息只在Z正被写入时更新。它的例外是当每个遍的几何体是相同的(就像在典型的Z唯一预处理遍),在这种情况下图像质量将被保留。

CSAA——结果

下面SDK 10 CSAA示例中的图像凸显了标准4x MSAA和16x CSAA模式在质量上的不同。观察16x在图像质量上的提高,并注意16x CSAA通常执行起来与4x MSAA相似这个事实。

无抗锯齿[译]CSAA (覆盖取样抗锯齿) - GeTiX - GTX工作室 4x MSAA[译]CSAA (覆盖取样抗锯齿) - GeTiX - GTX工作室16x CSAA[译]CSAA (覆盖取样抗锯齿) - GeTiX - GTX工作室16xQ CSAA[译]CSAA (覆盖取样抗锯齿) - GeTiX - GTX工作室

0 0
原创粉丝点击