Vulkan Cookbook 第五章 1 创建采样器

创建采样器

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

采样器定义一组参数,用于控制在着色器(采样)内如何加载图像数据。这些参数包括地址计算(即包装或重复),过滤(线性或最近)或使用mipmap。要在着色器中使用采样器,我们首先需要创建它们。

怎么做...

1.获取逻辑设备的句柄并将其存储在名为logical_device的VkDevice类型的变量中。
2.创建名为sampler_create_info的VkSamplerCreateInfo类型的变量并为其成员使用以下值:
    ·sType为VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO
    ·pNext为nullptr
    ·flags为0
    ·magFilter和minFilter为所需的放大和缩小过滤模式(VK_FILTER_NEAREST或VK_FILTER_LINEAR)
    ·mipmapMode为所选的mipmap过滤模式(VK_SAMPLER_MIPMAP_MODE_NEAREST或VK_SAMPLER_MIPMAP_MODE_LINEAR)
    ·addressModeU、addressModeV、addressModeW为用于图像U、V和W选择的图像寻址模式在0.0~1.0范围外(VK_SAMPLER_ADDRESS_MODE_REPEAT, VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGEVK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, orVK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE) 
     ·mipLodBias为要添加到mipmap级别的详细计算中的所需值
     ·anisotropyEnable如果启用各向异性过滤,则为ture值,否则为false
     ·maxAnisotropy为各向异性的最大值
     ·compareEnable如果在图像查找期间应启用与参考值的比较,则为ture值,否则为false
     ·compareOp为应用于所取数据的所选比较函数(VK_COMPARE_OP_NEVER, VK_COMPARE_OP_LESS, VK_COMPARE_OP_EQUAL, VK_COMPARE_OP_LESS_OR_EQUAL, VK_COMPARE_OP_GREATER, VK_COMPARE_OP_NOT_EQUAL, VK_COMPARE_OP_GREATER_OR_EQUAL, or VK_COMPARE_OP_ALWAYS)
     ·minLod和maxLod为用于限制计算图像的细节级别(mipmap编号)的最大值和最小值
    ·borderColor为一个预定义的边框颜色值(VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, VK_BORDER_COLOR_INT_TRANSPARENT_BLACK, VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK, VK_BORDER_COLOR_INT_OPAQUE_BLACK, VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE, 或VK_BORDER_COLOR_INT_OPAQUE_WHITE)
     ·unnormalizedCoordinates如果寻址应该使用图像的尺寸执行为true止,否则如果寻址应该使用归一化坐标(在0.0-1.0范围内)则执行false
3.创建一个名为sampler的VkSampler类型变量,创建的采样器将存储在该变量中。
4.调用vkCreateSampler( logical_device, &sampler_create_info, nullptr, &sampler )并提供logical_device、指向sampler_create_info变量的指针、nullptr值和指向sampler的指针。
5.通过检查返回值是否等于VK_SUCCESS,确保调用成功。

这个怎么运作...

采样器控制图像在着色器中的读取方式。它们可以单独使用或与采样图像组合使用。

提示:采样器用于VK_DESCRIPTOR_TYPE_SAMPLER描述符类型。

使用VkSamplerCreateInfo类型的变量指定采样参数,如下所示:

VkSamplerCreateInfo sampler_create_info = { 
  VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, 
  nullptr, 
  0, 
  mag_filter, 
  min_filter, 
  mipmap_mode, 
  u_address_mode, 
  v_address_mode, 
  w_address_mode, 
  lod_bias, 
  anisotropy_enable, 
  max_anisotropy, 
  compare_enable, 
  compare_operator, 
  min_lod, 
  max_lod, 
  border_color, 
  unnormalized_coords 
};

然后将该变量提供给创建采样器的函数:

VkResult result = vkCreateSampler( logical_device, &sampler_create_info, nullptr, &sampler ); 
if( VK_SUCCESS != result ) { 
  std::cout << "Could not create sampler."
  return false; 
} 
return true;

提示:为了在着色器中指定采样器,我们需要创建一个带有sampler关键字的uniform变量。

使用可以生成SPIR-V组建的采样器的GLSL代码的示例可以看起来像这样:

layout (set=m, binding=n) uniform sampler <variable name>;

猜你喜欢

转载自blog.csdn.net/qq_19473837/article/details/85087229