0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一种同时解决目标独立光栅化和可变频率的像素着色器的通用实现方法

集成电路应用杂志 来源:集成电路应用杂志 2020-07-14 11:00 次阅读

一种同时解决目标独立光栅化和可变频率的像素着色器的通用实现方法

0 引言

多点采样抗锯齿(MSAA),目标独立光栅化(TIR),和可变频率像素着色器(VRS)是三种不同的DirectX 特性。

多点采样抗锯齿是一个像素有多个采样点,来达到抗锯齿效果。

目标独立光栅化是Direct11.3提出的新特性,旨在使Direct2D能够将栅格化步骤从CPU移动到GPU,同时仍然保留Direct2D抗锯齿需求。抗锯齿路径的渲染将在GPU上进行2次渲染。第一遍将把每个像素的覆盖率写入一个中间渲染目标纹理。路径将被镶嵌成不重叠的三角形。该GPU将编程使用目标独立光栅化和添加剂混合在第一次通过。第一次使用的像素着色器将简单地计算覆盖掩码中设置的比特数,并输出规范化为[0.0,1.0]的结果。在第二次过程中,GPU将从中间纹理读取数据并写入应用程序的渲染目标。此遍历将路径颜色乘以第一次遍历期间计算的覆盖率。

可变频率的像素着色器是Direct12提出的新特性,由于性能的限制,像素着色器不能总是在输出图像的每个部分都提供相同的质量水平。可变速率着色,或粗略像素着色,是一种机制,使分配渲染性能/功率在不同速率的渲染图像。在视觉上,有些情况下阴影率可以降低,而在可感知的输出质量上几乎没有降低,从而导致“自由”的性能。

一般来说在GPU上对这三种特性进行支持需要不同的逻辑门。多点采样抗锯齿特性提出时间比较早,在很多GPU的功能上已经涵盖了,如何将目标独立光栅化以及可变频率像素着色器这两个特性在已经支持多点采样抗锯齿特性的GPU上实现对架构设计师提出了新的挑战。

1 现有方案存在的问题

在D3D管线中,OM(Output Merger)会收到经过光栅化(Rasterizer)的mask,用来确定哪些像素(Pixel)需要更新,哪些不需要更新;同时OM会收到经过PS(Pixel Shader)计算之后输出的每个像素(Pixel)的颜色值,并将颜色值按照mask输出到对应的内存空间中。

为了得到更好的图形渲染效果,D3D运用了各种反走样算法,其中最常见的就是MSAA(MultiSampling Anti-Aliasing)。简单来说就是将1个像素(Pixel)用多个点去采样,这些新的采样点我们称为Sample,目前1个pixel包含的sample个数可以是1,2,4,8,16. 因为像素被细化,所以可以有效降低图形边界的锯齿现象。按照D3D Spec要求,MSAA 在3D管线中各个阶段的sample个数如表1所示。

其中N的取值是1,2,4,8,16,Rasterizer和OM RT的Sample必须是一样的。RT是指Render Target。

D3D11.3在MSAA的基础上提出了TIR(Target Independent Rasterization)。这个新的特性可以帮助GPU处理2D的反走样。TIR在3D管线中各个阶段的sample个数要求如表2。

其中N的取值是1,2,4,8,16.TIR和MSAA 最大的区别有两点:(1)TIR的时候不要求Rasterizer的sample数和OM RT相同;(2)PS 只能运行在Pixelfrequency模式下,即每个pixel不论包含了多少个sample只能调用一次PS。

D3D12为了兼顾图像质量和硬件性能,对反走样算法提出了更高的要求—VRS(Variable Rate Shading). 这个新的特性主要思想是节省PS的调用,不再是按照pixel或者sample的粒度去调用PS,而是按照coarse pixel的粒度去调用PS,即N个pixel调用一次PS(N可以是2,4,8,16),D3D12称其为Subsampling.VRS在3D管线中各个阶段sample个数要求如表3。

PS调用粒度我们用分数表示,比如1/2表示2个pixel调用一次PS。除了表中列出的组合,其他的情况D3D12不要求支持。

MSAA,TIR和VRS是三个不同的特性,都需要GPU hardware支持。MSAA,TIR和VRS是三个不同的特性,不会同时开启,OM需要支持它们需要三块不同的逻辑单元,如图1所示。

