1. 程式人生 > >Vulkan Cookbook 第五章 1 建立取樣器

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>;