Metal 框架之渲染到多个视口

20 篇文章 0 订阅
19 篇文章 0 订阅

 

概述

视口定义了渲染目标的一部分,绘图命令会渲染到该区域内。使用视口选择,可以为绘图命令提供多个视口,并且可以为绘图命令渲染的每个图元动态选择其中的一个视口。通过视口选择,使用更少的绘图命令,可以更轻松地将渲染合并到多个视口中。例如,

渲染立体图像或者渲染其他图像的内容到渲染目标的多个部分试时,可以使用视口选择。

多视口.png

检查设备对象是否支持多个视口

macOS 系列中的所有 GPU 都支持多个视口。从系列 5 开始,Apple GPU 系列提供多个视口的支持。如下代码测试设备支持情况:

``` - (Boolean) supportsMultipleViewports {     return [device supportsFamily: MTLGPUFamilyMac1 ] ||            [device supportsFamily: MTLGPUFamilyApple5 ]; }

```

有关每个 GPU 系列可以使用的最大视口数,请参阅使用 《 Metal 功能特性集合表 》

选择视口

要指定图元应渲染到哪个视口,需要添加具有 [[viewportarrayindex]] 属性的顶点输出。顶点着色器必须设置此值,以便 Metal 知道要渲染到哪个视口。

下面的示例使用实例化渲染将图元渲染到多个视口中。需要在顶点输出中添加 viewPort 以指定目标切片。目标视口(被当做每个实例属性的一部分)作为输入,并被复制到顶点输出中。

```

typedef struct {     ...     uint   viewport [[viewportarrayindex]]; } ColorInOut;

vertex ColorInOut vertexTransform (     const Vertex in [[ stagein ]],     const uint   instanceId                       [[ instanceid ]],     const device InstanceParams* instanceParams   [[ buffer ]], {     ColorInOut out;     out.viewport = instanceParams[instanceId].viewport;     ... }

```

顶点函数必须为构成任何给定图元的所有顶点返回相同的索引。

光栅化阶段使用选定的视口和相关的裁剪矩形来转换顶点输出,然后将数据传递到片段阶段。通过查找顶点输出中设置的相同字段值,可以知道片段着色器所渲染的视口。

在绘图命令中指定视口和裁剪矩形

调用 setViewports:count: 指定多个视口,调用 setScissorRects:count: 指定裁剪矩形:

[renderEncoder setViewports:viewPortsArray count:4]; [renderEncoder setScissorRects:scissorRectsArray count:4];

需要指定相同数量的裁剪矩形和视口。编码渲染指令的代码与着色器中的代码相配合使用,以便着色器生成的索引在提供的值范围内。

总结

本文介绍了使用 Metal 渲染到多个视口的步骤,首先使用视口选择为顶点着色器中的每个图元选择一个视口,其次在绘图命令中指定相同数量的视口和裁剪矩形。

   公众号:audio_video_render 会持续更新一些干货资源,欢迎大家关注。有想了解的技术也可以给我留言,我会尽量帮你解决。​​​​​​​

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值