MSAA, TIR 和VRS是三个不同的特性,不会同时开启,OM如果用三个不同的逻辑单元去处理会增加硬件设计的逻辑门。

2 算法设计

本文希望实现一种统一的算法能处理这三个不同的特性,达到简化逻辑节省gatecount的目的。

在OM入口处增加两个简单的处理单元,一个处理单元根据Rasterizer的samplemode调整coveragemask和坐标;另一个处理单元根据PS的samplemode调整输出的data。然后将经过调整的coveragemask和color输入到一个统一的逻辑单元,这个逻辑单元可以用一套逻辑处理所有MSAA,TIR, VRS情况。具体设计如图2。

Unitive Unit只用处理MSAA的所有Case。Rasterizer到OM的带宽是固定的,也就是说Rasterizer输出的maskbit位是不变的,在这种情况下Unitive Unit需要能处理各种sample mode的情形。我们约定Rasterizer送出门的mask代表的第一个pixel为左上点,那么这个左上点的坐标(x,y)必须根据Rasterizer到OM的带宽满足对齐(aligned)的规则。

假设Rasterizer到OM带宽是maskWidth, 一般来说maskWidth大于等于16并且是2的幂,否则就没办法在16x的情况下一次性表示一个完整的pixel。N是Rasterizer的samplenum.

Raster mask能表示的RT pixel个数:

rasterPixelNum=(maskWidth>>log2N)

x对齐规则:

1<<(((log2rasterPixelNum)>>1)+

((log2 rasterPixelNum)&1))

y对齐规则:

1<<(((log2rasterPixelNum)>>1))(1)

以Rasterizer到OM的带宽是16bits为例,那么在不同MSAA模式下收到的pixel左上点坐标和PS的color笔数如表4。

为了能让TIR和VRS共用可以处理MSAA 的Unitive Unit,我们需要调整Rasterizer输出的mask和左上点pixel的坐标,以及PS输出的color,使它们能满足Unitive Unit的输入要求,以16bits带宽为例,即满足表4。

2.1 Processmask Unit

首先看Processmask Unit,这个模块需要根据Rasterizer Samplenum.和OM RT Samplenum.来调整mask和pixel坐标。综合前文里关于TIR和VRS的内容,Rasterizer Sample num.和OM RT Samplenum.只有表5所示的三种组合。

Unitive Unit能处理MSAA特性,MSAA要求Rasterizer Samplenum.和OM RT Samplenum.是一样的,所以对于TIR和VRS,在进入Unitive Unit之前需要Processmask Unit将Rasterizer输出的mask和pixel左上点坐标按照OM RT标准进行调整。也就是需要支持两种调整:Nx Rasterizer mask进行down-sample调整到1x OM RT的mask,或者1x Rasterizer mask进行up-sample调整到Nx OM RT的mask.

2.2 Down-sample

Rasterizer Sample num.是N,OM RT Samplenum.是1。假设Rasterizer输出的mask为rasterMask,pixel左上点坐标是(x,y)。

经过Process mask Unit调整后输出的mask为finalMask,其宽度和rasterMask相同,调整后的pixel左上点坐标是(finalX, finalY)。

调整的方法用伪代码表示如下。

index_size_x=(log2N>>1)+(log2N&1);

index_size_y=(log2N>>1);

aligned_size_x=((log2rasterPixelNum)>>1)+((log2rasterPixelNum)&1);

aligned_size_y=(log2rasterPixelNum)>>1;

block_index=0;

finalX=(~((1<<(index_size_x+aligned_size_x))-1))&x;

finalY=(~((1<<(index_size_y+aligned_size_y))-1)) & y;

for(i=0;i<=index_size_x;i++)

block_index|=((((x>>aligned_size_x)>>i)&1)<<(i*2));

for(j=0;j <=index_size_y;j++)

block_index|=((((y>>aligned_size_y)>>j)&1)<<(j*2+1));

pixel_mask=0;

