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