Vulkan Cookbook 第八章 6 指定管线视口和裁剪测试状态

指定管线视口和裁剪测试状态

译者注:示例代码点击此处

在屏幕上绘制对象需要我们指定屏幕参数。 创建交换链是不够的 - 我们并不总是需要绘制到整个可用的图像区域。 在某些情况下,我们只想在整个图像中绘制较小的图像,例如汽车后视镜中的反射或分屏多人游戏中的一半图像。 我们通过管线视口和裁剪测试状态定义要绘制的图像区域。

 做好准备

 

怎么做...

1.如果要对多个视口执行渲染,请创建启用了multiViewport功能的逻辑设备。
2.创建一个名为viewports的std::vector<VkViewport>类型变量。 为要进行渲染的每个视口添加一个新元素。 使用以下值初始化其成员:
    ·x为渲染区域左侧的位置(以像素为单位)
    ·y为渲染区域顶部的位置(以像素为单位)
    ·width为渲染区域的宽度(以像素为单位)
    ·height为渲染区域的高度 (以像素为单位)
    ·minDepth为视口最小深度的值介于0.0和1.0之间
    ·maxDepth为视口最大深度的值介于0.0和1.0之间
3.创建一个名为scissors的std::vector<VkRect2D>类型的变量。 为每个将进行渲染的视口添加一个新元素(scissors矢量必须与viewports矢量具有相同数量的元素)。 使用以下值初始化其成员:
    ·offset为x和y成员的裁剪矩形左上角的位置
    ·extent构建的宽度和高度。
 4.viewport_state_create_info为VkPipelineViewportStateCreateInfo类型的变量。 使用以下值初始化其成员:
        ·sType为VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO
        ·pNext为nullptr
        ·flags为0
        ·viewportCount为视口矢量中的元素数
        ·pViewports为向视口矢量的第一个元素的指针
        ·scissorCount为scissors向量元素数
        ·pScissors为指向scissors向量第一个元素的指针

这个怎么运作...

顶点位置(通常在顶点着色器内)从局部空间转换为裁剪空间。 然后硬件执行透视分割,生成标准化的设备坐标。 接下来,组装和栅格化多边形 - 此过程生成片段。 每个片段都有自己的位置,在framebuffer的坐标中定义。 此外,要正确计算此位置,还需要视口转换。 此转换的参数在视口状态中指定。

提示:视口和裁剪测试状态是可选的,虽然常用,但当禁用光栅化时,我们不需要提供它。

通过视口状态,我们在帧缓冲区的坐标(屏幕上的像素)中定义渲染区域的左上角和宽度和高度。 我们还定义了最小和最大视口深度值(浮点值介于0.0和1.0之间,包括0.0和1.0)。 指定最大深度的值小于最小深度的值是有效的。

裁剪测试允许我们另外将生成的片段裁剪到裁剪参数中指定的矩形。 当我们不想裁剪片段时,需要指定一个等于视口大小的区域。

提示:在Vulkan中,裁剪测试始终启用。

视口和裁剪测试的参数集必须相等。 这就是为什么定义一个自定义类型可能更好,我们可以用它来保持两个属性的元素数量相等。 以下是通过自定义ViewportInfo类型的变量指定一个视口和一个裁剪测试的参数的示例代码:

ViewportInfo viewport_infos = { 
  { 
    { 
      0.0f, 
      0.0f, 
      512.0f, 
      512.0f, 
      0.0f, 
      1.0f 
    }, 
  }, 
  { 
    { 
      { 
        0, 
        0 
      }, 
      { 
        512, 
        512 
      } 
    } 
  } 
};

前面的变量可用于创建本节定义的视口和裁剪测试。 实现可能如下所示:

uint32_t viewport_count = static_cast<uint32_t>(viewport_infos.Viewports.size()); 
uint32_t scissor_count = static_cast<uint32_t>(viewport_infos.Scissors.size()); 
viewport_state_create_info = { 
  VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, 
  nullptr, 
  0, 
  viewport_count, 
  viewport_infos.Viewports.data(), 
  scissor_count, 
  viewport_infos.Scissors.data() 
};

如果我们想要更改一些视口或裁剪测试参数,需要重新创建一个管线。 但是在管道创建期间,我们可以指定视口和裁剪测试参数是动态的。 这样,我们不需要重新创建管线来更改这些参数 - 我们在命令缓冲区记录期间指定它们。 但我们需要记住,在管线创建过程中始终要指定视口(和裁剪测试)的数量。 我们以后不能改变它。

提示:可以将视口和裁剪测试定义为动态状态,并在命令缓冲区记录期间指定其参数。 在创建图形管线期间始终指定视口(和剪刀测试)的数量。

除非为逻辑设备启用了multiViewport功能,否则我们也无法提供多个视口和裁剪测试。 可以仅在几何着色器内更改将用于栅格化的视口变换的索引。

提示:更改用于栅格化的视口变换的索引需要我们使用几何着色器。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值