for(n0;n

{

temp_mask=0;

for(m=0;m

{

temp_mask|=((rasterMask>> (m+n))&1);

}

pixel_mask|=(temp_mask<<(n/N));

}

finalMask=pixel_mask<<(block_index*(maskWidth/N));

以Rasterizer到OM的带宽是16bits为例。

从N个sampledown-sample到1个samplemask。把Nbit的samplemask全部用或运算最后得到1bit的pixelmask。再根据pixel左上点坐标对pixelmask进行移位。

调整pixel左上点的坐标,OM RT Samplenum.为1时,16bit的mask是(4,4)对齐的,所以需要将表5-1???中Rasterizersamplenum.等于N对齐的坐标调整成(4, 4)对齐的pixel坐标。

以N=4为例,假设Rasterizer输出的mask是b’0100 1011 0000 1111, pixel 坐标(6,12), Pixel坐标要从(2,2)对齐调整到(4,4)对齐,那么两个坐标分别在低两位与上b'00,调整为(4,12)。mask每4bit调整成1bit,变成b'1101,然后根据坐标确定这个2×2是4×4里的第几个2×2,将mask移位,最后得到b'0000 0000 1101 0000。如图3。

2.3 Up-sample

Rasterizer Sample num.是1,OM RT Samplenum.是N。一笔Rasterizer的输出会被Processmask Unit拆成N笔送进Unitive Unit。

假设Rasterizer输出的mask为rasterMask,pixel左上点坐标是(x,y)。

经过Process mask Unit调整后输出N笔mask分别为finalMask_i,i∈[0,N-1],其宽度均和rasterMask相同,调整后的N笔pixel左上点坐标分别是(finalX_i, finalY_i),i∈[0,N-1]。

调整的方法用下面伪代码来表示。

sample_mask_per_pixel=(1<

aligned_size_x=((log2rasterPixelNum)>>1)+((log2rasterPixelNum)&1);

aligned_size_y=(log2rasterPixelNum)>>1;

x_stride=1<

y_stride=1<

for(i=0;i

{

for(j=0;j

{

if((rasterMask>>(i*N+j))==1)

finalMask_i=sample_mask_per_pixel<<(j*N);

}

x_offset=((i&1)|(((i>>2)&1)<<1));

y_offset=(((i>>1)&1)| (((i>>3)&1)<<1));

finalX_i=x+x_offset*x_stride;

finalY_i=y+y_offset*y_stride;

}

以Rasterizer到OM的带宽是16bits,N=4为例,假设Rasterizer输出的mask是b'0100 1011 0000 1111, pixel 坐标(24,12).这一笔数据会被拆分成4笔数据送进Unitive Uint,如图4所示。

2.4 Processcolor Unit

Process color Unit需要根据PS sample mode和OM RT samplemode将PS 输出的color进行复制,匹配Unitive Unitdataentry的输入。综合表1、表2、表3,只需要对VRS的color进行展开,将PS 输出的coarse pixel的color转成pixel的color。

PS是1/2samplemode,一个color复制成两份转成1samplemode。

PS是1/4samplemode,一个color复制成四份转成1samplemode。

PS是1/8samplemode,一个color复制成八份转成1samplemode。

PS是1/16samplemode,一个color复制成十六份转成1samplemode。

经过上述的转化Unitive Unit会认为PS 是MSAA 的Pixel frequency,然后进行相应的处理。设计的时候也可以根据Unitive Unit的具体实现将color复制更多份(和OM RT sample mode相对应),使Unitive Unit认为PS是MSAA的Samplec frequency。

3 结语:算法优点

对于已经支持MSAA 特性的GPU,如果想升级支持D3D11.3的TIR和D3D12的VRS,在OM模块部分不需要设计全新的逻辑,可以对这两种新的特性进行巧妙的转化,然后共用MSAA的逻辑处理单元。这样既省去了复杂的逻辑设计和验证,也节省了gatecount。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 光栅
    +关注

    关注

    0

    文章

    237

    浏览量

    27162
  • gpu
    gpu
    +关注

    关注

    27

    文章

    4410

    浏览量

    126635
  • 图像
    +关注

    关注

    2

    文章

    1063

    浏览量

    40035

原文标题:一种同时解决目标独立光栅化和可变频率的像素着色器的通用实现方法

文章出处:【微信号:appic-cn,微信公众号:集成电路应用杂志】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    鸿蒙原生应用元服务开发-WebGL网页图形库开发概述

    涉及到图片光栅。 顶点着色器:最基本的任务是接收三维空间中点的坐标,将其处理为二维空间中的坐标并输出。 片元着色器:最基本的任务是对需要处理的屏幕上的每个
    发表于 03-08 14:24

    鸿蒙开发【WebGL】简单了解

    。 顶点着色器:最基本的任务是接收三维空间中点的坐标,将其处理为二维空间中的坐标并输出。 片元着色器:最基本的任务是对需要处理的屏幕上的每个像素输出
    发表于 02-25 21:56

    abb变频频率设置方法 abb变频器故障诊断与维修

    ABB变频器作为一种常见的工业控制装置,广泛应用于电机驱动领域。准确地设置变频器的频率是保证设备正常运行的重要环节,同时,对于
    的头像 发表于 02-18 15:43 933次阅读

    一种脉冲信号载波频率同步环及FPGA实现

    估计法(Kay法)比较具有代表性,它在高信噪比条件下可达到Cramer-Rao界(CRB),并且运算量不大,适于硬件实现。本文以Kay频率估计法为基础构建了一种适用于脉冲信号的载波频率
    发表于 09-20 08:28

    N32903的ADC模块以一种时钟频率初始后,能切换成另外一种时钟频率吗?

    N32903的ADC模块以一种时钟频率初始后,能切换成另外一种时钟频率吗? 最近有个应用:
    发表于 09-01 06:56

    如何使用马里脱机编译来分析着色器程序的性能

    本指南介绍如何使用马里脱机编译来分析着色器程序的性能。 此示例演示了如何可视马里GPU目标上的性能瓶颈
    发表于 08-28 07:11

    Mali和OpenGL ES3.0 指南

    更新的着色语言-GLSL ES 3.0更新的顶点着色使用变换反馈模式许多新对象类型着色器均匀缓冲区顶点数组对象采样对象同步对象像素缓冲区对
    发表于 08-25 07:10

    Mali-G510性能计数1.2参考指南

    马里GPU上运行的工作负载由命令流前端(CSF)协调。 前端将驱动程序提交的命令流调度到三个硬件工作队列,称为迭代。迭代程序将处理任务分派到着色器核心和平铺单元。 有三个迭代
    发表于 08-11 07:02

    Mali-G610性能计数1.2参考指南

    马里GPU上运行的工作负载由命令流前端(CSF)协调。 前端将驱动程序提交的命令流调度到三个硬件工作队列,称为迭代。迭代程序将处理任务分派到着色器核心和平铺单元。 有三个迭代
    发表于 08-11 06:55

    Bifrost GPU可编程核心的顶级布局、优势和着色器核心功能

    本指南介绍了典型的马里Bifrost GPU可编程核心(第三代马里GPU)的顶级布局、优势和着色器核心功能。Bifrost家族包括Mali-G30、Mali-G50和Mali-G70系列产品。 在
    发表于 08-02 17:52

    如何将Unity着色器移植到通用渲染管道

    介绍如何将为内置管道编写的Unity着色器移植到URP。本指南还介绍了如何将自定义着色器移植到URP。这是因为这些着色器无法自动移植到URP。在指南的末尾,您将:•熟悉URP•了解如何将着色器
    发表于 08-02 13:39

    Unity中的高级图形技术解读

    本指南向您介绍Unity中的些高级图形概念。您将需要使用自定义着色器,本指南将带您了解这些着色器,并向您介绍些其他移动概念和工具。 在本指南的最后,您将了解到: •如何
    发表于 08-02 07:44

    实时3D艺术最佳实践-材料和着色器用户指南

    引擎的最佳实践 处理这两情况时的做法。 •材质和着色器对游戏性能的贡献 •如何在不同的透明度实施之间进行选择 •纹理打包和轮廓等功能如何帮助优化性能
    发表于 08-02 06:11

    N32903的ADC模块以一种时钟频率初始后,能切换成另外一种时钟频率吗?

    N32903的ADC模块以一种时钟频率初始后,能切换成另外一种时钟频率吗? 最近有个应用:
    发表于 06-13 08:50

    基于ArkUI框架开发——图片模糊处理的实现

    的最终颜色,并对每个fragment运行次。fragment是单颜色的小矩形区域,类似于计算机屏幕上的像素,简单的说,就是将顶点着色器形成的点、线或者三角形区域,添加颜色。 片元
    发表于 05-05 14:53